summaryrefslogtreecommitdiffstats
path: root/Tools/Scripts/webkitpy/test/printer.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/Scripts/webkitpy/test/printer.py')
-rw-r--r--Tools/Scripts/webkitpy/test/printer.py214
1 files changed, 0 insertions, 214 deletions
diff --git a/Tools/Scripts/webkitpy/test/printer.py b/Tools/Scripts/webkitpy/test/printer.py
deleted file mode 100644
index b5bea3f9f..000000000
--- a/Tools/Scripts/webkitpy/test/printer.py
+++ /dev/null
@@ -1,214 +0,0 @@
-# Copyright (C) 2012 Google, Inc.
-# Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org)
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
-# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-import logging
-import StringIO
-
-from webkitpy.common.system.systemhost import SystemHost
-from webkitpy.layout_tests.views.metered_stream import MeteredStream
-
-_log = logging.getLogger(__name__)
-
-
-class Printer(object):
- def __init__(self, stream, options=None):
- self.stream = stream
- self.meter = None
- self.options = options
- self.num_tests = 0
- self.num_started = 0
- self.num_errors = 0
- self.num_failures = 0
- self.running_tests = []
- self.completed_tests = []
- if options:
- self.configure(options)
-
- def configure(self, options):
- self.options = options
-
- if options.timing:
- # --timing implies --verbose
- options.verbose = max(options.verbose, 1)
-
- log_level = logging.INFO
- if options.quiet:
- log_level = logging.WARNING
- elif options.verbose == 2:
- log_level = logging.DEBUG
-
- self.meter = MeteredStream(self.stream, (options.verbose == 2),
- number_of_columns=SystemHost().platform.terminal_width())
-
- handler = logging.StreamHandler(self.stream)
- # We constrain the level on the handler rather than on the root
- # logger itself. This is probably better because the handler is
- # configured and known only to this module, whereas the root logger
- # is an object shared (and potentially modified) by many modules.
- # Modifying the handler, then, is less intrusive and less likely to
- # interfere with modifications made by other modules (e.g. in unit
- # tests).
- handler.name = __name__
- handler.setLevel(log_level)
- formatter = logging.Formatter("%(message)s")
- handler.setFormatter(formatter)
-
- logger = logging.getLogger()
- logger.addHandler(handler)
- logger.setLevel(logging.NOTSET)
-
- # Filter out most webkitpy messages.
- #
- # Messages can be selectively re-enabled for this script by updating
- # this method accordingly.
- def filter_records(record):
- """Filter out autoinstall and non-third-party webkitpy messages."""
- # FIXME: Figure out a way not to use strings here, for example by
- # using syntax like webkitpy.test.__name__. We want to be
- # sure not to import any non-Python 2.4 code, though, until
- # after the version-checking code has executed.
- if (record.name.startswith("webkitpy.common.system.autoinstall") or
- record.name.startswith("webkitpy.test")):
- return True
- if record.name.startswith("webkitpy"):
- return False
- return True
-
- testing_filter = logging.Filter()
- testing_filter.filter = filter_records
-
- # Display a message so developers are not mystified as to why
- # logging does not work in the unit tests.
- _log.info("Suppressing most webkitpy logging while running unit tests.")
- handler.addFilter(testing_filter)
-
- if self.options.pass_through:
- # FIXME: Can't import at top of file, as outputcapture needs unittest2
- from webkitpy.common.system import outputcapture
- outputcapture.OutputCapture.stream_wrapper = _CaptureAndPassThroughStream
-
- def write_update(self, msg):
- self.meter.write_update(msg)
-
- def print_started_test(self, source, test_name):
- self.running_tests.append(test_name)
- if len(self.running_tests) > 1:
- suffix = ' (+%d)' % (len(self.running_tests) - 1)
- else:
- suffix = ''
-
- if self.options.verbose:
- write = self.meter.write_update
- else:
- write = self.meter.write_throttled_update
-
- write(self._test_line(self.running_tests[0], suffix))
-
- def print_finished_test(self, source, test_name, test_time, failures, errors):
- write = self.meter.writeln
- if failures:
- lines = failures[0].splitlines() + ['']
- suffix = ' failed:'
- self.num_failures += 1
- elif errors:
- lines = errors[0].splitlines() + ['']
- suffix = ' erred:'
- self.num_errors += 1
- else:
- suffix = ' passed'
- lines = []
- if self.options.verbose:
- write = self.meter.writeln
- else:
- write = self.meter.write_throttled_update
- if self.options.timing:
- suffix += ' %.4fs' % test_time
-
- self.num_started += 1
-
- if test_name == self.running_tests[0]:
- self.completed_tests.insert(0, [test_name, suffix, lines])
- else:
- self.completed_tests.append([test_name, suffix, lines])
- self.running_tests.remove(test_name)
-
- for test_name, msg, lines in self.completed_tests:
- if lines:
- self.meter.writeln(self._test_line(test_name, msg))
- for line in lines:
- self.meter.writeln(' ' + line)
- else:
- write(self._test_line(test_name, msg))
- self.completed_tests = []
-
- def _test_line(self, test_name, suffix):
- format_string = '[%d/%d] %s%s'
- status_line = format_string % (self.num_started, self.num_tests, test_name, suffix)
- if len(status_line) > self.meter.number_of_columns():
- overflow_columns = len(status_line) - self.meter.number_of_columns()
- ellipsis = '...'
- if len(test_name) < overflow_columns + len(ellipsis) + 3:
- # We don't have enough space even if we elide, just show the test method name.
- test_name = test_name.split('.')[-1]
- else:
- new_length = len(test_name) - overflow_columns - len(ellipsis)
- prefix = int(new_length / 2)
- test_name = test_name[:prefix] + ellipsis + test_name[-(new_length - prefix):]
- return format_string % (self.num_started, self.num_tests, test_name, suffix)
-
- def print_result(self, run_time):
- write = self.meter.writeln
- write('Ran %d test%s in %.3fs' % (self.num_started, self.num_started != 1 and "s" or "", run_time))
- if self.num_failures or self.num_errors:
- write('FAILED (failures=%d, errors=%d)\n' % (self.num_failures, self.num_errors))
- else:
- write('\nOK\n')
-
-
-class _CaptureAndPassThroughStream(object):
- def __init__(self, stream):
- self._buffer = StringIO.StringIO()
- self._stream = stream
-
- def write(self, msg):
- self._stream.write(msg)
-
- # Note that we don't want to capture any output generated by the debugger
- # because that could cause the results of capture_output() to be invalid.
- if not self._message_is_from_pdb():
- self._buffer.write(msg)
-
- def _message_is_from_pdb(self):
- # We will assume that if the pdb module is in the stack then the output
- # is being generated by the python debugger (or the user calling something
- # from inside the debugger).
- import inspect
- import pdb
- stack = inspect.stack()
- return any(frame[1] == pdb.__file__.replace('.pyc', '.py') for frame in stack)
-
- def flush(self):
- self._stream.flush()
-
- def getvalue(self):
- return self._buffer.getvalue()