Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """A tool to run a chrome test executable, used by the buildbot slaves. | 6 """A tool to run a chrome test executable, used by the buildbot slaves. |
| 7 | 7 |
| 8 When this is run, the current directory (cwd) should be the outer build | 8 When this is run, the current directory (cwd) should be the outer build |
| 9 directory (e.g., chrome-release/build/). | 9 directory (e.g., chrome-release/build/). |
| 10 | 10 |
| (...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 641 | 641 |
| 642 if options.parallel: | 642 if options.parallel: |
| 643 command = _BuildParallelCommand(build_dir, test_exe_path, options) | 643 command = _BuildParallelCommand(build_dir, test_exe_path, options) |
| 644 elif options.run_shell_script: | 644 elif options.run_shell_script: |
| 645 command = ['bash', test_exe_path] | 645 command = ['bash', test_exe_path] |
| 646 elif options.run_python_script: | 646 elif options.run_python_script: |
| 647 command = [sys.executable, test_exe] | 647 command = [sys.executable, test_exe] |
| 648 else: | 648 else: |
| 649 command = [test_exe_path] | 649 command = [test_exe_path] |
| 650 command.extend(args[1:]) | 650 command.extend(args[1:]) |
| 651 if options.pass_build_dir: | |
| 652 command.append('--build-dir=' + build_dir) | |
|
M-A Ruel
2013/10/06 20:32:26
In general I prefer using 2 separate arguments, e.
| |
| 651 | 653 |
| 652 if list_parsers(options.annotate): | 654 if list_parsers(options.annotate): |
| 653 return 0 | 655 return 0 |
| 654 tracker_class = select_results_tracker(options.annotate, | 656 tracker_class = select_results_tracker(options.annotate, |
| 655 options.generate_json_file) | 657 options.generate_json_file) |
| 656 results_tracker = create_results_tracker(tracker_class, options) | 658 results_tracker = create_results_tracker(tracker_class, options) |
| 657 | 659 |
| 658 if options.generate_json_file: | 660 if options.generate_json_file: |
| 659 if os.path.exists(options.test_output_xml): | 661 if os.path.exists(options.test_output_xml): |
| 660 # remove the old XML output file. | 662 # remove the old XML output file. |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 732 # If first argument is not in the correct format, log a warning but | 734 # If first argument is not in the correct format, log a warning but |
| 733 # fall back to assuming the first arg is the test_name and just run | 735 # fall back to assuming the first arg is the test_name and just run |
| 734 # on the iphone simulator. | 736 # on the iphone simulator. |
| 735 test_name = args[0] | 737 test_name = args[0] |
| 736 print ('Can\'t parse test name, device, and iOS version. ' | 738 print ('Can\'t parse test name, device, and iOS version. ' |
| 737 'Running %s on %s %s' % (test_name, device, ios_version)) | 739 'Running %s on %s %s' % (test_name, device, ios_version)) |
| 738 | 740 |
| 739 # Build the args for invoking iossim, which will install the app on the | 741 # Build the args for invoking iossim, which will install the app on the |
| 740 # simulator and launch it, then dump the test results to stdout. | 742 # simulator and launch it, then dump the test results to stdout. |
| 741 | 743 |
| 742 # Note that the first object (build_dir) returned from the following | 744 build_dir, app_exe_path = get_build_dir_and_exe_path_mac( |
| 743 # method invocations is ignored because only the app executable is needed. | |
| 744 _, app_exe_path = get_build_dir_and_exe_path_mac( | |
| 745 options, | 745 options, |
| 746 options.target + '-iphonesimulator', | 746 options.target + '-iphonesimulator', |
| 747 test_name + '.app') | 747 test_name + '.app') |
| 748 | 748 |
| 749 # Note that the first object (build_dir) returned from the following | |
| 750 # method invocations is ignored because only the app executable is needed. | |
| 749 _, test_exe_path = get_build_dir_and_exe_path_mac(options, | 751 _, test_exe_path = get_build_dir_and_exe_path_mac(options, |
| 750 os.path.join('ninja-iossim', options.target), | 752 os.path.join('ninja-iossim', options.target), |
| 751 'iossim') | 753 'iossim') |
| 752 command = [test_exe_path, | 754 command = [test_exe_path, |
| 753 '-d', device, | 755 '-d', device, |
| 754 '-s', ios_version, | 756 '-s', ios_version, |
| 755 app_exe_path, '--' | 757 app_exe_path, '--' |
| 756 ] | 758 ] |
| 757 command.extend(args[1:]) | 759 command.extend(args[1:]) |
| 760 if options.pass_build_dir: | |
| 761 command.append('--build-dir=' + build_dir) | |
| 758 | 762 |
| 759 if list_parsers(options.annotate): | 763 if list_parsers(options.annotate): |
| 760 return 0 | 764 return 0 |
| 761 results_tracker = create_results_tracker(get_parsers()['gtest'], options) | 765 results_tracker = create_results_tracker(get_parsers()['gtest'], options) |
| 762 | 766 |
| 763 # Make sure the simulator isn't running. | 767 # Make sure the simulator isn't running. |
| 764 kill_simulator() | 768 kill_simulator() |
| 765 | 769 |
| 766 # Nuke anything that appears to be stale chrome items in the temporary | 770 # Nuke anything that appears to be stale chrome items in the temporary |
| 767 # directory from previous test runs (i.e.- from crashes or unittest leaks). | 771 # directory from previous test runs (i.e.- from crashes or unittest leaks). |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 888 | 892 |
| 889 if options.parallel: | 893 if options.parallel: |
| 890 command = _BuildParallelCommand(build_dir, test_exe_path, options) | 894 command = _BuildParallelCommand(build_dir, test_exe_path, options) |
| 891 elif options.run_shell_script: | 895 elif options.run_shell_script: |
| 892 command = ['bash', test_exe_path] | 896 command = ['bash', test_exe_path] |
| 893 elif options.run_python_script: | 897 elif options.run_python_script: |
| 894 command = [sys.executable, test_exe] | 898 command = [sys.executable, test_exe] |
| 895 else: | 899 else: |
| 896 command = [test_exe_path] | 900 command = [test_exe_path] |
| 897 command.extend(args[1:]) | 901 command.extend(args[1:]) |
| 902 if options.pass_build_dir: | |
| 903 command.append('--build-dir=' + build_dir) | |
| 898 | 904 |
| 899 if list_parsers(options.annotate): | 905 if list_parsers(options.annotate): |
| 900 return 0 | 906 return 0 |
| 901 tracker_class = select_results_tracker(options.annotate, | 907 tracker_class = select_results_tracker(options.annotate, |
| 902 options.generate_json_file) | 908 options.generate_json_file) |
| 903 results_tracker = create_results_tracker(tracker_class, options) | 909 results_tracker = create_results_tracker(tracker_class, options) |
| 904 | 910 |
| 905 if options.generate_json_file: | 911 if options.generate_json_file: |
| 906 if os.path.exists(options.test_output_xml): | 912 if os.path.exists(options.test_output_xml): |
| 907 # remove the old XML output file. | 913 # remove the old XML output file. |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1006 # build_dir/target/ directory. | 1012 # build_dir/target/ directory. |
| 1007 if options.factory_properties.get('asan'): | 1013 if options.factory_properties.get('asan'): |
| 1008 logfile = test_exe_path + '.asan_log' | 1014 logfile = test_exe_path + '.asan_log' |
| 1009 command = ['%s' % os.path.join(build_dir, | 1015 command = ['%s' % os.path.join(build_dir, |
| 1010 options.target, | 1016 options.target, |
| 1011 'agent_logger.exe'), | 1017 'agent_logger.exe'), |
| 1012 'start', | 1018 'start', |
| 1013 '--output-file=%s' % logfile, | 1019 '--output-file=%s' % logfile, |
| 1014 '--'] + command | 1020 '--'] + command |
| 1015 command.extend(args[1:]) | 1021 command.extend(args[1:]) |
| 1022 if options.pass_build_dir: | |
| 1023 command.append('--build-dir=' + build_dir) | |
| 1016 | 1024 |
| 1017 # Nuke anything that appears to be stale chrome items in the temporary | 1025 # Nuke anything that appears to be stale chrome items in the temporary |
| 1018 # directory from previous test runs (i.e.- from crashes or unittest leaks). | 1026 # directory from previous test runs (i.e.- from crashes or unittest leaks). |
| 1019 slave_utils.RemoveChromeTemporaryFiles() | 1027 slave_utils.RemoveChromeTemporaryFiles() |
| 1020 | 1028 |
| 1021 if list_parsers(options.annotate): | 1029 if list_parsers(options.annotate): |
| 1022 return 0 | 1030 return 0 |
| 1023 tracker_class = select_results_tracker(options.annotate, | 1031 tracker_class = select_results_tracker(options.annotate, |
| 1024 options.generate_json_file) | 1032 options.generate_json_file) |
| 1025 results_tracker = create_results_tracker(tracker_class, options) | 1033 results_tracker = create_results_tracker(tracker_class, options) |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1132 datefmt='%y%m%d %H:%M:%S') | 1140 datefmt='%y%m%d %H:%M:%S') |
| 1133 | 1141 |
| 1134 option_parser = optparse.OptionParser(usage=USAGE) | 1142 option_parser = optparse.OptionParser(usage=USAGE) |
| 1135 | 1143 |
| 1136 # Since the trailing program to run may have has command-line args of its | 1144 # Since the trailing program to run may have has command-line args of its |
| 1137 # own, we need to stop parsing when we reach the first positional argument. | 1145 # own, we need to stop parsing when we reach the first positional argument. |
| 1138 option_parser.disable_interspersed_args() | 1146 option_parser.disable_interspersed_args() |
| 1139 | 1147 |
| 1140 option_parser.add_option('', '--target', default='Release', | 1148 option_parser.add_option('', '--target', default='Release', |
| 1141 help='build target (Debug or Release)') | 1149 help='build target (Debug or Release)') |
| 1150 option_parser.add_option('--pass-target', action='store_true', default=False, | |
| 1151 help='pass --target to the spawned test script') | |
| 1142 option_parser.add_option('', '--build-dir', | 1152 option_parser.add_option('', '--build-dir', |
| 1143 help='path to main build directory (the parent of ' | 1153 help='path to main build directory (the parent of ' |
| 1144 'the Release or Debug directory)') | 1154 'the Release or Debug directory)') |
| 1155 option_parser.add_option('--pass-build-dir', action='store_true', | |
| 1156 default=False, | |
| 1157 help='pass --build-dir to the spawned test script') | |
| 1145 option_parser.add_option('', '--enable-pageheap', action='store_true', | 1158 option_parser.add_option('', '--enable-pageheap', action='store_true', |
| 1146 default=False, | 1159 default=False, |
| 1147 help='enable pageheap checking for chrome.exe') | 1160 help='enable pageheap checking for chrome.exe') |
| 1148 # --with-httpd assumes a chromium checkout with src/tools/python. | 1161 # --with-httpd assumes a chromium checkout with src/tools/python. |
| 1149 option_parser.add_option('', '--with-httpd', dest='document_root', | 1162 option_parser.add_option('', '--with-httpd', dest='document_root', |
| 1150 default=None, metavar='DOC_ROOT', | 1163 default=None, metavar='DOC_ROOT', |
| 1151 help='Start a local httpd server using the given ' | 1164 help='Start a local httpd server using the given ' |
| 1152 'document root, relative to the current dir') | 1165 'document root, relative to the current dir') |
| 1153 option_parser.add_option('', '--total-shards', dest='total_shards', | 1166 option_parser.add_option('', '--total-shards', dest='total_shards', |
| 1154 default=None, type='int', | 1167 default=None, type='int', |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1253 'step_name', '') | 1266 'step_name', '') |
| 1254 | 1267 |
| 1255 if options.run_shell_script and options.run_python_script: | 1268 if options.run_shell_script and options.run_python_script: |
| 1256 sys.stderr.write('Use either --run-shell-script OR --run-python-script, ' | 1269 sys.stderr.write('Use either --run-shell-script OR --run-python-script, ' |
| 1257 'not both.') | 1270 'not both.') |
| 1258 return 1 | 1271 return 1 |
| 1259 | 1272 |
| 1260 # Print out builder name for log_parser | 1273 # Print out builder name for log_parser |
| 1261 print '[Running on builder: "%s"]' % options.builder_name | 1274 print '[Running on builder: "%s"]' % options.builder_name |
| 1262 | 1275 |
| 1276 if options.pass_target and options.target: | |
| 1277 args.append('--target=' + options.target) | |
| 1278 # TODO(thakis): Unify build_dir logic and handle pass_build_dir here too. | |
| 1279 | |
| 1263 # Some test suites are not yet green under LSan, so do not enable LSan for | 1280 # Some test suites are not yet green under LSan, so do not enable LSan for |
| 1264 # them by default. Bots can override this behavior with lsan_run_all_tests. | 1281 # them by default. Bots can override this behavior with lsan_run_all_tests. |
| 1265 lsan_blacklist = [ | 1282 lsan_blacklist = [ |
| 1266 'browser_tests', | 1283 'browser_tests', |
| 1267 'content_browsertests', | 1284 'content_browsertests', |
| 1268 'interactive_ui_tests', | 1285 'interactive_ui_tests', |
| 1269 ] | 1286 ] |
| 1270 options.enable_lsan = (options.enable_lsan or | 1287 options.enable_lsan = (options.enable_lsan or |
| 1271 (options.factory_properties.get('lsan', False) and | 1288 (options.factory_properties.get('lsan', False) and |
| 1272 (options.factory_properties.get('lsan_run_all_tests', False) or | 1289 (options.factory_properties.get('lsan_run_all_tests', False) or |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1388 '%d new files were left in %s: Fix the tests to clean up themselves.' | 1405 '%d new files were left in %s: Fix the tests to clean up themselves.' |
| 1389 ) % ((new_temp_files - temp_files), tempfile.gettempdir()) | 1406 ) % ((new_temp_files - temp_files), tempfile.gettempdir()) |
| 1390 # TODO(maruel): Make it an error soon. Not yet since I want to iron out all | 1407 # TODO(maruel): Make it an error soon. Not yet since I want to iron out all |
| 1391 # the remaining cases before. | 1408 # the remaining cases before. |
| 1392 #result = 1 | 1409 #result = 1 |
| 1393 return result | 1410 return result |
| 1394 | 1411 |
| 1395 | 1412 |
| 1396 if '__main__' == __name__: | 1413 if '__main__' == __name__: |
| 1397 sys.exit(main()) | 1414 sys.exit(main()) |
| OLD | NEW |