| OLD | NEW |
| 1 # Copyright (C) 2010, 2012 Google Inc. All rights reserved. | 1 # Copyright (C) 2010, 2012 Google Inc. All rights reserved. |
| 2 # | 2 # |
| 3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
| 4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
| 5 # met: | 5 # met: |
| 6 # | 6 # |
| 7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
| 8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
| 9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
| 10 # copyright notice, this list of conditions and the following disclaimer | 10 # copyright notice, this list of conditions and the following disclaimer |
| 11 # in the documentation and/or other materials provided with the | 11 # in the documentation and/or other materials provided with the |
| 12 # distribution. | 12 # distribution. |
| 13 # * Neither the name of Google Inc. nor the names of its | 13 # * Neither the name of Google Inc. nor the names of its |
| 14 # contributors may be used to endorse or promote products derived from | 14 # contributors may be used to endorse or promote products derived from |
| 15 # this software without specific prior written permission. | 15 # this software without specific prior written permission. |
| 16 # | 16 # |
| 17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| 18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| 19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| 20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| 21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 28 | |
| 29 """Package that handles non-debug, non-file output for run-webkit-tests.""" | 28 """Package that handles non-debug, non-file output for run-webkit-tests.""" |
| 30 | 29 |
| 31 import math | 30 import math |
| 32 import optparse | 31 import optparse |
| 33 | 32 |
| 34 from webkitpy.tool import grammar | 33 from webkitpy.tool import grammar |
| 35 from webkitpy.layout_tests.models import test_expectations | 34 from webkitpy.layout_tests.models import test_expectations |
| 36 from webkitpy.layout_tests.models.test_expectations import TestExpectations, Tes
tExpectationParser | 35 from webkitpy.layout_tests.models.test_expectations import TestExpectations, Tes
tExpectationParser |
| 37 from webkitpy.layout_tests.views.metered_stream import MeteredStream | 36 from webkitpy.layout_tests.views.metered_stream import MeteredStream |
| 38 | 37 |
| 39 | |
| 40 NUM_SLOW_TESTS_TO_LOG = 10 | 38 NUM_SLOW_TESTS_TO_LOG = 10 |
| 41 | 39 |
| 42 | 40 |
| 43 def print_options(): | 41 def print_options(): |
| 44 return [ | 42 return [ |
| 45 optparse.make_option('--debug-rwt-logging', action='store_true', default
=False, | 43 optparse.make_option('--debug-rwt-logging', |
| 44 action='store_true', |
| 45 default=False, |
| 46 help='print timestamps and debug information for ru
n-webkit-tests itself'), | 46 help='print timestamps and debug information for ru
n-webkit-tests itself'), |
| 47 optparse.make_option('--details', action='store_true', default=False, | 47 optparse.make_option('--details', |
| 48 action='store_true', |
| 49 default=False, |
| 48 help='print detailed results for every test'), | 50 help='print detailed results for every test'), |
| 49 optparse.make_option('-q', '--quiet', action='store_true', default=False
, | 51 optparse.make_option('-q', |
| 52 '--quiet', |
| 53 action='store_true', |
| 54 default=False, |
| 50 help='run quietly (errors, warnings, and progress o
nly)'), | 55 help='run quietly (errors, warnings, and progress o
nly)'), |
| 51 optparse.make_option('--timing', action='store_true', default=False, | 56 optparse.make_option('--timing', |
| 57 action='store_true', |
| 58 default=False, |
| 52 help='display test times (summary plus per-test w/
--verbose)'), | 59 help='display test times (summary plus per-test w/
--verbose)'), |
| 53 optparse.make_option('-v', '--verbose', action='store_true', default=Fal
se, | 60 optparse.make_option('-v', |
| 61 '--verbose', |
| 62 action='store_true', |
| 63 default=False, |
| 54 help='print a summarized result for every test (one
line per test)'), | 64 help='print a summarized result for every test (one
line per test)'), |
| 55 ] | 65 ] |
| 56 | 66 |
| 57 | 67 |
| 58 class Printer(object): | 68 class Printer(object): |
| 59 """Class handling all non-debug-logging printing done by run-webkit-tests.""
" | 69 """Class handling all non-debug-logging printing done by run-webkit-tests.""
" |
| 60 | 70 |
| 61 def __init__(self, port, options, regular_output, logger=None): | 71 def __init__(self, port, options, regular_output, logger=None): |
| 62 self.num_completed = 0 | 72 self.num_completed = 0 |
| 63 self.num_tests = 0 | 73 self.num_tests = 0 |
| 64 self._port = port | 74 self._port = port |
| 65 self._options = options | 75 self._options = options |
| 66 self._meter = MeteredStream(regular_output, options.debug_rwt_logging, l
ogger=logger, | 76 self._meter = MeteredStream(regular_output, |
| 77 options.debug_rwt_logging, |
| 78 logger=logger, |
| 67 number_of_columns=self._port.host.platform.t
erminal_width()) | 79 number_of_columns=self._port.host.platform.t
erminal_width()) |
| 68 self._running_tests = [] | 80 self._running_tests = [] |
| 69 self._completed_tests = [] | 81 self._completed_tests = [] |
| 70 | 82 |
| 71 def cleanup(self): | 83 def cleanup(self): |
| 72 self._meter.cleanup() | 84 self._meter.cleanup() |
| 73 | 85 |
| 74 def __del__(self): | 86 def __del__(self): |
| 75 self.cleanup() | 87 self.cleanup() |
| 76 | 88 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 88 fallback_path = [fs.split(x)[1] for x in self._port.baseline_search_path
()] | 100 fallback_path = [fs.split(x)[1] for x in self._port.baseline_search_path
()] |
| 89 self._print_default("Baseline search path: %s -> generic" % " -> ".join(
fallback_path)) | 101 self._print_default("Baseline search path: %s -> generic" % " -> ".join(
fallback_path)) |
| 90 | 102 |
| 91 self._print_default("Using %s build" % self._options.configuration) | 103 self._print_default("Using %s build" % self._options.configuration) |
| 92 if self._options.pixel_tests: | 104 if self._options.pixel_tests: |
| 93 self._print_default("Pixel tests enabled") | 105 self._print_default("Pixel tests enabled") |
| 94 else: | 106 else: |
| 95 self._print_default("Pixel tests disabled") | 107 self._print_default("Pixel tests disabled") |
| 96 | 108 |
| 97 self._print_default("Regular timeout: %s, slow test timeout: %s" % | 109 self._print_default("Regular timeout: %s, slow test timeout: %s" % |
| 98 (self._options.time_out_ms, self._options.slow_time_out_ms)) | 110 (self._options.time_out_ms, self._options.slow_time_
out_ms)) |
| 99 | 111 |
| 100 self._print_default('Command line: ' + ' '.join(self._port.driver_cmd_li
ne())) | 112 self._print_default('Command line: ' + ' '.join(self._port.driver_cmd_li
ne())) |
| 101 self._print_default('') | 113 self._print_default('') |
| 102 | 114 |
| 103 def print_found(self, num_all_test_files, num_to_run, repeat_each, iteration
s): | 115 def print_found(self, num_all_test_files, num_to_run, repeat_each, iteration
s): |
| 104 found_str = 'Found %s; running %d' % (grammar.pluralize('test', num_all_
test_files), num_to_run) | 116 found_str = 'Found %s; running %d' % (grammar.pluralize('test', num_all_
test_files), num_to_run) |
| 105 if repeat_each * iterations > 1: | 117 if repeat_each * iterations > 1: |
| 106 found_str += ' (%d times each: --repeat-each=%d --iterations=%d)' %
(repeat_each * iterations, repeat_each, iterations) | 118 found_str += ' (%d times each: --repeat-each=%d --iterations=%d)' %
(repeat_each * iterations, repeat_each, iterations) |
| 107 found_str += ', skipping %d' % (num_all_test_files - num_to_run) | 119 found_str += ', skipping %d' % (num_all_test_files - num_to_run) |
| 108 self._print_default(found_str + '.') | 120 self._print_default(found_str + '.') |
| (...skipping 14 matching lines...) Expand all Loading... |
| 123 self._print_debug("(%d shards; %d locked)." % (num_shards, num_locke
d_shards)) | 135 self._print_debug("(%d shards; %d locked)." % (num_shards, num_locke
d_shards)) |
| 124 self._print_default('') | 136 self._print_default('') |
| 125 | 137 |
| 126 def _print_expected_results_of_type(self, run_results, result_type, result_t
ype_str, tests_with_result_type_callback): | 138 def _print_expected_results_of_type(self, run_results, result_type, result_t
ype_str, tests_with_result_type_callback): |
| 127 tests = tests_with_result_type_callback(result_type) | 139 tests = tests_with_result_type_callback(result_type) |
| 128 now = run_results.tests_by_timeline[test_expectations.NOW] | 140 now = run_results.tests_by_timeline[test_expectations.NOW] |
| 129 wontfix = run_results.tests_by_timeline[test_expectations.WONTFIX] | 141 wontfix = run_results.tests_by_timeline[test_expectations.WONTFIX] |
| 130 | 142 |
| 131 # We use a fancy format string in order to print the data out in a | 143 # We use a fancy format string in order to print the data out in a |
| 132 # nicely-aligned table. | 144 # nicely-aligned table. |
| 133 fmtstr = ("Expect: %%5d %%-8s (%%%dd now, %%%dd wontfix)" | 145 fmtstr = ("Expect: %%5d %%-8s (%%%dd now, %%%dd wontfix)" % (self._num_d
igits(now), self._num_digits(wontfix))) |
| 134 % (self._num_digits(now), self._num_digits(wontfix))) | |
| 135 self._print_debug(fmtstr % (len(tests), result_type_str, len(tests & now
), len(tests & wontfix))) | 146 self._print_debug(fmtstr % (len(tests), result_type_str, len(tests & now
), len(tests & wontfix))) |
| 136 | 147 |
| 137 def _num_digits(self, num): | 148 def _num_digits(self, num): |
| 138 ndigits = 1 | 149 ndigits = 1 |
| 139 if len(num): | 150 if len(num): |
| 140 ndigits = int(math.log10(len(num))) + 1 | 151 ndigits = int(math.log10(len(num))) + 1 |
| 141 return ndigits | 152 return ndigits |
| 142 | 153 |
| 143 def print_results(self, run_time, run_results, summarized_results): | 154 def print_results(self, run_time, run_results, summarized_results): |
| 144 self._print_timing_statistics(run_time, run_results) | 155 self._print_timing_statistics(run_time, run_results) |
| (...skipping 13 matching lines...) Expand all Loading... |
| 158 self._print_debug("Thread timing:") | 169 self._print_debug("Thread timing:") |
| 159 stats = {} | 170 stats = {} |
| 160 cuml_time = 0 | 171 cuml_time = 0 |
| 161 for result in run_results.results_by_name.values(): | 172 for result in run_results.results_by_name.values(): |
| 162 stats.setdefault(result.worker_name, {'num_tests': 0, 'total_time':
0}) | 173 stats.setdefault(result.worker_name, {'num_tests': 0, 'total_time':
0}) |
| 163 stats[result.worker_name]['num_tests'] += 1 | 174 stats[result.worker_name]['num_tests'] += 1 |
| 164 stats[result.worker_name]['total_time'] += result.total_run_time | 175 stats[result.worker_name]['total_time'] += result.total_run_time |
| 165 cuml_time += result.total_run_time | 176 cuml_time += result.total_run_time |
| 166 | 177 |
| 167 for worker_name in stats: | 178 for worker_name in stats: |
| 168 self._print_debug(" %10s: %5d tests, %6.2f secs" % (worker_name,
stats[worker_name]['num_tests'], stats[worker_name]['total_time'])) | 179 self._print_debug(" %10s: %5d tests, %6.2f secs" % (worker_name,
stats[ |
| 180 worker_name]['num_tests'], stats[worker_name]['total_time'])) |
| 169 self._print_debug(" %6.2f cumulative, %6.2f optimal" % (cuml_time, cum
l_time / num_workers)) | 181 self._print_debug(" %6.2f cumulative, %6.2f optimal" % (cuml_time, cum
l_time / num_workers)) |
| 170 self._print_debug("") | 182 self._print_debug("") |
| 171 | 183 |
| 172 def _print_aggregate_test_statistics(self, run_results): | 184 def _print_aggregate_test_statistics(self, run_results): |
| 173 times_for_dump_render_tree = [result.test_run_time for result in run_res
ults.results_by_name.values()] | 185 times_for_dump_render_tree = [result.test_run_time for result in run_res
ults.results_by_name.values()] |
| 174 self._print_statistics_for_test_timings("PER TEST TIME IN TESTSHELL (sec
onds):", times_for_dump_render_tree) | 186 self._print_statistics_for_test_timings("PER TEST TIME IN TESTSHELL (sec
onds):", times_for_dump_render_tree) |
| 175 | 187 |
| 176 def _print_individual_test_times(self, run_results): | 188 def _print_individual_test_times(self, run_results): |
| 177 # Reverse-sort by the time spent in the driver. | 189 # Reverse-sort by the time spent in the driver. |
| 178 | 190 |
| 179 individual_test_timings = sorted(run_results.results_by_name.values(), k
ey=lambda result: result.test_run_time, reverse=True) | 191 individual_test_timings = sorted(run_results.results_by_name.values(), |
| 192 key=lambda result: result.test_run_time
, |
| 193 reverse=True) |
| 180 num_printed = 0 | 194 num_printed = 0 |
| 181 slow_tests = [] | 195 slow_tests = [] |
| 182 timeout_or_crash_tests = [] | 196 timeout_or_crash_tests = [] |
| 183 unexpected_slow_tests = [] | 197 unexpected_slow_tests = [] |
| 184 for test_tuple in individual_test_timings: | 198 for test_tuple in individual_test_timings: |
| 185 test_name = test_tuple.test_name | 199 test_name = test_tuple.test_name |
| 186 is_timeout_crash_or_slow = False | 200 is_timeout_crash_or_slow = False |
| 187 if test_name in run_results.slow_tests: | 201 if test_name in run_results.slow_tests: |
| 188 is_timeout_crash_or_slow = True | 202 is_timeout_crash_or_slow = True |
| 189 slow_tests.append(test_tuple) | 203 slow_tests.append(test_tuple) |
| 190 | 204 |
| 191 if test_name in run_results.failures_by_name: | 205 if test_name in run_results.failures_by_name: |
| 192 result = run_results.results_by_name[test_name].type | 206 result = run_results.results_by_name[test_name].type |
| 193 if (result == test_expectations.TIMEOUT or | 207 if (result == test_expectations.TIMEOUT or result == test_expect
ations.CRASH): |
| 194 result == test_expectations.CRASH): | |
| 195 is_timeout_crash_or_slow = True | 208 is_timeout_crash_or_slow = True |
| 196 timeout_or_crash_tests.append(test_tuple) | 209 timeout_or_crash_tests.append(test_tuple) |
| 197 | 210 |
| 198 if (not is_timeout_crash_or_slow and num_printed < NUM_SLOW_TESTS_TO
_LOG): | 211 if (not is_timeout_crash_or_slow and num_printed < NUM_SLOW_TESTS_TO
_LOG): |
| 199 num_printed = num_printed + 1 | 212 num_printed = num_printed + 1 |
| 200 unexpected_slow_tests.append(test_tuple) | 213 unexpected_slow_tests.append(test_tuple) |
| 201 | 214 |
| 202 self._print_debug("") | 215 self._print_debug("") |
| 203 if unexpected_slow_tests: | 216 if unexpected_slow_tests: |
| 204 self._print_test_list_timing("%s slowest tests that are not marked a
s SLOW and did not timeout/crash:" % | 217 self._print_test_list_timing("%s slowest tests that are not marked a
s SLOW and did not timeout/crash:" % |
| 205 NUM_SLOW_TESTS_TO_LOG, unexpected_slow_tests) | 218 NUM_SLOW_TESTS_TO_LOG, unexpected_slow_
tests) |
| 206 self._print_debug("") | 219 self._print_debug("") |
| 207 | 220 |
| 208 if slow_tests: | 221 if slow_tests: |
| 209 self._print_test_list_timing("Tests marked as SLOW:", slow_tests) | 222 self._print_test_list_timing("Tests marked as SLOW:", slow_tests) |
| 210 self._print_debug("") | 223 self._print_debug("") |
| 211 | 224 |
| 212 if timeout_or_crash_tests: | 225 if timeout_or_crash_tests: |
| 213 self._print_test_list_timing("Tests that timed out or crashed:", tim
eout_or_crash_tests) | 226 self._print_test_list_timing("Tests that timed out or crashed:", tim
eout_or_crash_tests) |
| 214 self._print_debug("") | 227 self._print_debug("") |
| 215 | 228 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 incomplete_str = '' | 308 incomplete_str = '' |
| 296 if incomplete: | 309 if incomplete: |
| 297 self._print_default("") | 310 self._print_default("") |
| 298 incomplete_str = " (%d didn't run)" % incomplete | 311 incomplete_str = " (%d didn't run)" % incomplete |
| 299 | 312 |
| 300 if self._options.verbose or self._options.debug_rwt_logging or unexpecte
d: | 313 if self._options.verbose or self._options.debug_rwt_logging or unexpecte
d: |
| 301 self.writeln("") | 314 self.writeln("") |
| 302 | 315 |
| 303 expected_summary_str = '' | 316 expected_summary_str = '' |
| 304 if run_results.expected_failures > 0: | 317 if run_results.expected_failures > 0: |
| 305 expected_summary_str = " (%d passed, %d didn't)" % (expected - run_r
esults.expected_failures, run_results.expected_failures) | 318 expected_summary_str = " (%d passed, %d didn't)" % (expected - run_r
esults.expected_failures, |
| 319 run_results.expe
cted_failures) |
| 306 | 320 |
| 307 summary = '' | 321 summary = '' |
| 308 if unexpected == 0: | 322 if unexpected == 0: |
| 309 if expected == total: | 323 if expected == total: |
| 310 if expected > 1: | 324 if expected > 1: |
| 311 summary = "All %d tests ran as expected%s%s." % (expected, e
xpected_summary_str, timing_summary) | 325 summary = "All %d tests ran as expected%s%s." % (expected, e
xpected_summary_str, timing_summary) |
| 312 else: | 326 else: |
| 313 summary = "The test ran as expected%s%s." % (expected_summar
y_str, timing_summary) | 327 summary = "The test ran as expected%s%s." % (expected_summar
y_str, timing_summary) |
| 314 else: | 328 else: |
| 315 summary = "%s ran as expected%s%s%s." % (grammar.pluralize('test
', expected), expected_summary_str, incomplete_str, timing_summary) | 329 summary = "%s ran as expected%s%s%s." % (grammar.pluralize('test
', expected), expected_summary_str, incomplete_str, |
| 330 timing_summary) |
| 316 else: | 331 else: |
| 317 summary = "%s ran as expected%s, %d didn't%s%s:" % (grammar.pluraliz
e('test', expected), expected_summary_str, unexpected, incomplete_str, timing_su
mmary) | 332 summary = "%s ran as expected%s, %d didn't%s%s:" % (grammar.pluraliz
e('test', expected), expected_summary_str, |
| 333 unexpected, inco
mplete_str, timing_summary) |
| 318 | 334 |
| 319 self._print_quiet(summary) | 335 self._print_quiet(summary) |
| 320 self._print_quiet("") | 336 self._print_quiet("") |
| 321 | 337 |
| 322 def _test_status_line(self, test_name, suffix): | 338 def _test_status_line(self, test_name, suffix): |
| 323 format_string = '[%d/%d] %s%s' | 339 format_string = '[%d/%d] %s%s' |
| 324 status_line = format_string % (self.num_completed, self.num_tests, test_
name, suffix) | 340 status_line = format_string % (self.num_completed, self.num_tests, test_
name, suffix) |
| 325 if len(status_line) > self._meter.number_of_columns(): | 341 if len(status_line) > self._meter.number_of_columns(): |
| 326 overflow_columns = len(status_line) - self._meter.number_of_columns(
) | 342 overflow_columns = len(status_line) - self._meter.number_of_columns(
) |
| 327 ellipsis = '...' | 343 ellipsis = '...' |
| (...skipping 16 matching lines...) Expand all Loading... |
| 344 if self._options.verbose: | 360 if self._options.verbose: |
| 345 write = self._meter.write_update | 361 write = self._meter.write_update |
| 346 else: | 362 else: |
| 347 write = self._meter.write_throttled_update | 363 write = self._meter.write_throttled_update |
| 348 write(self._test_status_line(test_name, suffix)) | 364 write(self._test_status_line(test_name, suffix)) |
| 349 | 365 |
| 350 def print_finished_test(self, result, expected, exp_str, got_str): | 366 def print_finished_test(self, result, expected, exp_str, got_str): |
| 351 self.num_completed += 1 | 367 self.num_completed += 1 |
| 352 test_name = result.test_name | 368 test_name = result.test_name |
| 353 | 369 |
| 354 result_message = self._result_message(result.type, result.failures, expe
cted, | 370 result_message = self._result_message(result.type, result.failures, expe
cted, self._options.timing, result.test_run_time) |
| 355 self._options.timing, result.test_
run_time) | |
| 356 | 371 |
| 357 if self._options.details: | 372 if self._options.details: |
| 358 self._print_test_trace(result, exp_str, got_str) | 373 self._print_test_trace(result, exp_str, got_str) |
| 359 elif self._options.verbose or not expected: | 374 elif self._options.verbose or not expected: |
| 360 self.writeln(self._test_status_line(test_name, result_message)) | 375 self.writeln(self._test_status_line(test_name, result_message)) |
| 361 elif self.num_completed == self.num_tests: | 376 elif self.num_completed == self.num_tests: |
| 362 self._meter.write_update('') | 377 self._meter.write_update('') |
| 363 else: | 378 else: |
| 364 if test_name == self._running_tests[0]: | 379 if test_name == self._running_tests[0]: |
| 365 self._completed_tests.insert(0, [test_name, result_message]) | 380 self._completed_tests.insert(0, [test_name, result_message]) |
| (...skipping 24 matching lines...) Expand all Loading... |
| 390 self._print_default(' base: %s' % base) | 405 self._print_default(' base: %s' % base) |
| 391 self._print_default(' args: %s' % args) | 406 self._print_default(' args: %s' % args) |
| 392 self._print_default(' reference_args: %s' % reference_args) | 407 self._print_default(' reference_args: %s' % reference_args) |
| 393 | 408 |
| 394 references = self._port.reference_files(test_name) | 409 references = self._port.reference_files(test_name) |
| 395 if references: | 410 if references: |
| 396 for _, filename in references: | 411 for _, filename in references: |
| 397 self._print_default(' ref: %s' % self._port.relative_test_filen
ame(filename)) | 412 self._print_default(' ref: %s' % self._port.relative_test_filen
ame(filename)) |
| 398 else: | 413 else: |
| 399 for extension in ('.txt', '.png', '.wav'): | 414 for extension in ('.txt', '.png', '.wav'): |
| 400 self._print_baseline(test_name, extension) | 415 self._print_baseline(test_name, extension) |
| 401 | 416 |
| 402 self._print_default(' exp: %s' % exp_str) | 417 self._print_default(' exp: %s' % exp_str) |
| 403 self._print_default(' got: %s' % got_str) | 418 self._print_default(' got: %s' % got_str) |
| 404 self._print_default(' took: %-.3f' % result.test_run_time) | 419 self._print_default(' took: %-.3f' % result.test_run_time) |
| 405 self._print_default('') | 420 self._print_default('') |
| 406 | 421 |
| 407 def _print_baseline(self, test_name, extension): | 422 def _print_baseline(self, test_name, extension): |
| 408 baseline = self._port.expected_filename(test_name, extension) | 423 baseline = self._port.expected_filename(test_name, extension) |
| 409 if self._port._filesystem.exists(baseline): | 424 if self._port._filesystem.exists(baseline): |
| 410 relpath = self._port.relative_test_filename(baseline) | 425 relpath = self._port.relative_test_filename(baseline) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 427 self._meter.write_throttled_update(msg) | 442 self._meter.write_throttled_update(msg) |
| 428 | 443 |
| 429 def write_update(self, msg): | 444 def write_update(self, msg): |
| 430 self._meter.write_update(msg) | 445 self._meter.write_update(msg) |
| 431 | 446 |
| 432 def writeln(self, msg): | 447 def writeln(self, msg): |
| 433 self._meter.writeln(msg) | 448 self._meter.writeln(msg) |
| 434 | 449 |
| 435 def flush(self): | 450 def flush(self): |
| 436 self._meter.flush() | 451 self._meter.flush() |
| OLD | NEW |