| OLD | NEW |
| 1 # Copyright (C) 2010 Google Inc. All rights reserved. | 1 # Copyright (C) 2010 Google Inc. All rights reserved. |
| 2 # Copyright (C) 2010 Gabor Rapcsanyi (rgabor@inf.u-szeged.hu), University of Sze
ged | 2 # Copyright (C) 2010 Gabor Rapcsanyi (rgabor@inf.u-szeged.hu), University of Sze
ged |
| 3 # Copyright (C) 2011 Apple Inc. All rights reserved. | 3 # Copyright (C) 2011 Apple Inc. All rights reserved. |
| 4 # | 4 # |
| 5 # Redistribution and use in source and binary forms, with or without | 5 # Redistribution and use in source and binary forms, with or without |
| 6 # modification, are permitted provided that the following conditions are | 6 # modification, are permitted provided that the following conditions are |
| 7 # met: | 7 # met: |
| 8 # | 8 # |
| 9 # * Redistributions of source code must retain the above copyright | 9 # * Redistributions of source code must retain the above copyright |
| 10 # notice, this list of conditions and the following disclaimer. | 10 # notice, this list of conditions and the following disclaimer. |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 all_results = [] | 154 all_results = [] |
| 155 if run_details.initial_results: | 155 if run_details.initial_results: |
| 156 all_results.extend(run_details.initial_results.all_results) | 156 all_results.extend(run_details.initial_results.all_results) |
| 157 | 157 |
| 158 if run_details.retry_results: | 158 if run_details.retry_results: |
| 159 all_results.extend(run_details.retry_results.all_results) | 159 all_results.extend(run_details.retry_results.all_results) |
| 160 return all_results | 160 return all_results |
| 161 | 161 |
| 162 | 162 |
| 163 def parse_full_results(full_results_text): | 163 def parse_full_results(full_results_text): |
| 164 json_to_eval = full_results_text.replace("ADD_RESULTS(", "").replace(");", "
") | 164 json_to_eval = full_results_text.replace('ADD_RESULTS(', '').replace(');', '
') |
| 165 compressed_results = json.loads(json_to_eval) | 165 compressed_results = json.loads(json_to_eval) |
| 166 return compressed_results | 166 return compressed_results |
| 167 | 167 |
| 168 | 168 |
| 169 class StreamTestingMixin(object): | 169 class StreamTestingMixin(object): |
| 170 |
| 170 def assertContains(self, stream, string): | 171 def assertContains(self, stream, string): |
| 171 self.assertTrue(string in stream.getvalue()) | 172 self.assertTrue(string in stream.getvalue()) |
| 172 | 173 |
| 173 def assertEmpty(self, stream): | 174 def assertEmpty(self, stream): |
| 174 self.assertFalse(stream.getvalue()) | 175 self.assertFalse(stream.getvalue()) |
| 175 | 176 |
| 176 def assertNotEmpty(self, stream): | 177 def assertNotEmpty(self, stream): |
| 177 self.assertTrue(stream.getvalue()) | 178 self.assertTrue(stream.getvalue()) |
| 178 | 179 |
| 179 | 180 |
| 180 class RunTest(unittest.TestCase, StreamTestingMixin): | 181 class RunTest(unittest.TestCase, StreamTestingMixin): |
| 182 |
| 181 def setUp(self): | 183 def setUp(self): |
| 182 # A real PlatformInfo object is used here instead of a | 184 # A real PlatformInfo object is used here instead of a |
| 183 # MockPlatformInfo because we need to actually check for | 185 # MockPlatformInfo because we need to actually check for |
| 184 # Windows and Mac to skip some tests. | 186 # Windows and Mac to skip some tests. |
| 185 self._platform = SystemHost().platform | 187 self._platform = SystemHost().platform |
| 186 | 188 |
| 187 # FIXME: Remove this when we fix test-webkitpy to work | 189 # FIXME: Remove this when we fix test-webkitpy to work |
| 188 # properly on cygwin (bug 63846). | 190 # properly on cygwin (bug 63846). |
| 189 self.should_test_processes = not self._platform.is_win() | 191 self.should_test_processes = not self._platform.is_win() |
| 190 | 192 |
| 191 def test_basic(self): | 193 def test_basic(self): |
| 192 options, args = parse_args(tests_included=True) | 194 options, args = parse_args(tests_included=True) |
| 193 logging_stream = StringIO.StringIO() | 195 logging_stream = StringIO.StringIO() |
| 194 host = MockHost() | 196 host = MockHost() |
| 195 port_obj = host.port_factory.get(options.platform, options) | 197 port_obj = host.port_factory.get(options.platform, options) |
| 196 details = run_webkit_tests.run(port_obj, options, args, logging_stream) | 198 details = run_webkit_tests.run(port_obj, options, args, logging_stream) |
| 197 | 199 |
| 198 # These numbers will need to be updated whenever we add new tests. | 200 # These numbers will need to be updated whenever we add new tests. |
| 199 self.assertEqual(details.initial_results.total, test.TOTAL_TESTS) | 201 self.assertEqual(details.initial_results.total, test.TOTAL_TESTS) |
| 200 self.assertEqual(details.initial_results.expected_skips, test.TOTAL_SKIP
S) | 202 self.assertEqual(details.initial_results.expected_skips, test.TOTAL_SKIP
S) |
| 201 self.assertEqual(len(details.initial_results.unexpected_results_by_name)
, test.UNEXPECTED_PASSES + test.UNEXPECTED_FAILURES) | 203 self.assertEqual(len(details.initial_results.unexpected_results_by_name)
, test.UNEXPECTED_PASSES + test.UNEXPECTED_FAILURES) |
| 202 self.assertEqual(details.exit_code, test.UNEXPECTED_FAILURES) | 204 self.assertEqual(details.exit_code, test.UNEXPECTED_FAILURES) |
| 203 self.assertEqual(details.retry_results.total, test.UNEXPECTED_FAILURES) | 205 self.assertEqual(details.retry_results.total, test.UNEXPECTED_FAILURES) |
| 204 | 206 |
| 205 expected_tests = details.initial_results.total - details.initial_results
.expected_skips - len(details.initial_results.unexpected_results_by_name) | 207 expected_tests = details.initial_results.total - details.initial_results
.expected_skips - \ |
| 208 len(details.initial_results.unexpected_results_by_name) |
| 206 expected_summary_str = '' | 209 expected_summary_str = '' |
| 207 if details.initial_results.expected_failures > 0: | 210 if details.initial_results.expected_failures > 0: |
| 208 expected_summary_str = " (%d passed, %d didn't)" % (expected_tests -
details.initial_results.expected_failures, details.initial_results.expected_fai
lures) | 211 expected_summary_str = " (%d passed, %d didn't)" % ( |
| 212 expected_tests - details.initial_results.expected_failures, deta
ils.initial_results.expected_failures) |
| 209 one_line_summary = "%d tests ran as expected%s, %d didn't:\n" % ( | 213 one_line_summary = "%d tests ran as expected%s, %d didn't:\n" % ( |
| 210 expected_tests, | 214 expected_tests, |
| 211 expected_summary_str, | 215 expected_summary_str, |
| 212 len(details.initial_results.unexpected_results_by_name)) | 216 len(details.initial_results.unexpected_results_by_name)) |
| 213 self.assertTrue(one_line_summary in logging_stream.buflist) | 217 self.assertTrue(one_line_summary in logging_stream.buflist) |
| 214 | 218 |
| 215 # Ensure the results were summarized properly. | 219 # Ensure the results were summarized properly. |
| 216 self.assertEqual(details.summarized_failing_results['num_regressions'],
details.exit_code) | 220 self.assertEqual(details.summarized_failing_results['num_regressions'],
details.exit_code) |
| 217 | 221 |
| 218 # Ensure the results were written out and displayed. | 222 # Ensure the results were written out and displayed. |
| 219 failing_results_text = host.filesystem.read_text_file('/tmp/layout-test-
results/failing_results.json') | 223 failing_results_text = host.filesystem.read_text_file('/tmp/layout-test-
results/failing_results.json') |
| 220 json_to_eval = failing_results_text.replace("ADD_RESULTS(", "").replace(
");", "") | 224 json_to_eval = failing_results_text.replace('ADD_RESULTS(', '').replace(
');', '') |
| 221 self.assertEqual(json.loads(json_to_eval), details.summarized_failing_re
sults) | 225 self.assertEqual(json.loads(json_to_eval), details.summarized_failing_re
sults) |
| 222 | 226 |
| 223 full_results_text = host.filesystem.read_text_file('/tmp/layout-test-res
ults/full_results.json') | 227 full_results_text = host.filesystem.read_text_file('/tmp/layout-test-res
ults/full_results.json') |
| 224 self.assertEqual(json.loads(full_results_text), details.summarized_full_
results) | 228 self.assertEqual(json.loads(full_results_text), details.summarized_full_
results) |
| 225 | 229 |
| 226 self.assertEqual(host.user.opened_urls, [path.abspath_to_uri(MockHost().
platform, '/tmp/layout-test-results/results.html')]) | 230 self.assertEqual(host.user.opened_urls, [path.abspath_to_uri(MockHost().
platform, '/tmp/layout-test-results/results.html')]) |
| 227 | 231 |
| 228 def test_batch_size(self): | 232 def test_batch_size(self): |
| 229 batch_tests_run = get_test_batches(['--batch-size', '2']) | 233 batch_tests_run = get_test_batches(['--batch-size', '2']) |
| 230 for batch in batch_tests_run: | 234 for batch in batch_tests_run: |
| 231 self.assertTrue(len(batch) <= 2, '%s had too many tests' % ', '.join
(batch)) | 235 self.assertTrue(len(batch) <= 2, '%s had too many tests' % ', '.join
(batch)) |
| 232 | 236 |
| 233 def test_max_locked_shards(self): | 237 def test_max_locked_shards(self): |
| 234 # Tests for the default of using one locked shard even in the case of mo
re than one child process. | 238 # Tests for the default of using one locked shard even in the case of mo
re than one child process. |
| 235 if not self.should_test_processes: | 239 if not self.should_test_processes: |
| 236 return | 240 return |
| 237 save_env_webkit_test_max_locked_shards = None | 241 save_env_webkit_test_max_locked_shards = None |
| 238 if "WEBKIT_TEST_MAX_LOCKED_SHARDS" in os.environ: | 242 if 'WEBKIT_TEST_MAX_LOCKED_SHARDS' in os.environ: |
| 239 save_env_webkit_test_max_locked_shards = os.environ["WEBKIT_TEST_MAX
_LOCKED_SHARDS"] | 243 save_env_webkit_test_max_locked_shards = os.environ['WEBKIT_TEST_MAX
_LOCKED_SHARDS'] |
| 240 del os.environ["WEBKIT_TEST_MAX_LOCKED_SHARDS"] | 244 del os.environ['WEBKIT_TEST_MAX_LOCKED_SHARDS'] |
| 241 _, regular_output, _ = logging_run(['--debug-rwt-logging', '--child-proc
esses', '2'], shared_port=False) | 245 _, regular_output, _ = logging_run(['--debug-rwt-logging', '--child-proc
esses', '2'], shared_port=False) |
| 242 try: | 246 try: |
| 243 self.assertTrue(any(['1 locked' in line for line in regular_output.b
uflist])) | 247 self.assertTrue(any(['1 locked' in line for line in regular_output.b
uflist])) |
| 244 finally: | 248 finally: |
| 245 if save_env_webkit_test_max_locked_shards: | 249 if save_env_webkit_test_max_locked_shards: |
| 246 os.environ["WEBKIT_TEST_MAX_LOCKED_SHARDS"] = save_env_webkit_te
st_max_locked_shards | 250 os.environ['WEBKIT_TEST_MAX_LOCKED_SHARDS'] = save_env_webkit_te
st_max_locked_shards |
| 247 | 251 |
| 248 def test_child_processes_2(self): | 252 def test_child_processes_2(self): |
| 249 if self.should_test_processes: | 253 if self.should_test_processes: |
| 250 _, regular_output, _ = logging_run( | 254 _, regular_output, _ = logging_run( |
| 251 ['--debug-rwt-logging', '--child-processes', '2'], shared_port=F
alse) | 255 ['--debug-rwt-logging', '--child-processes', '2'], shared_port=F
alse) |
| 252 self.assertTrue(any(['Running 2 ' in line for line in regular_output
.buflist])) | 256 self.assertTrue(any(['Running 2 ' in line for line in regular_output
.buflist])) |
| 253 | 257 |
| 254 def test_child_processes_min(self): | 258 def test_child_processes_min(self): |
| 255 if self.should_test_processes: | 259 if self.should_test_processes: |
| 256 _, regular_output, _ = logging_run( | 260 _, regular_output, _ = logging_run( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 272 # Exceptions raised by a worker are treated differently depending on | 276 # Exceptions raised by a worker are treated differently depending on |
| 273 # whether they are in-process or out. inline exceptions work as normal, | 277 # whether they are in-process or out. inline exceptions work as normal, |
| 274 # which allows us to get the full stack trace and traceback from the | 278 # which allows us to get the full stack trace and traceback from the |
| 275 # worker. The downside to this is that it could be any error, but this | 279 # worker. The downside to this is that it could be any error, but this |
| 276 # is actually useful in testing. | 280 # is actually useful in testing. |
| 277 # | 281 # |
| 278 # Exceptions raised in a separate process are re-packaged into | 282 # Exceptions raised in a separate process are re-packaged into |
| 279 # WorkerExceptions (a subclass of BaseException), which have a string ca
pture of the stack which can | 283 # WorkerExceptions (a subclass of BaseException), which have a string ca
pture of the stack which can |
| 280 # be printed, but don't display properly in the unit test exception hand
lers. | 284 # be printed, but don't display properly in the unit test exception hand
lers. |
| 281 self.assertRaises(BaseException, logging_run, | 285 self.assertRaises(BaseException, logging_run, |
| 282 ['failures/expected/exception.html', '--child-processes', '1'], test
s_included=True) | 286 ['failures/expected/exception.html', '--child-processe
s', '1'], tests_included=True) |
| 283 | 287 |
| 284 if self.should_test_processes: | 288 if self.should_test_processes: |
| 285 self.assertRaises(BaseException, logging_run, | 289 self.assertRaises(BaseException, logging_run, |
| 286 ['--child-processes', '2', '--skipped=ignore', 'failures/expecte
d/exception.html', 'passes/text.html'], tests_included=True, shared_port=False) | 290 ['--child-processes', '2', '--skipped=ignore', 'fa
ilures/expected/exception.html', 'passes/text.html'], tests_included=True, share
d_port=False) |
| 287 | 291 |
| 288 def test_device_failure(self): | 292 def test_device_failure(self): |
| 289 # Test that we handle a device going offline during a test properly. | 293 # Test that we handle a device going offline during a test properly. |
| 290 details, regular_output, _ = logging_run(['failures/expected/device_fail
ure.html'], tests_included=True) | 294 details, regular_output, _ = logging_run(['failures/expected/device_fail
ure.html'], tests_included=True) |
| 291 self.assertEqual(details.exit_code, 0) | 295 self.assertEqual(details.exit_code, 0) |
| 292 self.assertTrue('worker/0 has failed' in regular_output.getvalue()) | 296 self.assertTrue('worker/0 has failed' in regular_output.getvalue()) |
| 293 | 297 |
| 294 def test_full_results_html(self): | 298 def test_full_results_html(self): |
| 295 host = MockHost() | 299 host = MockHost() |
| 296 details, _, _ = logging_run(['--full-results-html'], host=host) | 300 details, _, _ = logging_run(['--full-results-html'], host=host) |
| 297 self.assertEqual(details.exit_code, 0) | 301 self.assertEqual(details.exit_code, 0) |
| 298 self.assertEqual(len(host.user.opened_urls), 1) | 302 self.assertEqual(len(host.user.opened_urls), 1) |
| 299 | 303 |
| 300 def test_keyboard_interrupt(self): | 304 def test_keyboard_interrupt(self): |
| 301 # Note that this also tests running a test marked as SKIP if | 305 # Note that this also tests running a test marked as SKIP if |
| 302 # you specify it explicitly. | 306 # you specify it explicitly. |
| 303 details, _, _ = logging_run(['failures/expected/keyboard.html', '--child
-processes', '1'], tests_included=True) | 307 details, _, _ = logging_run(['failures/expected/keyboard.html', '--child
-processes', '1'], tests_included=True) |
| 304 self.assertEqual(details.exit_code, test_run_results.INTERRUPTED_EXIT_ST
ATUS) | 308 self.assertEqual(details.exit_code, test_run_results.INTERRUPTED_EXIT_ST
ATUS) |
| 305 | 309 |
| 306 if self.should_test_processes: | 310 if self.should_test_processes: |
| 307 _, regular_output, _ = logging_run(['failures/expected/keyboard.html
', 'passes/text.html', '--child-processes', '2', '--skipped=ignore'], tests_incl
uded=True, shared_port=False) | 311 _, regular_output, _ = logging_run( |
| 312 ['failures/expected/keyboard.html', 'passes/text.html', '--child
-processes', '2', '--skipped=ignore'], tests_included=True, shared_port=False) |
| 308 self.assertTrue(any(['Interrupted, exiting' in line for line in regu
lar_output.buflist])) | 313 self.assertTrue(any(['Interrupted, exiting' in line for line in regu
lar_output.buflist])) |
| 309 | 314 |
| 310 def test_no_tests_found(self): | 315 def test_no_tests_found(self): |
| 311 details, err, _ = logging_run(['resources'], tests_included=True) | 316 details, err, _ = logging_run(['resources'], tests_included=True) |
| 312 self.assertEqual(details.exit_code, test_run_results.NO_TESTS_EXIT_STATU
S) | 317 self.assertEqual(details.exit_code, test_run_results.NO_TESTS_EXIT_STATU
S) |
| 313 self.assertContains(err, 'No tests to run.\n') | 318 self.assertContains(err, 'No tests to run.\n') |
| 314 | 319 |
| 315 def test_no_tests_found_2(self): | 320 def test_no_tests_found_2(self): |
| 316 details, err, _ = logging_run(['foo'], tests_included=True) | 321 details, err, _ = logging_run(['foo'], tests_included=True) |
| 317 self.assertEqual(details.exit_code, test_run_results.NO_TESTS_EXIT_STATU
S) | 322 self.assertEqual(details.exit_code, test_run_results.NO_TESTS_EXIT_STATU
S) |
| 318 self.assertContains(err, 'No tests to run.\n') | 323 self.assertContains(err, 'No tests to run.\n') |
| 319 | 324 |
| 320 def test_no_tests_found_3(self): | 325 def test_no_tests_found_3(self): |
| 321 details, err, _ = logging_run(['--run-chunk', '5:400', 'foo/bar.html'],
tests_included=True) | 326 details, err, _ = logging_run(['--run-chunk', '5:400', 'foo/bar.html'],
tests_included=True) |
| 322 self.assertEqual(details.exit_code, test_run_results.NO_TESTS_EXIT_STATU
S) | 327 self.assertEqual(details.exit_code, test_run_results.NO_TESTS_EXIT_STATU
S) |
| 323 self.assertContains(err, 'No tests to run.\n') | 328 self.assertContains(err, 'No tests to run.\n') |
| 324 | 329 |
| 325 def test_natural_order(self): | 330 def test_natural_order(self): |
| 326 tests_to_run = ['passes/audio.html', 'failures/expected/text.html', 'fai
lures/expected/missing_text.html', 'passes/args.html'] | 331 tests_to_run = [ |
| 332 'passes/audio.html', |
| 333 'failures/expected/text.html', |
| 334 'failures/expected/missing_text.html', |
| 335 'passes/args.html'] |
| 327 tests_run = get_tests_run(['--order=natural'] + tests_to_run) | 336 tests_run = get_tests_run(['--order=natural'] + tests_to_run) |
| 328 self.assertEqual(['failures/expected/missing_text.html', 'failures/expec
ted/text.html', 'passes/args.html', 'passes/audio.html'], tests_run) | 337 self.assertEqual(['failures/expected/missing_text.html', |
| 338 'failures/expected/text.html', |
| 339 'passes/args.html', |
| 340 'passes/audio.html'], |
| 341 tests_run) |
| 329 | 342 |
| 330 def test_natural_order_test_specified_multiple_times(self): | 343 def test_natural_order_test_specified_multiple_times(self): |
| 331 tests_to_run = ['passes/args.html', 'passes/audio.html', 'passes/audio.h
tml', 'passes/args.html'] | 344 tests_to_run = ['passes/args.html', 'passes/audio.html', 'passes/audio.h
tml', 'passes/args.html'] |
| 332 tests_run = get_tests_run(['--order=natural'] + tests_to_run) | 345 tests_run = get_tests_run(['--order=natural'] + tests_to_run) |
| 333 self.assertEqual(['passes/args.html', 'passes/args.html', 'passes/audio.
html', 'passes/audio.html'], tests_run) | 346 self.assertEqual(['passes/args.html', 'passes/args.html', 'passes/audio.
html', 'passes/audio.html'], tests_run) |
| 334 | 347 |
| 335 def test_random_order(self): | 348 def test_random_order(self): |
| 336 tests_to_run = ['passes/audio.html', 'failures/expected/text.html', 'fai
lures/expected/missing_text.html', 'passes/args.html'] | 349 tests_to_run = [ |
| 350 'passes/audio.html', |
| 351 'failures/expected/text.html', |
| 352 'failures/expected/missing_text.html', |
| 353 'passes/args.html'] |
| 337 tests_run = get_tests_run(['--order=random'] + tests_to_run) | 354 tests_run = get_tests_run(['--order=random'] + tests_to_run) |
| 338 self.assertEqual(sorted(tests_to_run), sorted(tests_run)) | 355 self.assertEqual(sorted(tests_to_run), sorted(tests_run)) |
| 339 | 356 |
| 340 def test_random_daily_seed_order(self): | 357 def test_random_daily_seed_order(self): |
| 341 tests_to_run = ['passes/audio.html', 'failures/expected/text.html', 'fai
lures/expected/missing_text.html', 'passes/args.html'] | 358 tests_to_run = [ |
| 359 'passes/audio.html', |
| 360 'failures/expected/text.html', |
| 361 'failures/expected/missing_text.html', |
| 362 'passes/args.html'] |
| 342 tests_run = get_tests_run(['--order=random-seeded'] + tests_to_run) | 363 tests_run = get_tests_run(['--order=random-seeded'] + tests_to_run) |
| 343 self.assertEqual(sorted(tests_to_run), sorted(tests_run)) | 364 self.assertEqual(sorted(tests_to_run), sorted(tests_run)) |
| 344 | 365 |
| 345 def test_random_order_test_specified_multiple_times(self): | 366 def test_random_order_test_specified_multiple_times(self): |
| 346 tests_to_run = ['passes/args.html', 'passes/audio.html', 'passes/audio.h
tml', 'passes/args.html'] | 367 tests_to_run = ['passes/args.html', 'passes/audio.html', 'passes/audio.h
tml', 'passes/args.html'] |
| 347 tests_run = get_tests_run(['--order=random'] + tests_to_run) | 368 tests_run = get_tests_run(['--order=random'] + tests_to_run) |
| 348 self.assertEqual(tests_run.count('passes/audio.html'), 2) | 369 self.assertEqual(tests_run.count('passes/audio.html'), 2) |
| 349 self.assertEqual(tests_run.count('passes/args.html'), 2) | 370 self.assertEqual(tests_run.count('passes/args.html'), 2) |
| 350 | 371 |
| 351 def test_no_order(self): | 372 def test_no_order(self): |
| 352 tests_to_run = ['passes/audio.html', 'failures/expected/text.html', 'fai
lures/expected/missing_text.html', 'passes/args.html'] | 373 tests_to_run = [ |
| 374 'passes/audio.html', |
| 375 'failures/expected/text.html', |
| 376 'failures/expected/missing_text.html', |
| 377 'passes/args.html'] |
| 353 tests_run = get_tests_run(['--order=none'] + tests_to_run) | 378 tests_run = get_tests_run(['--order=none'] + tests_to_run) |
| 354 self.assertEqual(tests_to_run, tests_run) | 379 self.assertEqual(tests_to_run, tests_run) |
| 355 | 380 |
| 356 def test_no_order_test_specified_multiple_times(self): | 381 def test_no_order_test_specified_multiple_times(self): |
| 357 tests_to_run = ['passes/args.html', 'passes/audio.html', 'passes/audio.h
tml', 'passes/args.html'] | 382 tests_to_run = ['passes/args.html', 'passes/audio.html', 'passes/audio.h
tml', 'passes/args.html'] |
| 358 tests_run = get_tests_run(['--order=none'] + tests_to_run) | 383 tests_run = get_tests_run(['--order=none'] + tests_to_run) |
| 359 self.assertEqual(tests_to_run, tests_run) | 384 self.assertEqual(tests_to_run, tests_run) |
| 360 | 385 |
| 361 def test_no_order_with_directory_entries_in_natural_order(self): | 386 def test_no_order_with_directory_entries_in_natural_order(self): |
| 362 tests_to_run = ['http/tests/ssl', 'perf/foo', 'http/tests/passes'] | 387 tests_to_run = ['http/tests/ssl', 'perf/foo', 'http/tests/passes'] |
| 363 tests_run = get_tests_run(['--order=none'] + tests_to_run) | 388 tests_run = get_tests_run(['--order=none'] + tests_to_run) |
| 364 self.assertEqual(tests_run, ['http/tests/ssl/text.html', 'perf/foo/test.
html', 'http/tests/passes/image.html', 'http/tests/passes/text.html']) | 389 self.assertEqual(tests_run, |
| 390 ['http/tests/ssl/text.html', |
| 391 'perf/foo/test.html', |
| 392 'http/tests/passes/image.html', |
| 393 'http/tests/passes/text.html']) |
| 365 | 394 |
| 366 def test_repeat_each(self): | 395 def test_repeat_each(self): |
| 367 tests_to_run = ['passes/image.html', 'passes/text.html'] | 396 tests_to_run = ['passes/image.html', 'passes/text.html'] |
| 368 tests_run = get_tests_run(['--repeat-each', '2'] + tests_to_run) | 397 tests_run = get_tests_run(['--repeat-each', '2'] + tests_to_run) |
| 369 self.assertEqual(tests_run, ['passes/image.html', 'passes/image.html', '
passes/text.html', 'passes/text.html']) | 398 self.assertEqual(tests_run, ['passes/image.html', 'passes/image.html', '
passes/text.html', 'passes/text.html']) |
| 370 | 399 |
| 371 def test_ignore_flag(self): | 400 def test_ignore_flag(self): |
| 372 # Note that passes/image.html is expected to be run since we specified i
t directly. | 401 # Note that passes/image.html is expected to be run since we specified i
t directly. |
| 373 tests_run = get_tests_run(['-i', 'passes', 'passes/image.html']) | 402 tests_run = get_tests_run(['-i', 'passes', 'passes/image.html']) |
| 374 self.assertFalse('passes/text.html' in tests_run) | 403 self.assertFalse('passes/text.html' in tests_run) |
| 375 self.assertTrue('passes/image.html' in tests_run) | 404 self.assertTrue('passes/image.html' in tests_run) |
| 376 | 405 |
| 377 def test_skipped_flag(self): | 406 def test_skipped_flag(self): |
| 378 tests_run = get_tests_run(['passes']) | 407 tests_run = get_tests_run(['passes']) |
| 379 self.assertFalse('passes/skipped/skip.html' in tests_run) | 408 self.assertFalse('passes/skipped/skip.html' in tests_run) |
| 380 num_tests_run_by_default = len(tests_run) | 409 num_tests_run_by_default = len(tests_run) |
| 381 | 410 |
| 382 # Check that nothing changes when we specify skipped=default. | 411 # Check that nothing changes when we specify skipped=default. |
| 383 self.assertEqual(len(get_tests_run(['--skipped=default', 'passes'])), | 412 self.assertEqual(len(get_tests_run(['--skipped=default', 'passes'])), |
| 384 num_tests_run_by_default) | 413 num_tests_run_by_default) |
| 385 | 414 |
| 386 # Now check that we run one more test (the skipped one). | 415 # Now check that we run one more test (the skipped one). |
| 387 tests_run = get_tests_run(['--skipped=ignore', 'passes']) | 416 tests_run = get_tests_run(['--skipped=ignore', 'passes']) |
| 388 self.assertTrue('passes/skipped/skip.html' in tests_run) | 417 self.assertTrue('passes/skipped/skip.html' in tests_run) |
| 389 self.assertEqual(len(tests_run), num_tests_run_by_default + 1) | 418 self.assertEqual(len(tests_run), num_tests_run_by_default + 1) |
| 390 | 419 |
| 391 # Now check that we only run the skipped test. | 420 # Now check that we only run the skipped test. |
| 392 self.assertEqual(get_tests_run(['--skipped=only', 'passes']), ['passes/s
kipped/skip.html']) | 421 self.assertEqual(get_tests_run(['--skipped=only', 'passes']), ['passes/s
kipped/skip.html']) |
| 393 | 422 |
| 394 # Now check that we don't run anything. | 423 # Now check that we don't run anything. |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 459 self.assertEqual(['passes/text.html'], tests_run) | 488 self.assertEqual(['passes/text.html'], tests_run) |
| 460 | 489 |
| 461 def test_single_skipped_file(self): | 490 def test_single_skipped_file(self): |
| 462 tests_run = get_tests_run(['failures/expected/keybaord.html']) | 491 tests_run = get_tests_run(['failures/expected/keybaord.html']) |
| 463 self.assertEqual([], tests_run) | 492 self.assertEqual([], tests_run) |
| 464 | 493 |
| 465 def test_stderr_is_saved(self): | 494 def test_stderr_is_saved(self): |
| 466 host = MockHost() | 495 host = MockHost() |
| 467 self.assertTrue(passing_run(host=host)) | 496 self.assertTrue(passing_run(host=host)) |
| 468 self.assertEqual(host.filesystem.read_text_file('/tmp/layout-test-result
s/passes/error-stderr.txt'), | 497 self.assertEqual(host.filesystem.read_text_file('/tmp/layout-test-result
s/passes/error-stderr.txt'), |
| 469 'stuff going to stderr') | 498 'stuff going to stderr') |
| 470 | 499 |
| 471 def test_test_list(self): | 500 def test_test_list(self): |
| 472 host = MockHost() | 501 host = MockHost() |
| 473 filename = '/tmp/foo.txt' | 502 filename = '/tmp/foo.txt' |
| 474 host.filesystem.write_text_file(filename, 'passes/text.html') | 503 host.filesystem.write_text_file(filename, 'passes/text.html') |
| 475 tests_run = get_tests_run(['--test-list=%s' % filename], host=host) | 504 tests_run = get_tests_run(['--test-list=%s' % filename], host=host) |
| 476 self.assertEqual(['passes/text.html'], tests_run) | 505 self.assertEqual(['passes/text.html'], tests_run) |
| 477 host.filesystem.remove(filename) | 506 host.filesystem.remove(filename) |
| 478 details, err, user = logging_run(['--test-list=%s' % filename], tests_in
cluded=True, host=host) | 507 details, err, user = logging_run(['--test-list=%s' % filename], tests_in
cluded=True, host=host) |
| 479 self.assertEqual(details.exit_code, test_run_results.NO_TESTS_EXIT_STATU
S) | 508 self.assertEqual(details.exit_code, test_run_results.NO_TESTS_EXIT_STATU
S) |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 | 544 |
| 516 # Verify that --no-smoke continues to work on a smoke-by-default port. | 545 # Verify that --no-smoke continues to work on a smoke-by-default port. |
| 517 tests_run = get_tests_run(['--no-smoke'], host=host, port_obj=port_obj) | 546 tests_run = get_tests_run(['--no-smoke'], host=host, port_obj=port_obj) |
| 518 self.assertNotEqual(['passes/text.html'], tests_run) | 547 self.assertNotEqual(['passes/text.html'], tests_run) |
| 519 | 548 |
| 520 def test_missing_and_unexpected_results(self): | 549 def test_missing_and_unexpected_results(self): |
| 521 # Test that we update expectations in place. If the expectation | 550 # Test that we update expectations in place. If the expectation |
| 522 # is missing, update the expected generic location. | 551 # is missing, update the expected generic location. |
| 523 host = MockHost() | 552 host = MockHost() |
| 524 details, err, _ = logging_run(['--no-show-results', '--retry-failures', | 553 details, err, _ = logging_run(['--no-show-results', '--retry-failures', |
| 525 'failures/expected/missing_image.html', | 554 'failures/expected/missing_image.html', |
| 526 'failures/unexpected/missing_text.html', | 555 'failures/unexpected/missing_text.html', |
| 527 'failures/unexpected/text-image-checksum.html'], | 556 'failures/unexpected/text-image-checksum.
html'], |
| 528 tests_included=True, host=host) | 557 tests_included=True, host=host) |
| 529 file_list = host.filesystem.written_files.keys() | 558 file_list = host.filesystem.written_files.keys() |
| 530 self.assertEqual(details.exit_code, 2) | 559 self.assertEqual(details.exit_code, 2) |
| 531 json_string = host.filesystem.read_text_file('/tmp/layout-test-results/f
ull_results.json') | 560 json_string = host.filesystem.read_text_file('/tmp/layout-test-results/f
ull_results.json') |
| 532 self.assertTrue(json_string.find('"text-image-checksum.html":{"expected"
:"PASS","actual":"IMAGE+TEXT","is_unexpected":true') != -1) | 561 self.assertTrue( |
| 533 self.assertTrue(json_string.find('"missing_text.html":{"expected":"PASS"
,"is_missing_text":true,"actual":"MISSING","is_unexpected":true') != -1) | 562 json_string.find('"text-image-checksum.html":{"expected":"PASS","act
ual":"IMAGE+TEXT","is_unexpected":true') != - |
| 563 1) |
| 564 self.assertTrue( |
| 565 json_string.find('"missing_text.html":{"expected":"PASS","is_missing
_text":true,"actual":"MISSING","is_unexpected":true') != - |
| 566 1) |
| 534 self.assertTrue(json_string.find('"num_regressions":2') != -1) | 567 self.assertTrue(json_string.find('"num_regressions":2') != -1) |
| 535 self.assertTrue(json_string.find('"num_flaky":0') != -1) | 568 self.assertTrue(json_string.find('"num_flaky":0') != -1) |
| 536 | 569 |
| 537 def test_different_failure_on_retry(self): | 570 def test_different_failure_on_retry(self): |
| 538 # This tests that if a test fails two different ways -- both unexpected | 571 # This tests that if a test fails two different ways -- both unexpected |
| 539 # -- we treat it as a failure rather than a flaky result. We use the | 572 # -- we treat it as a failure rather than a flaky result. We use the |
| 540 # initial failure for simplicity and consistency w/ the flakiness | 573 # initial failure for simplicity and consistency w/ the flakiness |
| 541 # dashboard, even if the second failure is worse. | 574 # dashboard, even if the second failure is worse. |
| 542 | 575 |
| 543 details, err, _ = logging_run(['--retry-failures', 'failures/unexpected/
text_then_crash.html'], tests_included=True) | 576 details, err, _ = logging_run(['--retry-failures', 'failures/unexpected/
text_then_crash.html'], tests_included=True) |
| (...skipping 19 matching lines...) Expand all Loading... |
| 563 details, err, _ = logging_run(extra_args=args, host=host, tests_included
=True) | 596 details, err, _ = logging_run(extra_args=args, host=host, tests_included
=True) |
| 564 | 597 |
| 565 self.assertEqual(details.exit_code, 1) | 598 self.assertEqual(details.exit_code, 1) |
| 566 expected_token = '"pixeldir":{"image_in_pixeldir.html":{"expected":"PASS
","actual":"IMAGE","is_unexpected":true' | 599 expected_token = '"pixeldir":{"image_in_pixeldir.html":{"expected":"PASS
","actual":"IMAGE","is_unexpected":true' |
| 567 json_string = host.filesystem.read_text_file('/tmp/layout-test-results/f
ull_results.json') | 600 json_string = host.filesystem.read_text_file('/tmp/layout-test-results/f
ull_results.json') |
| 568 self.assertTrue(json_string.find(expected_token) != -1) | 601 self.assertTrue(json_string.find(expected_token) != -1) |
| 569 | 602 |
| 570 def test_crash_with_stderr(self): | 603 def test_crash_with_stderr(self): |
| 571 host = MockHost() | 604 host = MockHost() |
| 572 _, regular_output, _ = logging_run(['failures/unexpected/crash-with-stde
rr.html'], tests_included=True, host=host) | 605 _, regular_output, _ = logging_run(['failures/unexpected/crash-with-stde
rr.html'], tests_included=True, host=host) |
| 573 self.assertTrue(host.filesystem.read_text_file('/tmp/layout-test-results
/full_results.json').find('{"crash-with-stderr.html":{"expected":"PASS","actual"
:"CRASH","has_stderr":true,"is_unexpected":true') != -1) | 606 self.assertTrue(host.filesystem.read_text_file('/tmp/layout-test-results
/full_results.json').find( |
| 607 '{"crash-with-stderr.html":{"expected":"PASS","actual":"CRASH","has_
stderr":true,"is_unexpected":true') != -1) |
| 574 | 608 |
| 575 def test_no_image_failure_with_image_diff(self): | 609 def test_no_image_failure_with_image_diff(self): |
| 576 host = MockHost() | 610 host = MockHost() |
| 577 _, regular_output, _ = logging_run(['failures/unexpected/checksum-with-m
atching-image.html'], tests_included=True, host=host) | 611 _, regular_output, _ = logging_run( |
| 578 self.assertTrue(host.filesystem.read_text_file('/tmp/layout-test-results
/full_results.json').find('"num_regressions":0') != -1) | 612 ['failures/unexpected/checksum-with-matching-image.html'], tests_inc
luded=True, host=host) |
| 613 self.assertTrue( |
| 614 host.filesystem.read_text_file('/tmp/layout-test-results/full_result
s.json').find('"num_regressions":0') != - |
| 615 1) |
| 579 | 616 |
| 580 def test_exit_after_n_failures_upload(self): | 617 def test_exit_after_n_failures_upload(self): |
| 581 host = MockHost() | 618 host = MockHost() |
| 582 details, regular_output, user = logging_run( | 619 details, regular_output, user = logging_run( |
| 583 ['failures/unexpected/text-image-checksum.html', 'passes/text.html',
'--exit-after-n-failures', '1'], | 620 ['failures/unexpected/text-image-checksum.html', 'passes/text.html',
'--exit-after-n-failures', '1'], |
| 584 tests_included=True, host=host) | 621 tests_included=True, host=host) |
| 585 | 622 |
| 586 # By returning False, we know that the incremental results were generate
d and then deleted. | 623 # By returning False, we know that the incremental results were generate
d and then deleted. |
| 587 self.assertFalse(host.filesystem.exists('/tmp/layout-test-results/increm
ental_results.json')) | 624 self.assertFalse(host.filesystem.exists('/tmp/layout-test-results/increm
ental_results.json')) |
| 588 | 625 |
| 589 self.assertEqual(details.exit_code, test_run_results.EARLY_EXIT_STATUS) | 626 self.assertEqual(details.exit_code, test_run_results.EARLY_EXIT_STATUS) |
| 590 | 627 |
| 591 # This checks that passes/text.html is considered SKIPped. | 628 # This checks that passes/text.html is considered SKIPped. |
| 592 self.assertTrue('"skipped":1' in host.filesystem.read_text_file('/tmp/la
yout-test-results/full_results.json')) | 629 self.assertTrue('"skipped":1' in host.filesystem.read_text_file('/tmp/la
yout-test-results/full_results.json')) |
| 593 | 630 |
| 594 # This checks that we told the user we bailed out. | 631 # This checks that we told the user we bailed out. |
| 595 self.assertTrue('Exiting early after 1 failures. 1 tests run.\n' in regu
lar_output.getvalue()) | 632 self.assertTrue('Exiting early after 1 failures. 1 tests run.\n' in regu
lar_output.getvalue()) |
| 596 | 633 |
| 597 # This checks that neither test ran as expected. | 634 # This checks that neither test ran as expected. |
| 598 # FIXME: This log message is confusing; tests that were skipped should b
e called out separately. | 635 # FIXME: This log message is confusing; tests that were skipped should b
e called out separately. |
| 599 self.assertTrue('0 tests ran as expected, 2 didn\'t:\n' in regular_outpu
t.getvalue()) | 636 self.assertTrue('0 tests ran as expected, 2 didn\'t:\n' in regular_outpu
t.getvalue()) |
| 600 | 637 |
| 601 def test_exit_after_n_failures(self): | 638 def test_exit_after_n_failures(self): |
| 602 # Unexpected failures should result in tests stopping. | 639 # Unexpected failures should result in tests stopping. |
| 603 tests_run = get_tests_run(['failures/unexpected/text-image-checksum.html
', 'passes/text.html', '--exit-after-n-failures', '1']) | 640 tests_run = get_tests_run( |
| 641 ['failures/unexpected/text-image-checksum.html', 'passes/text.html',
'--exit-after-n-failures', '1']) |
| 604 self.assertEqual(['failures/unexpected/text-image-checksum.html'], tests
_run) | 642 self.assertEqual(['failures/unexpected/text-image-checksum.html'], tests
_run) |
| 605 | 643 |
| 606 # But we'll keep going for expected ones. | 644 # But we'll keep going for expected ones. |
| 607 tests_run = get_tests_run(['failures/expected/text.html', 'passes/text.h
tml', '--exit-after-n-failures', '1']) | 645 tests_run = get_tests_run(['failures/expected/text.html', 'passes/text.h
tml', '--exit-after-n-failures', '1']) |
| 608 self.assertEqual(['failures/expected/text.html', 'passes/text.html'], te
sts_run) | 646 self.assertEqual(['failures/expected/text.html', 'passes/text.html'], te
sts_run) |
| 609 | 647 |
| 610 def test_exit_after_n_crashes(self): | 648 def test_exit_after_n_crashes(self): |
| 611 # Unexpected crashes should result in tests stopping. | 649 # Unexpected crashes should result in tests stopping. |
| 612 tests_run = get_tests_run(['failures/unexpected/crash.html', 'passes/tex
t.html', '--exit-after-n-crashes-or-timeouts', '1']) | 650 tests_run = get_tests_run(['failures/unexpected/crash.html', 'passes/tex
t.html', '--exit-after-n-crashes-or-timeouts', '1']) |
| 613 self.assertEqual(['failures/unexpected/crash.html'], tests_run) | 651 self.assertEqual(['failures/unexpected/crash.html'], tests_run) |
| 614 | 652 |
| 615 # Same with timeouts. | 653 # Same with timeouts. |
| 616 tests_run = get_tests_run(['failures/unexpected/timeout.html', 'passes/t
ext.html', '--exit-after-n-crashes-or-timeouts', '1']) | 654 tests_run = get_tests_run(['failures/unexpected/timeout.html', |
| 655 'passes/text.html', |
| 656 '--exit-after-n-crashes-or-timeouts', |
| 657 '1']) |
| 617 self.assertEqual(['failures/unexpected/timeout.html'], tests_run) | 658 self.assertEqual(['failures/unexpected/timeout.html'], tests_run) |
| 618 | 659 |
| 619 # But we'll keep going for expected ones. | 660 # But we'll keep going for expected ones. |
| 620 tests_run = get_tests_run(['failures/expected/crash.html', 'passes/text.
html', '--exit-after-n-crashes-or-timeouts', '1']) | 661 tests_run = get_tests_run(['failures/expected/crash.html', 'passes/text.
html', '--exit-after-n-crashes-or-timeouts', '1']) |
| 621 self.assertEqual(['failures/expected/crash.html', 'passes/text.html'], t
ests_run) | 662 self.assertEqual(['failures/expected/crash.html', 'passes/text.html'], t
ests_run) |
| 622 | 663 |
| 623 def test_results_directory_absolute(self): | 664 def test_results_directory_absolute(self): |
| 624 # We run a configuration that should fail, to generate output, then | 665 # We run a configuration that should fail, to generate output, then |
| 625 # look for what the output results url was. | 666 # look for what the output results url was. |
| 626 | 667 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 641 # We run a configuration that should fail, to generate output, then | 682 # We run a configuration that should fail, to generate output, then |
| 642 # look for what the output results url was. | 683 # look for what the output results url was. |
| 643 host = MockHost() | 684 host = MockHost() |
| 644 host.filesystem.maybe_make_directory('/tmp/cwd') | 685 host.filesystem.maybe_make_directory('/tmp/cwd') |
| 645 host.filesystem.chdir('/tmp/cwd') | 686 host.filesystem.chdir('/tmp/cwd') |
| 646 _, _, user = logging_run(['--results-directory=foo'], tests_included=Tru
e, host=host) | 687 _, _, user = logging_run(['--results-directory=foo'], tests_included=Tru
e, host=host) |
| 647 self.assertEqual(user.opened_urls, [path.abspath_to_uri(host.platform, '
/tmp/cwd/foo/results.html')]) | 688 self.assertEqual(user.opened_urls, [path.abspath_to_uri(host.platform, '
/tmp/cwd/foo/results.html')]) |
| 648 | 689 |
| 649 def test_retrying_default_value(self): | 690 def test_retrying_default_value(self): |
| 650 host = MockHost() | 691 host = MockHost() |
| 651 details, err, _ = logging_run(['--debug-rwt-logging', 'failures/unexpect
ed/text-image-checksum.html'], tests_included=True, host=host) | 692 details, err, _ = logging_run( |
| 693 ['--debug-rwt-logging', 'failures/unexpected/text-image-checksum.htm
l'], tests_included=True, host=host) |
| 652 self.assertEqual(details.exit_code, 1) | 694 self.assertEqual(details.exit_code, 1) |
| 653 self.assertFalse('Retrying' in err.getvalue()) | 695 self.assertFalse('Retrying' in err.getvalue()) |
| 654 | 696 |
| 655 host = MockHost() | 697 host = MockHost() |
| 656 details, err, _ = logging_run(['--debug-rwt-logging', 'failures/unexpect
ed'], tests_included=True, host=host) | 698 details, err, _ = logging_run(['--debug-rwt-logging', 'failures/unexpect
ed'], tests_included=True, host=host) |
| 657 self.assertEqual(details.exit_code, test.UNEXPECTED_FAILURES - 7) # FIX
ME: This should be a constant in test.py . | 699 self.assertEqual(details.exit_code, test.UNEXPECTED_FAILURES - 7) # FIX
ME: This should be a constant in test.py . |
| 658 self.assertTrue('Retrying' in err.getvalue()) | 700 self.assertTrue('Retrying' in err.getvalue()) |
| 659 | 701 |
| 660 def test_retrying_default_value_test_list(self): | 702 def test_retrying_default_value_test_list(self): |
| 661 host = MockHost() | 703 host = MockHost() |
| (...skipping 15 matching lines...) Expand all Loading... |
| 677 details, err, _ = logging_run(['--debug-rwt-logging', '--retry-failures'
, 'failures/flaky'], tests_included=True, host=host) | 719 details, err, _ = logging_run(['--debug-rwt-logging', '--retry-failures'
, 'failures/flaky'], tests_included=True, host=host) |
| 678 self.assertEqual(details.exit_code, 0) | 720 self.assertEqual(details.exit_code, 0) |
| 679 self.assertTrue('Retrying' in err.getvalue()) | 721 self.assertTrue('Retrying' in err.getvalue()) |
| 680 self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/failure
s/flaky/text-actual.txt')) | 722 self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/failure
s/flaky/text-actual.txt')) |
| 681 self.assertFalse(host.filesystem.exists('/tmp/layout-test-results/retrie
s/failures/flaky/text-actual.txt')) | 723 self.assertFalse(host.filesystem.exists('/tmp/layout-test-results/retrie
s/failures/flaky/text-actual.txt')) |
| 682 self.assertEqual(len(host.user.opened_urls), 0) | 724 self.assertEqual(len(host.user.opened_urls), 0) |
| 683 | 725 |
| 684 # Now we test that --clobber-old-results does remove the old entries and
the old retries, | 726 # Now we test that --clobber-old-results does remove the old entries and
the old retries, |
| 685 # and that we don't retry again. | 727 # and that we don't retry again. |
| 686 host = MockHost() | 728 host = MockHost() |
| 687 details, err, _ = logging_run(['--no-retry-failures', '--clobber-old-res
ults', 'failures/flaky'], tests_included=True, host=host) | 729 details, err, _ = logging_run( |
| 730 ['--no-retry-failures', '--clobber-old-results', 'failures/flaky'],
tests_included=True, host=host) |
| 688 self.assertEqual(details.exit_code, 1) | 731 self.assertEqual(details.exit_code, 1) |
| 689 self.assertTrue('Clobbering old results' in err.getvalue()) | 732 self.assertTrue('Clobbering old results' in err.getvalue()) |
| 690 self.assertTrue('flaky/text.html' in err.getvalue()) | 733 self.assertTrue('flaky/text.html' in err.getvalue()) |
| 691 self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/failure
s/flaky/text-actual.txt')) | 734 self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/failure
s/flaky/text-actual.txt')) |
| 692 self.assertFalse(host.filesystem.exists('retries')) | 735 self.assertFalse(host.filesystem.exists('retries')) |
| 693 self.assertEqual(len(host.user.opened_urls), 1) | 736 self.assertEqual(len(host.user.opened_urls), 1) |
| 694 | 737 |
| 695 def test_retrying_crashed_tests(self): | 738 def test_retrying_crashed_tests(self): |
| 696 host = MockHost() | 739 host = MockHost() |
| 697 details, err, _ = logging_run(['--retry-failures', 'failures/unexpected/
crash.html'], tests_included=True, host=host) | 740 details, err, _ = logging_run(['--retry-failures', 'failures/unexpected/
crash.html'], tests_included=True, host=host) |
| 698 self.assertEqual(details.exit_code, 1) | 741 self.assertEqual(details.exit_code, 1) |
| 699 self.assertTrue('Retrying' in err.getvalue()) | 742 self.assertTrue('Retrying' in err.getvalue()) |
| 700 | 743 |
| 701 def test_retrying_leak_tests(self): | 744 def test_retrying_leak_tests(self): |
| 702 host = MockHost() | 745 host = MockHost() |
| 703 details, err, _ = logging_run(['--retry-failures', 'failures/unexpected/
leak.html'], tests_included=True, host=host) | 746 details, err, _ = logging_run(['--retry-failures', 'failures/unexpected/
leak.html'], tests_included=True, host=host) |
| 704 self.assertEqual(details.exit_code, 1) | 747 self.assertEqual(details.exit_code, 1) |
| 705 self.assertTrue('Retrying' in err.getvalue()) | 748 self.assertTrue('Retrying' in err.getvalue()) |
| 706 | 749 |
| 707 def test_retrying_force_pixel_tests(self): | 750 def test_retrying_force_pixel_tests(self): |
| 708 host = MockHost() | 751 host = MockHost() |
| 709 details, err, _ = logging_run(['--no-pixel-tests', '--retry-failures', '
failures/unexpected/text-image-checksum.html'], tests_included=True, host=host) | 752 details, err, _ = logging_run( |
| 753 ['--no-pixel-tests', '--retry-failures', 'failures/unexpected/text-i
mage-checksum.html'], tests_included=True, host=host) |
| 710 self.assertEqual(details.exit_code, 1) | 754 self.assertEqual(details.exit_code, 1) |
| 711 self.assertTrue('Retrying' in err.getvalue()) | 755 self.assertTrue('Retrying' in err.getvalue()) |
| 712 self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/failure
s/unexpected/text-image-checksum-actual.txt')) | 756 self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/failure
s/unexpected/text-image-checksum-actual.txt')) |
| 713 self.assertFalse(host.filesystem.exists('/tmp/layout-test-results/failur
es/unexpected/text-image-checksum-actual.png')) | 757 self.assertFalse(host.filesystem.exists('/tmp/layout-test-results/failur
es/unexpected/text-image-checksum-actual.png')) |
| 714 self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/retries
/failures/unexpected/text-image-checksum-actual.txt')) | 758 self.assertTrue( |
| 715 self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/retries
/failures/unexpected/text-image-checksum-actual.png')) | 759 host.filesystem.exists('/tmp/layout-test-results/retries/failures/un
expected/text-image-checksum-actual.txt')) |
| 760 self.assertTrue( |
| 761 host.filesystem.exists('/tmp/layout-test-results/retries/failures/un
expected/text-image-checksum-actual.png')) |
| 716 json_string = host.filesystem.read_text_file('/tmp/layout-test-results/f
ull_results.json') | 762 json_string = host.filesystem.read_text_file('/tmp/layout-test-results/f
ull_results.json') |
| 717 json = parse_full_results(json_string) | 763 json = parse_full_results(json_string) |
| 718 self.assertEqual(json["tests"]["failures"]["unexpected"]["text-image-che
cksum.html"], | 764 self.assertEqual(json['tests']['failures']['unexpected']['text-image-che
cksum.html'], |
| 719 {"expected": "PASS", "actual": "TEXT IMAGE+TEXT", "is_unexpected": T
rue}) | 765 {'expected': 'PASS', 'actual': 'TEXT IMAGE+TEXT', 'is_u
nexpected': True}) |
| 720 self.assertFalse(json["pixel_tests_enabled"]) | 766 self.assertFalse(json['pixel_tests_enabled']) |
| 721 self.assertEqual(details.enabled_pixel_tests_in_retry, True) | 767 self.assertEqual(details.enabled_pixel_tests_in_retry, True) |
| 722 | 768 |
| 723 def test_retrying_uses_retries_directory(self): | 769 def test_retrying_uses_retries_directory(self): |
| 724 host = MockHost() | 770 host = MockHost() |
| 725 details, err, _ = logging_run(['--debug-rwt-logging', '--retry-failures'
, 'failures/unexpected/text-image-checksum.html'], tests_included=True, host=hos
t) | 771 details, err, _ = logging_run( |
| 772 ['--debug-rwt-logging', '--retry-failures', 'failures/unexpected/tex
t-image-checksum.html'], tests_included=True, host=host) |
| 726 self.assertEqual(details.exit_code, 1) | 773 self.assertEqual(details.exit_code, 1) |
| 727 self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/failure
s/unexpected/text-image-checksum-actual.txt')) | 774 self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/failure
s/unexpected/text-image-checksum-actual.txt')) |
| 728 self.assertTrue(host.filesystem.exists('/tmp/layout-test-results/retries
/failures/unexpected/text-image-checksum-actual.txt')) | 775 self.assertTrue( |
| 776 host.filesystem.exists('/tmp/layout-test-results/retries/failures/un
expected/text-image-checksum-actual.txt')) |
| 729 | 777 |
| 730 def test_run_order__inline(self): | 778 def test_run_order__inline(self): |
| 731 # These next tests test that we run the tests in ascending alphabetical | 779 # These next tests test that we run the tests in ascending alphabetical |
| 732 # order per directory. HTTP tests are sharded separately from other test
s, | 780 # order per directory. HTTP tests are sharded separately from other test
s, |
| 733 # so we have to test both. | 781 # so we have to test both. |
| 734 tests_run = get_tests_run(['-i', 'passes/passes', 'passes']) | 782 tests_run = get_tests_run(['-i', 'passes/passes', 'passes']) |
| 735 self.assertEqual(tests_run, sorted(tests_run)) | 783 self.assertEqual(tests_run, sorted(tests_run)) |
| 736 | 784 |
| 737 tests_run = get_tests_run(['http/tests/passes']) | 785 tests_run = get_tests_run(['http/tests/passes']) |
| 738 self.assertEqual(tests_run, sorted(tests_run)) | 786 self.assertEqual(tests_run, sorted(tests_run)) |
| (...skipping 20 matching lines...) Expand all Loading... |
| 759 | 807 |
| 760 def test_reftest_driver_should_run_expected_mismatch_html(self): | 808 def test_reftest_driver_should_run_expected_mismatch_html(self): |
| 761 tests_run = get_test_results(['passes/mismatch.html']) | 809 tests_run = get_test_results(['passes/mismatch.html']) |
| 762 self.assertEqual(tests_run[0].references, ['passes/mismatch-expected-mis
match.html']) | 810 self.assertEqual(tests_run[0].references, ['passes/mismatch-expected-mis
match.html']) |
| 763 | 811 |
| 764 def test_reftest_should_not_use_naming_convention_if_not_listed_in_reftestli
st(self): | 812 def test_reftest_should_not_use_naming_convention_if_not_listed_in_reftestli
st(self): |
| 765 host = MockHost() | 813 host = MockHost() |
| 766 _, err, _ = logging_run(['--no-show-results', 'reftests/foo/'], tests_in
cluded=True, host=host) | 814 _, err, _ = logging_run(['--no-show-results', 'reftests/foo/'], tests_in
cluded=True, host=host) |
| 767 results = parse_full_results(host.filesystem.read_text_file('/tmp/layout
-test-results/full_results.json')) | 815 results = parse_full_results(host.filesystem.read_text_file('/tmp/layout
-test-results/full_results.json')) |
| 768 | 816 |
| 769 self.assertEqual(results["tests"]["reftests"]["foo"]["unlistedtest.html"
]["actual"], "MISSING"), | 817 self.assertEqual(results['tests']['reftests']['foo']['unlistedtest.html'
]['actual'], 'MISSING'), |
| 770 self.assertEqual(results["num_regressions"], 5) | 818 self.assertEqual(results['num_regressions'], 5) |
| 771 self.assertEqual(results["num_flaky"], 0) | 819 self.assertEqual(results['num_flaky'], 0) |
| 772 | 820 |
| 773 def test_reftest_crash(self): | 821 def test_reftest_crash(self): |
| 774 test_results = get_test_results(['failures/unexpected/crash-reftest.html
']) | 822 test_results = get_test_results(['failures/unexpected/crash-reftest.html
']) |
| 775 # The list of references should be empty since the test crashed and we d
idn't run any references. | 823 # The list of references should be empty since the test crashed and we d
idn't run any references. |
| 776 self.assertEqual(test_results[0].references, []) | 824 self.assertEqual(test_results[0].references, []) |
| 777 | 825 |
| 778 def test_reftest_with_virtual_reference(self): | 826 def test_reftest_with_virtual_reference(self): |
| 779 _, err, _ = logging_run(['--details', 'virtual/passes/reftest.html'], te
sts_included=True) | 827 _, err, _ = logging_run(['--details', 'virtual/passes/reftest.html'], te
sts_included=True) |
| 780 self.assertTrue('ref: virtual/passes/reftest-expected.html' in err.getva
lue()) | 828 self.assertTrue('ref: virtual/passes/reftest-expected.html' in err.getva
lue()) |
| 781 | 829 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 809 # Test to ensure that we don't generate -wdiff.html or -pretty.html if w
diff and PrettyPatch | 857 # Test to ensure that we don't generate -wdiff.html or -pretty.html if w
diff and PrettyPatch |
| 810 # aren't available. | 858 # aren't available. |
| 811 host = MockHost() | 859 host = MockHost() |
| 812 _, err, _ = logging_run(['--pixel-tests', 'failures/unexpected/text-imag
e-checksum.html'], tests_included=True, host=host) | 860 _, err, _ = logging_run(['--pixel-tests', 'failures/unexpected/text-imag
e-checksum.html'], tests_included=True, host=host) |
| 813 written_files = host.filesystem.written_files | 861 written_files = host.filesystem.written_files |
| 814 self.assertTrue(any(path.endswith('-diff.txt') for path in written_files
.keys())) | 862 self.assertTrue(any(path.endswith('-diff.txt') for path in written_files
.keys())) |
| 815 self.assertFalse(any(path.endswith('-wdiff.html') for path in written_fi
les.keys())) | 863 self.assertFalse(any(path.endswith('-wdiff.html') for path in written_fi
les.keys())) |
| 816 self.assertFalse(any(path.endswith('-pretty-diff.html') for path in writ
ten_files.keys())) | 864 self.assertFalse(any(path.endswith('-pretty-diff.html') for path in writ
ten_files.keys())) |
| 817 | 865 |
| 818 full_results_text = host.filesystem.read_text_file('/tmp/layout-test-res
ults/full_results.json') | 866 full_results_text = host.filesystem.read_text_file('/tmp/layout-test-res
ults/full_results.json') |
| 819 full_results = json.loads(full_results_text.replace("ADD_RESULTS(", "").
replace(");", "")) | 867 full_results = json.loads(full_results_text.replace('ADD_RESULTS(', '').
replace(');', '')) |
| 820 self.assertEqual(full_results['has_wdiff'], False) | 868 self.assertEqual(full_results['has_wdiff'], False) |
| 821 self.assertEqual(full_results['has_pretty_patch'], False) | 869 self.assertEqual(full_results['has_pretty_patch'], False) |
| 822 | 870 |
| 823 def test_unsupported_platform(self): | 871 def test_unsupported_platform(self): |
| 824 stdout = StringIO.StringIO() | 872 stdout = StringIO.StringIO() |
| 825 stderr = StringIO.StringIO() | 873 stderr = StringIO.StringIO() |
| 826 res = run_webkit_tests.main(['--platform', 'foo'], stdout, stderr) | 874 res = run_webkit_tests.main(['--platform', 'foo'], stdout, stderr) |
| 827 | 875 |
| 828 self.assertEqual(res, test_run_results.UNEXPECTED_ERROR_EXIT_STATUS) | 876 self.assertEqual(res, test_run_results.UNEXPECTED_ERROR_EXIT_STATUS) |
| 829 self.assertEqual(stdout.getvalue(), '') | 877 self.assertEqual(stdout.getvalue(), '') |
| 830 self.assertTrue('unsupported platform' in stderr.getvalue()) | 878 self.assertTrue('unsupported platform' in stderr.getvalue()) |
| 831 | 879 |
| 832 def test_build_check(self): | 880 def test_build_check(self): |
| 833 # By using a port_name for a different platform than the one we're runni
ng on, the build check should always fail. | 881 # By using a port_name for a different platform than the one we're runni
ng on, the build check should always fail. |
| 834 if sys.platform == 'darwin': | 882 if sys.platform == 'darwin': |
| 835 port_name = 'linux-x86' | 883 port_name = 'linux-x86' |
| 836 else: | 884 else: |
| 837 port_name = 'mac-lion' | 885 port_name = 'mac-lion' |
| 838 out = StringIO.StringIO() | 886 out = StringIO.StringIO() |
| 839 err = StringIO.StringIO() | 887 err = StringIO.StringIO() |
| 840 self.assertEqual(run_webkit_tests.main(['--platform', port_name, 'fast/h
arness/results.html'], out, err), test_run_results.UNEXPECTED_ERROR_EXIT_STATUS) | 888 self.assertEqual(run_webkit_tests.main(['--platform', |
| 889 port_name, |
| 890 'fast/harness/results.html'], |
| 891 out, |
| 892 err), |
| 893 test_run_results.UNEXPECTED_ERROR_EXIT_STATUS) |
| 841 | 894 |
| 842 def test_verbose_in_child_processes(self): | 895 def test_verbose_in_child_processes(self): |
| 843 # When we actually run multiple processes, we may have to reconfigure lo
gging in the | 896 # When we actually run multiple processes, we may have to reconfigure lo
gging in the |
| 844 # child process (e.g., on win32) and we need to make sure that works and
we still | 897 # child process (e.g., on win32) and we need to make sure that works and
we still |
| 845 # see the verbose log output. However, we can't use logging_run() becaus
e using | 898 # see the verbose log output. However, we can't use logging_run() becaus
e using |
| 846 # outputcapture to capture stdout and stderr latter results in a nonpick
lable host. | 899 # outputcapture to capture stdout and stderr latter results in a nonpick
lable host. |
| 847 | 900 |
| 848 # Test is flaky on Windows: https://bugs.webkit.org/show_bug.cgi?id=9855
9 | 901 # Test is flaky on Windows: https://bugs.webkit.org/show_bug.cgi?id=9855
9 |
| 849 if not self.should_test_processes: | 902 if not self.should_test_processes: |
| 850 return | 903 return |
| 851 | 904 |
| 852 options, parsed_args = parse_args(['--verbose', '--fully-parallel', '--c
hild-processes', '2', 'passes/text.html', 'passes/image.html'], tests_included=T
rue, print_nothing=False) | 905 options, parsed_args = parse_args(['--verbose', '--fully-parallel', '--c
hild-processes', |
| 906 '2', 'passes/text.html', 'passes/imag
e.html'], tests_included=True, print_nothing=False) |
| 853 host = MockHost() | 907 host = MockHost() |
| 854 port_obj = host.port_factory.get(port_name=options.platform, options=opt
ions) | 908 port_obj = host.port_factory.get(port_name=options.platform, options=opt
ions) |
| 855 logging_stream = StringIO.StringIO() | 909 logging_stream = StringIO.StringIO() |
| 856 run_webkit_tests.run(port_obj, options, parsed_args, logging_stream=logg
ing_stream) | 910 run_webkit_tests.run(port_obj, options, parsed_args, logging_stream=logg
ing_stream) |
| 857 self.assertTrue('text.html passed' in logging_stream.getvalue()) | 911 self.assertTrue('text.html passed' in logging_stream.getvalue()) |
| 858 self.assertTrue('image.html passed' in logging_stream.getvalue()) | 912 self.assertTrue('image.html passed' in logging_stream.getvalue()) |
| 859 | 913 |
| 860 def disabled_test_driver_logging(self): | 914 def disabled_test_driver_logging(self): |
| 861 # FIXME: Figure out how to either use a mock-test port to | 915 # FIXME: Figure out how to either use a mock-test port to |
| 862 # get output or mack mock ports work again. | 916 # get output or mack mock ports work again. |
| 863 host = Host() | 917 host = Host() |
| 864 _, err, _ = logging_run(['--platform', 'mock-win', '--driver-logging', '
fast/harness/results.html'], | 918 _, err, _ = logging_run(['--platform', 'mock-win', '--driver-logging', '
fast/harness/results.html'], |
| 865 tests_included=True, host=host) | 919 tests_included=True, host=host) |
| 866 self.assertTrue('OUT:' in err.getvalue()) | 920 self.assertTrue('OUT:' in err.getvalue()) |
| 867 | 921 |
| 868 def test_write_full_results_to(self): | 922 def test_write_full_results_to(self): |
| 869 host = MockHost() | 923 host = MockHost() |
| 870 details, _, _ = logging_run(['--write-full-results-to', '/tmp/full_resul
ts.json'], host=host) | 924 details, _, _ = logging_run(['--write-full-results-to', '/tmp/full_resul
ts.json'], host=host) |
| 871 self.assertEqual(details.exit_code, 0) | 925 self.assertEqual(details.exit_code, 0) |
| 872 self.assertTrue(host.filesystem.exists('/tmp/full_results.json')) | 926 self.assertTrue(host.filesystem.exists('/tmp/full_results.json')) |
| 873 | 927 |
| 874 | 928 |
| 875 class EndToEndTest(unittest.TestCase): | 929 class EndToEndTest(unittest.TestCase): |
| 930 |
| 876 def test_reftest_with_two_notrefs(self): | 931 def test_reftest_with_two_notrefs(self): |
| 877 # Test that we update expectations in place. If the expectation | 932 # Test that we update expectations in place. If the expectation |
| 878 # is missing, update the expected generic location. | 933 # is missing, update the expected generic location. |
| 879 host = MockHost() | 934 host = MockHost() |
| 880 _, _, _ = logging_run(['--no-show-results', 'reftests/foo/'], tests_incl
uded=True, host=host) | 935 _, _, _ = logging_run(['--no-show-results', 'reftests/foo/'], tests_incl
uded=True, host=host) |
| 881 file_list = host.filesystem.written_files.keys() | 936 file_list = host.filesystem.written_files.keys() |
| 882 | 937 |
| 883 json_string = host.filesystem.read_text_file('/tmp/layout-test-results/f
ailing_results.json') | 938 json_string = host.filesystem.read_text_file('/tmp/layout-test-results/f
ailing_results.json') |
| 884 json = parse_full_results(json_string) | 939 json = parse_full_results(json_string) |
| 885 self.assertTrue("multiple-match-success.html" not in json["tests"]["reft
ests"]["foo"]) | 940 self.assertTrue('multiple-match-success.html' not in json['tests']['reft
ests']['foo']) |
| 886 self.assertTrue("multiple-mismatch-success.html" not in json["tests"]["r
eftests"]["foo"]) | 941 self.assertTrue('multiple-mismatch-success.html' not in json['tests']['r
eftests']['foo']) |
| 887 self.assertTrue("multiple-both-success.html" not in json["tests"]["refte
sts"]["foo"]) | 942 self.assertTrue('multiple-both-success.html' not in json['tests']['refte
sts']['foo']) |
| 888 | 943 |
| 889 self.assertEqual(json["tests"]["reftests"]["foo"]["multiple-match-failur
e.html"], | 944 self.assertEqual(json['tests']['reftests']['foo']['multiple-match-failur
e.html'], |
| 890 {"expected": "PASS", "actual": "IMAGE", "reftest_type": ["=="], "is_
unexpected": True}) | 945 {'expected': 'PASS', 'actual': 'IMAGE', 'reftest_type':
['=='], 'is_unexpected': True}) |
| 891 self.assertEqual(json["tests"]["reftests"]["foo"]["multiple-mismatch-fai
lure.html"], | 946 self.assertEqual(json['tests']['reftests']['foo']['multiple-mismatch-fai
lure.html'], |
| 892 {"expected": "PASS", "actual": "IMAGE", "reftest_type": ["!="], "is_
unexpected": True}) | 947 {'expected': 'PASS', 'actual': 'IMAGE', 'reftest_type':
['!='], 'is_unexpected': True}) |
| 893 self.assertEqual(json["tests"]["reftests"]["foo"]["multiple-both-failure
.html"], | 948 self.assertEqual(json['tests']['reftests']['foo']['multiple-both-failure
.html'], |
| 894 {"expected": "PASS", "actual": "IMAGE", "reftest_type": ["==", "!="]
, "is_unexpected": True}) | 949 {'expected': 'PASS', 'actual': 'IMAGE', 'reftest_type':
['==', '!='], 'is_unexpected': True}) |
| 895 | 950 |
| 896 | 951 |
| 897 class RebaselineTest(unittest.TestCase, StreamTestingMixin): | 952 class RebaselineTest(unittest.TestCase, StreamTestingMixin): |
| 953 |
| 898 def assertBaselines(self, file_list, file, extensions, err): | 954 def assertBaselines(self, file_list, file, extensions, err): |
| 899 "assert that the file_list contains the baselines.""" | 955 'assert that the file_list contains the baselines.''' |
| 900 for ext in extensions: | 956 for ext in extensions: |
| 901 baseline = file + "-expected" + ext | 957 baseline = file + '-expected' + ext |
| 902 baseline_msg = 'Writing new expected result "%s"\n' % baseline | 958 baseline_msg = 'Writing new expected result "%s"\n' % baseline |
| 903 self.assertTrue(any(f.find(baseline) != -1 for f in file_list)) | 959 self.assertTrue(any(f.find(baseline) != -1 for f in file_list)) |
| 904 self.assertContains(err, baseline_msg) | 960 self.assertContains(err, baseline_msg) |
| 905 | 961 |
| 906 # FIXME: Add tests to ensure that we're *not* writing baselines when we're n
ot | 962 # FIXME: Add tests to ensure that we're *not* writing baselines when we're n
ot |
| 907 # supposed to be. | 963 # supposed to be. |
| 908 | 964 |
| 909 def test_reset_results(self): | 965 def test_reset_results(self): |
| 910 # Test that we update expectations in place. If the expectation | 966 # Test that we update expectations in place. If the expectation |
| 911 # is missing, update the expected generic location. | 967 # is missing, update the expected generic location. |
| 912 host = MockHost() | 968 host = MockHost() |
| 913 details, err, _ = logging_run( | 969 details, err, _ = logging_run( |
| 914 ['--pixel-tests', '--reset-results', 'passes/image.html', 'failures/
expected/missing_image.html'], | 970 ['--pixel-tests', '--reset-results', 'passes/image.html', 'failures/
expected/missing_image.html'], |
| 915 tests_included=True, host=host, new_results=True) | 971 tests_included=True, host=host, new_results=True) |
| 916 file_list = host.filesystem.written_files.keys() | 972 file_list = host.filesystem.written_files.keys() |
| 917 self.assertEqual(details.exit_code, 0) | 973 self.assertEqual(details.exit_code, 0) |
| 918 self.assertEqual(len(file_list), 8) | 974 self.assertEqual(len(file_list), 8) |
| 919 self.assertBaselines(file_list, "passes/image", [".txt", ".png"], err) | 975 self.assertBaselines(file_list, 'passes/image', ['.txt', '.png'], err) |
| 920 self.assertBaselines(file_list, "failures/expected/missing_image", [".tx
t", ".png"], err) | 976 self.assertBaselines(file_list, 'failures/expected/missing_image', ['.tx
t', '.png'], err) |
| 921 | 977 |
| 922 def test_missing_results(self): | 978 def test_missing_results(self): |
| 923 # Test that we update expectations in place. If the expectation | 979 # Test that we update expectations in place. If the expectation |
| 924 # is missing, update the expected generic location. | 980 # is missing, update the expected generic location. |
| 925 host = MockHost() | 981 host = MockHost() |
| 926 details, err, _ = logging_run(['--no-show-results', | 982 details, err, _ = logging_run(['--no-show-results', |
| 927 'failures/unexpected/missing_text.html', | 983 'failures/unexpected/missing_text.html', |
| 928 'failures/unexpected/missing_image.html', | 984 'failures/unexpected/missing_image.html', |
| 929 'failures/unexpected/missing_render_tree_dump.html'], | 985 'failures/unexpected/missing_render_tree_
dump.html'], |
| 930 tests_included=True, host=host, new_results=True) | 986 tests_included=True, host=host, new_result
s=True) |
| 931 file_list = host.filesystem.written_files.keys() | 987 file_list = host.filesystem.written_files.keys() |
| 932 self.assertEqual(details.exit_code, 3) | 988 self.assertEqual(details.exit_code, 3) |
| 933 self.assertEqual(len(file_list), 10) | 989 self.assertEqual(len(file_list), 10) |
| 934 self.assertBaselines(file_list, "failures/unexpected/missing_text", [".t
xt"], err) | 990 self.assertBaselines(file_list, 'failures/unexpected/missing_text', ['.t
xt'], err) |
| 935 self.assertBaselines(file_list, "platform/test/failures/unexpected/missi
ng_image", [".png"], err) | 991 self.assertBaselines(file_list, 'platform/test/failures/unexpected/missi
ng_image', ['.png'], err) |
| 936 self.assertBaselines(file_list, "platform/test/failures/unexpected/missi
ng_render_tree_dump", [".txt"], err) | 992 self.assertBaselines(file_list, 'platform/test/failures/unexpected/missi
ng_render_tree_dump', ['.txt'], err) |
| 937 | 993 |
| 938 def test_missing_results_not_added_if_expected_missing(self): | 994 def test_missing_results_not_added_if_expected_missing(self): |
| 939 # Test that we update expectations in place. If the expectation | 995 # Test that we update expectations in place. If the expectation |
| 940 # is missing, update the expected generic location. | 996 # is missing, update the expected generic location. |
| 941 host = MockHost() | 997 host = MockHost() |
| 942 options, parsed_args = run_webkit_tests.parse_args([]) | 998 options, parsed_args = run_webkit_tests.parse_args([]) |
| 943 | 999 |
| 944 port = test.TestPort(host, options=options) | 1000 port = test.TestPort(host, options=options) |
| 945 host.filesystem.write_text_file(port.path_to_generic_test_expectations_f
ile(), """ | 1001 host.filesystem.write_text_file(port.path_to_generic_test_expectations_f
ile(), """ |
| 946 Bug(foo) failures/unexpected/missing_text.html [ Missing ] | 1002 Bug(foo) failures/unexpected/missing_text.html [ Missing ] |
| 947 Bug(foo) failures/unexpected/missing_image.html [ NeedsRebaseline ] | 1003 Bug(foo) failures/unexpected/missing_image.html [ NeedsRebaseline ] |
| 948 Bug(foo) failures/unexpected/missing_audio.html [ NeedsManualRebaseline ] | 1004 Bug(foo) failures/unexpected/missing_audio.html [ NeedsManualRebaseline ] |
| 949 Bug(foo) failures/unexpected/missing_render_tree_dump.html [ Missing ] | 1005 Bug(foo) failures/unexpected/missing_render_tree_dump.html [ Missing ] |
| 950 """) | 1006 """) |
| 951 details, err, _ = logging_run(['--no-show-results', | 1007 details, err, _ = logging_run(['--no-show-results', |
| 952 'failures/unexpected/missing_text.html', | 1008 'failures/unexpected/missing_text.html', |
| 953 'failures/unexpected/missing_image.html', | 1009 'failures/unexpected/missing_image.html', |
| 954 'failures/unexpected/missing_audio.html', | 1010 'failures/unexpected/missing_audio.html', |
| 955 'failures/unexpected/missing_render_tree_dump.html'], | 1011 'failures/unexpected/missing_render_tree_
dump.html'], |
| 956 tests_included=True, host=host, new_results=True, port_obj=port) | 1012 tests_included=True, host=host, new_result
s=True, port_obj=port) |
| 957 file_list = host.filesystem.written_files.keys() | 1013 file_list = host.filesystem.written_files.keys() |
| 958 self.assertEqual(details.exit_code, 0) | 1014 self.assertEqual(details.exit_code, 0) |
| 959 self.assertEqual(len(file_list), 7) | 1015 self.assertEqual(len(file_list), 7) |
| 960 self.assertFalse(any('failures/unexpected/missing_text-expected' in file
for file in file_list)) | 1016 self.assertFalse(any('failures/unexpected/missing_text-expected' in file
for file in file_list)) |
| 961 self.assertFalse(any('failures/unexpected/missing_image-expected' in fil
e for file in file_list)) | 1017 self.assertFalse(any('failures/unexpected/missing_image-expected' in fil
e for file in file_list)) |
| 962 self.assertFalse(any('failures/unexpected/missing_render_tree_dump-expec
ted' in file for file in file_list)) | 1018 self.assertFalse(any('failures/unexpected/missing_render_tree_dump-expec
ted' in file for file in file_list)) |
| 963 | 1019 |
| 964 def test_missing_results_not_added_if_expected_missing_and_reset_results(sel
f): | 1020 def test_missing_results_not_added_if_expected_missing_and_reset_results(sel
f): |
| 965 # Test that we update expectations in place. If the expectation | 1021 # Test that we update expectations in place. If the expectation |
| 966 # is missing, update the expected generic location. | 1022 # is missing, update the expected generic location. |
| 967 host = MockHost() | 1023 host = MockHost() |
| 968 options, parsed_args = run_webkit_tests.parse_args(['--pixel-tests', '--
reset-results']) | 1024 options, parsed_args = run_webkit_tests.parse_args(['--pixel-tests', '--
reset-results']) |
| 969 | 1025 |
| 970 port = test.TestPort(host, options=options) | 1026 port = test.TestPort(host, options=options) |
| 971 host.filesystem.write_text_file(port.path_to_generic_test_expectations_f
ile(), """ | 1027 host.filesystem.write_text_file(port.path_to_generic_test_expectations_f
ile(), """ |
| 972 Bug(foo) failures/unexpected/missing_text.html [ Missing ] | 1028 Bug(foo) failures/unexpected/missing_text.html [ Missing ] |
| 973 Bug(foo) failures/unexpected/missing_image.html [ NeedsRebaseline ] | 1029 Bug(foo) failures/unexpected/missing_image.html [ NeedsRebaseline ] |
| 974 Bug(foo) failures/unexpected/missing_audio.html [ NeedsManualRebaseline ] | 1030 Bug(foo) failures/unexpected/missing_audio.html [ NeedsManualRebaseline ] |
| 975 Bug(foo) failures/unexpected/missing_render_tree_dump.html [ Missing ] | 1031 Bug(foo) failures/unexpected/missing_render_tree_dump.html [ Missing ] |
| 976 """) | 1032 """) |
| 977 details, err, _ = logging_run(['--pixel-tests', '--reset-results', | 1033 details, err, _ = logging_run(['--pixel-tests', '--reset-results', |
| 978 'failures/unexpected/missing_text.html', | 1034 'failures/unexpected/missing_text.html', |
| 979 'failures/unexpected/missing_image.html', | 1035 'failures/unexpected/missing_image.html', |
| 980 'failures/unexpected/missing_audio.html', | 1036 'failures/unexpected/missing_audio.html', |
| 981 'failures/unexpected/missing_render_tree_dump.html'], | 1037 'failures/unexpected/missing_render_tree_
dump.html'], |
| 982 tests_included=True, host=host, new_results=True, port_obj=port) | 1038 tests_included=True, host=host, new_result
s=True, port_obj=port) |
| 983 file_list = host.filesystem.written_files.keys() | 1039 file_list = host.filesystem.written_files.keys() |
| 984 self.assertEqual(details.exit_code, 0) | 1040 self.assertEqual(details.exit_code, 0) |
| 985 self.assertEqual(len(file_list), 11) | 1041 self.assertEqual(len(file_list), 11) |
| 986 self.assertBaselines(file_list, "failures/unexpected/missing_text", [".t
xt"], err) | 1042 self.assertBaselines(file_list, 'failures/unexpected/missing_text', ['.t
xt'], err) |
| 987 self.assertBaselines(file_list, "failures/unexpected/missing_image", [".
png"], err) | 1043 self.assertBaselines(file_list, 'failures/unexpected/missing_image', ['.
png'], err) |
| 988 self.assertBaselines(file_list, "failures/unexpected/missing_render_tree
_dump", [".txt"], err) | 1044 self.assertBaselines(file_list, 'failures/unexpected/missing_render_tree
_dump', ['.txt'], err) |
| 989 | 1045 |
| 990 def test_new_baseline(self): | 1046 def test_new_baseline(self): |
| 991 # Test that we update the platform expectations in the version-specific
directories | 1047 # Test that we update the platform expectations in the version-specific
directories |
| 992 # for both existing and new baselines. | 1048 # for both existing and new baselines. |
| 993 host = MockHost() | 1049 host = MockHost() |
| 994 details, err, _ = logging_run( | 1050 details, err, _ = logging_run( |
| 995 ['--pixel-tests', '--new-baseline', 'passes/image.html', 'failures/e
xpected/missing_image.html'], | 1051 ['--pixel-tests', '--new-baseline', 'passes/image.html', 'failures/e
xpected/missing_image.html'], |
| 996 tests_included=True, host=host, new_results=True) | 1052 tests_included=True, host=host, new_results=True) |
| 997 file_list = host.filesystem.written_files.keys() | 1053 file_list = host.filesystem.written_files.keys() |
| 998 self.assertEqual(details.exit_code, 0) | 1054 self.assertEqual(details.exit_code, 0) |
| 999 self.assertEqual(len(file_list), 8) | 1055 self.assertEqual(len(file_list), 8) |
| 1000 self.assertBaselines(file_list, | 1056 self.assertBaselines(file_list, |
| 1001 "platform/test-mac-leopard/passes/image", [".txt", ".png"], err) | 1057 'platform/test-mac-leopard/passes/image', ['.txt',
'.png'], err) |
| 1002 self.assertBaselines(file_list, | 1058 self.assertBaselines(file_list, |
| 1003 "platform/test-mac-leopard/failures/expected/missing_image", [".txt"
, ".png"], err) | 1059 'platform/test-mac-leopard/failures/expected/missin
g_image', ['.txt', '.png'], err) |
| 1004 | 1060 |
| 1005 | 1061 |
| 1006 class PortTest(unittest.TestCase): | 1062 class PortTest(unittest.TestCase): |
| 1063 |
| 1007 def assert_mock_port_works(self, port_name, args=[]): | 1064 def assert_mock_port_works(self, port_name, args=[]): |
| 1008 self.assertTrue(passing_run(args + ['--platform', 'mock-' + port_name, '
fast/harness/results.html'], tests_included=True, host=Host())) | 1065 self.assertTrue(passing_run(args + ['--platform', |
| 1066 'mock-' + port_name, |
| 1067 'fast/harness/results.html'], |
| 1068 tests_included=True, |
| 1069 host=Host())) |
| 1009 | 1070 |
| 1010 def disabled_test_mac_lion(self): | 1071 def disabled_test_mac_lion(self): |
| 1011 self.assert_mock_port_works('mac-lion') | 1072 self.assert_mock_port_works('mac-lion') |
| 1012 | 1073 |
| 1013 | 1074 |
| 1014 class MainTest(unittest.TestCase): | 1075 class MainTest(unittest.TestCase): |
| 1076 |
| 1015 def test_exception_handling(self): | 1077 def test_exception_handling(self): |
| 1016 orig_run_fn = run_webkit_tests.run | 1078 orig_run_fn = run_webkit_tests.run |
| 1017 | 1079 |
| 1018 # unused args pylint: disable=W0613 | 1080 # unused args pylint: disable=W0613 |
| 1019 def interrupting_run(port, options, args, stderr): | 1081 def interrupting_run(port, options, args, stderr): |
| 1020 raise KeyboardInterrupt | 1082 raise KeyboardInterrupt |
| 1021 | 1083 |
| 1022 def successful_run(port, options, args, stderr): | 1084 def successful_run(port, options, args, stderr): |
| 1023 | 1085 |
| 1024 class FakeRunDetails(object): | 1086 class FakeRunDetails(object): |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1049 def test_buildbot_results_are_printed_on_early_exit(self): | 1111 def test_buildbot_results_are_printed_on_early_exit(self): |
| 1050 # unused args pylint: disable=W0613 | 1112 # unused args pylint: disable=W0613 |
| 1051 stdout = StringIO.StringIO() | 1113 stdout = StringIO.StringIO() |
| 1052 stderr = StringIO.StringIO() | 1114 stderr = StringIO.StringIO() |
| 1053 res = run_webkit_tests.main(['--platform', 'test', '--exit-after-n-failu
res', '1', | 1115 res = run_webkit_tests.main(['--platform', 'test', '--exit-after-n-failu
res', '1', |
| 1054 'failures/unexpected/missing_text.html', | 1116 'failures/unexpected/missing_text.html', |
| 1055 'failures/unexpected/missing_image.html'], | 1117 'failures/unexpected/missing_image.html'], |
| 1056 stdout, stderr) | 1118 stdout, stderr) |
| 1057 self.assertEqual(res, test_run_results.EARLY_EXIT_STATUS) | 1119 self.assertEqual(res, test_run_results.EARLY_EXIT_STATUS) |
| 1058 self.assertEqual(stdout.getvalue(), | 1120 self.assertEqual(stdout.getvalue(), |
| 1059 ('\n' | 1121 ('\n' |
| 1060 'Regressions: Unexpected missing results (1)\n' | 1122 'Regressions: Unexpected missing results (1)\n' |
| 1061 ' failures/unexpected/missing_image.html [ Missing ]\n\n')) | 1123 ' failures/unexpected/missing_image.html [ Missing ]\
n\n')) |
| OLD | NEW |