OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # | 2 # |
3 # Copyright 2012 the V8 project authors. All rights reserved. | 3 # Copyright 2012 the V8 project authors. All rights reserved. |
4 # Redistribution and use in source and binary forms, with or without | 4 # Redistribution and use in source and binary forms, with or without |
5 # modification, are permitted provided that the following conditions are | 5 # modification, are permitted provided that the following conditions are |
6 # met: | 6 # met: |
7 # | 7 # |
8 # * Redistributions of source code must retain the above copyright | 8 # * Redistributions of source code must retain the above copyright |
9 # notice, this list of conditions and the following disclaimer. | 9 # notice, this list of conditions and the following disclaimer. |
10 # * Redistributions in binary form must reproduce the above | 10 # * Redistributions in binary form must reproduce the above |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 result.add_option("--no-i18n", "--noi18n", | 145 result.add_option("--no-i18n", "--noi18n", |
146 help="Skip internationalization tests", | 146 help="Skip internationalization tests", |
147 default=False, action="store_true") | 147 default=False, action="store_true") |
148 result.add_option("--no-network", "--nonetwork", | 148 result.add_option("--no-network", "--nonetwork", |
149 help="Don't distribute tests on the network", | 149 help="Don't distribute tests on the network", |
150 default=(utils.GuessOS() != "linux"), | 150 default=(utils.GuessOS() != "linux"), |
151 dest="no_network", action="store_true") | 151 dest="no_network", action="store_true") |
152 result.add_option("--no-presubmit", "--nopresubmit", | 152 result.add_option("--no-presubmit", "--nopresubmit", |
153 help='Skip presubmit checks', | 153 help='Skip presubmit checks', |
154 default=False, dest="no_presubmit", action="store_true") | 154 default=False, dest="no_presubmit", action="store_true") |
| 155 result.add_option("--no-repeat-failures", help="Don't rerun failed tests", |
| 156 default=False, action="store_true") |
155 result.add_option("--no-snap", "--nosnap", | 157 result.add_option("--no-snap", "--nosnap", |
156 help='Test a build compiled without snapshot.', | 158 help='Test a build compiled without snapshot.', |
157 default=False, dest="no_snap", action="store_true") | 159 default=False, dest="no_snap", action="store_true") |
158 result.add_option("--no-stress", "--nostress", | 160 result.add_option("--no-stress", "--nostress", |
159 help="Don't run crankshaft --always-opt --stress-op test", | 161 help="Don't run crankshaft --always-opt --stress-op test", |
160 default=False, dest="no_stress", action="store_true") | 162 default=False, dest="no_stress", action="store_true") |
161 result.add_option("--no-variants", "--novariants", | 163 result.add_option("--no-variants", "--novariants", |
162 help="Don't run any testing variants", | 164 help="Don't run any testing variants", |
163 default=False, dest="no_variants", action="store_true") | 165 default=False, dest="no_variants", action="store_true") |
164 result.add_option("--variants", | 166 result.add_option("--variants", |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 | 367 |
366 for (arch, mode) in options.arch_and_mode: | 368 for (arch, mode) in options.arch_and_mode: |
367 try: | 369 try: |
368 code = Execute(arch, mode, args, options, suites, workspace) | 370 code = Execute(arch, mode, args, options, suites, workspace) |
369 except KeyboardInterrupt: | 371 except KeyboardInterrupt: |
370 return 2 | 372 return 2 |
371 exit_code = exit_code or code | 373 exit_code = exit_code or code |
372 return exit_code | 374 return exit_code |
373 | 375 |
374 | 376 |
| 377 def RunTests(suites, num_tests, ctx, options, workspace): |
| 378 # Run the tests, either locally or distributed on the network. |
| 379 try: |
| 380 start_time = time.time() |
| 381 progress_indicator = progress.PROGRESS_INDICATORS[options.progress]() |
| 382 if options.junitout: |
| 383 progress_indicator = progress.JUnitTestProgressIndicator( |
| 384 progress_indicator, options.junitout, options.junittestsuite) |
| 385 |
| 386 run_networked = not options.no_network |
| 387 if not run_networked: |
| 388 print("Network distribution disabled, running tests locally.") |
| 389 elif utils.GuessOS() != "linux": |
| 390 print("Network distribution is only supported on Linux, sorry!") |
| 391 run_networked = False |
| 392 peers = [] |
| 393 if run_networked: |
| 394 peers = network_execution.GetPeers() |
| 395 if not peers: |
| 396 print("No connection to distribution server; running tests locally.") |
| 397 run_networked = False |
| 398 elif len(peers) == 1: |
| 399 print("No other peers on the network; running tests locally.") |
| 400 run_networked = False |
| 401 elif num_tests <= 100: |
| 402 print("Less than 100 tests, running them locally.") |
| 403 run_networked = False |
| 404 |
| 405 if run_networked: |
| 406 runner = network_execution.NetworkedRunner(suites, progress_indicator, |
| 407 ctx, peers, workspace) |
| 408 else: |
| 409 runner = execution.Runner(suites, progress_indicator, ctx) |
| 410 |
| 411 # TODO(machenbach): Maybe use single thread for reruns? |
| 412 exit_code = runner.Run(options.j) |
| 413 if runner.terminate: |
| 414 return [], exit_code |
| 415 overall_duration = time.time() - start_time |
| 416 except KeyboardInterrupt: |
| 417 raise |
| 418 |
| 419 if options.time: |
| 420 verbose.PrintTestDurations(suites, overall_duration) |
| 421 return runner.FailedTests(), exit_code |
| 422 |
| 423 |
375 def Execute(arch, mode, args, options, suites, workspace): | 424 def Execute(arch, mode, args, options, suites, workspace): |
376 print(">>> Running tests for %s.%s" % (arch, mode)) | 425 print(">>> Running tests for %s.%s" % (arch, mode)) |
377 | 426 |
378 shell_dir = options.shell_dir | 427 shell_dir = options.shell_dir |
379 if not shell_dir: | 428 if not shell_dir: |
380 if options.buildbot: | 429 if options.buildbot: |
381 shell_dir = os.path.join(workspace, options.outdir, mode) | 430 shell_dir = os.path.join(workspace, options.outdir, mode) |
382 mode = mode.lower() | 431 mode = mode.lower() |
383 else: | 432 else: |
384 shell_dir = os.path.join(workspace, options.outdir, | 433 shell_dir = os.path.join(workspace, options.outdir, |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 if options.cat: | 500 if options.cat: |
452 return 0 # We're done here. | 501 return 0 # We're done here. |
453 | 502 |
454 if options.report: | 503 if options.report: |
455 verbose.PrintReport(all_tests) | 504 verbose.PrintReport(all_tests) |
456 | 505 |
457 if num_tests == 0: | 506 if num_tests == 0: |
458 print "No tests to run." | 507 print "No tests to run." |
459 return 0 | 508 return 0 |
460 | 509 |
461 # Run the tests, either locally or distributed on the network. | 510 failed_tests, exit_code = RunTests( |
462 try: | 511 suites, num_tests, ctx, options, workspace) |
463 start_time = time.time() | 512 if not failed_tests or options.no_repeat_failures: |
464 progress_indicator = progress.PROGRESS_INDICATORS[options.progress]() | 513 return exit_code |
465 if options.junitout: | |
466 progress_indicator = progress.JUnitTestProgressIndicator( | |
467 progress_indicator, options.junitout, options.junittestsuite) | |
468 | 514 |
469 run_networked = not options.no_network | 515 # TODO(machenbach): Additional features: Rerun count, max rerun test cases, |
470 if not run_networked: | 516 # rerun dependent on test timing (i.e. don't rerun very slow tests), group |
471 print("Network distribution disabled, running tests locally.") | 517 # flakes, e.g. flaky crashes, flaky failures. |
472 elif utils.GuessOS() != "linux": | 518 print(">>> Rerunning failures for %s.%s" % (arch, mode)) |
473 print("Network distribution is only supported on Linux, sorry!") | 519 num_tests = 0 |
474 run_networked = False | 520 for s in suites: |
475 peers = [] | 521 s.tests = [t.Copy() for t in failed_tests if t in s.tests] |
476 if run_networked: | 522 num_tests += len(s.tests) |
477 peers = network_execution.GetPeers() | |
478 if not peers: | |
479 print("No connection to distribution server; running tests locally.") | |
480 run_networked = False | |
481 elif len(peers) == 1: | |
482 print("No other peers on the network; running tests locally.") | |
483 run_networked = False | |
484 elif num_tests <= 100: | |
485 print("Less than 100 tests, running them locally.") | |
486 run_networked = False | |
487 | 523 |
488 if run_networked: | 524 # TODO(machenbach): Use exit_code of final result as soon as flakes can be |
489 runner = network_execution.NetworkedRunner(suites, progress_indicator, | 525 # displayed as warnings. For now, the rerun is just FYI. |
490 ctx, peers, workspace) | 526 # TODO(machenbach): Never hide failures in gc-stress mode. |
491 else: | 527 failed_tests, _ = RunTests( |
492 runner = execution.Runner(suites, progress_indicator, ctx) | 528 suites, num_tests, ctx, options, workspace) |
493 | |
494 exit_code = runner.Run(options.j) | |
495 if runner.terminate: | |
496 return exit_code | |
497 overall_duration = time.time() - start_time | |
498 except KeyboardInterrupt: | |
499 raise | |
500 | |
501 if options.time: | |
502 verbose.PrintTestDurations(suites, overall_duration) | |
503 return exit_code | 529 return exit_code |
504 | 530 |
505 | 531 |
506 if __name__ == "__main__": | 532 if __name__ == "__main__": |
507 sys.exit(Main()) | 533 sys.exit(Main()) |
OLD | NEW |