Index: Tools/Scripts/webkitpy/test/printer.py |
diff --git a/Tools/Scripts/webkitpy/test/printer.py b/Tools/Scripts/webkitpy/test/printer.py |
deleted file mode 100644 |
index c12cc295a97a26e53b36fb6e15e3d3f850e00d05..0000000000000000000000000000000000000000 |
--- a/Tools/Scripts/webkitpy/test/printer.py |
+++ /dev/null |
@@ -1,212 +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 StringIO |
-import logging |
- |
-from webkitpy.common.system import outputcapture |
-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_completed = 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 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.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: |
- 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_completed += 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_completed, 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_completed, 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_completed, self.num_completed != 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() |