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 19 matching lines...) Expand all Loading... | |
| 30 # which I really don't understand). | 30 # which I really don't understand). |
| 31 sys.path.insert(0, os.path.abspath('src/tools/python')) | 31 sys.path.insert(0, os.path.abspath('src/tools/python')) |
| 32 | 32 |
| 33 # Because of this dependency on a chromium checkout, we need to disable some | 33 # Because of this dependency on a chromium checkout, we need to disable some |
| 34 # pylint checks. | 34 # pylint checks. |
| 35 # pylint: disable=E0611 | 35 # pylint: disable=E0611 |
| 36 # pylint: disable=E1101 | 36 # pylint: disable=E1101 |
| 37 from common import chromium_utils | 37 from common import chromium_utils |
| 38 from slave import gtest_slave_utils | 38 from slave import gtest_slave_utils |
| 39 from slave import slave_utils | 39 from slave import slave_utils |
| 40 from slave import webpagereplay | |
| 40 from slave import xvfb | 41 from slave import xvfb |
| 41 import config | 42 import config |
| 42 | 43 |
| 43 USAGE = '%s [options] test.exe [test args]' % os.path.basename(sys.argv[0]) | 44 USAGE = '%s [options] test.exe [test args]' % os.path.basename(sys.argv[0]) |
| 44 | 45 |
| 45 DEST_DIR = 'gtest_results' | 46 DEST_DIR = 'gtest_results' |
| 46 | 47 |
| 47 HTTPD_CONF = { | 48 HTTPD_CONF = { |
| 48 'linux': 'httpd2_linux.conf', | 49 'linux': 'httpd2_linux.conf', |
| 49 'mac': 'httpd2_mac.conf', | 50 'mac': 'httpd2_mac.conf', |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 164 document_root) | 165 document_root) |
| 165 stop_cmd = platform_util.GetStopHttpdCommand() | 166 stop_cmd = platform_util.GetStopHttpdCommand() |
| 166 http_server = google.httpd_utils.ApacheHttpd(start_cmd, stop_cmd, [8000]) | 167 http_server = google.httpd_utils.ApacheHttpd(start_cmd, stop_cmd, [8000]) |
| 167 try: | 168 try: |
| 168 http_server.StartServer() | 169 http_server.StartServer() |
| 169 except google.httpd_utils.HttpdNotStarted, e: | 170 except google.httpd_utils.HttpdNotStarted, e: |
| 170 raise google.httpd_utils.HttpdNotStarted('%s. See log file in %s' % | 171 raise google.httpd_utils.HttpdNotStarted('%s. See log file in %s' % |
| 171 (e, output_dir)) | 172 (e, output_dir)) |
| 172 return http_server | 173 return http_server |
| 173 | 174 |
| 175 def start_wpr_server(platform, build_dir, test_exe_path, data_dir, | |
|
James Simonsen
2012/04/05 00:34:03
platform is unused.
| |
| 176 wpr_dir=None): | |
| 177 """Start Web Page Replay server. | |
| 178 | |
| 179 WPR makes it easy to record all the resources for a web page and serve | |
| 180 that page with a simulated network. | |
| 181 """ | |
| 182 # Name the output directory for the exe, without its path or suffix. | |
| 183 # e.g., chrome-release/httpd_logs/unit_tests/ | |
| 184 test_exe_name = os.path.splitext(os.path.basename(test_exe_path))[0] | |
| 185 output_dir = os.path.join(slave_utils.SlaveBaseDir(build_dir), | |
| 186 'webpagereplay_logs', | |
| 187 test_exe_name) | |
| 188 if wpr_dir is None: | |
| 189 wpr_dir = os.path.abspath(os.path.join( | |
| 190 __file__, '..', '..', '..', 'third_party', 'webpagereplay')) | |
| 191 data_dir = os.path.abspath(data_dir) | |
| 192 wpr_server = webpagereplay.ReplayLauncher(wpr_dir, data_dir, output_dir) | |
| 193 wpr_server.StartServer() | |
| 194 return wpr_server | |
| 195 | |
| 174 def main_mac(options, args): | 196 def main_mac(options, args): |
| 175 if len(args) < 1: | 197 if len(args) < 1: |
| 176 raise chromium_utils.MissingArgument('Usage: %s' % USAGE) | 198 raise chromium_utils.MissingArgument('Usage: %s' % USAGE) |
| 177 | 199 |
| 178 test_exe = args[0] | 200 test_exe = args[0] |
| 179 build_dir = os.path.normpath(os.path.abspath(options.build_dir)) | 201 build_dir = os.path.normpath(os.path.abspath(options.build_dir)) |
| 180 test_exe_path = os.path.join(build_dir, options.target, test_exe) | 202 test_exe_path = os.path.join(build_dir, options.target, test_exe) |
| 181 if not os.path.exists(test_exe_path): | 203 if not os.path.exists(test_exe_path): |
| 182 pre = 'Unable to find %s\n' % test_exe_path | 204 pre = 'Unable to find %s\n' % test_exe_path |
| 183 | 205 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 223 results_tracker = None | 245 results_tracker = None |
| 224 if options.generate_json_file: | 246 if options.generate_json_file: |
| 225 results_tracker = gtest_slave_utils.GTestUnexpectedDeathTracker() | 247 results_tracker = gtest_slave_utils.GTestUnexpectedDeathTracker() |
| 226 | 248 |
| 227 if os.path.exists(options.test_output_xml): | 249 if os.path.exists(options.test_output_xml): |
| 228 # remove the old XML output file. | 250 # remove the old XML output file. |
| 229 os.remove(options.test_output_xml) | 251 os.remove(options.test_output_xml) |
| 230 | 252 |
| 231 try: | 253 try: |
| 232 http_server = None | 254 http_server = None |
| 255 webpagereplay_server = None | |
| 233 if options.document_root: | 256 if options.document_root: |
| 234 http_server = start_http_server('mac', build_dir=build_dir, | 257 http_server = start_http_server('mac', build_dir=build_dir, |
| 235 test_exe_path=test_exe_path, | 258 test_exe_path=test_exe_path, |
| 236 document_root=options.document_root) | 259 document_root=options.document_root) |
| 260 if options.enable_wpr: | |
| 261 webpagereplay_server = start_wpr_server( | |
| 262 'mac', build_dir=build_dir, test_exe_path=test_exe_path, | |
| 263 data_dir=os.path.join(options.document_root, 'webpagereplay')) | |
| 237 result = _RunGTestCommand(command, results_tracker) | 264 result = _RunGTestCommand(command, results_tracker) |
| 238 finally: | 265 finally: |
| 239 if http_server: | 266 if http_server: |
| 240 http_server.StopServer() | 267 http_server.StopServer() |
| 268 if webpagereplay_server: | |
| 269 webpagereplay_server.StopServer() | |
| 241 | 270 |
| 242 if options.generate_json_file: | 271 if options.generate_json_file: |
| 243 _GenerateJSONForTestResults(options, results_tracker) | 272 _GenerateJSONForTestResults(options, results_tracker) |
| 244 | 273 |
| 245 return result | 274 return result |
| 246 | 275 |
| 247 def main_linux(options, args): | 276 def main_linux(options, args): |
| 248 if len(args) < 1: | 277 if len(args) < 1: |
| 249 raise chromium_utils.MissingArgument('Usage: %s' % USAGE) | 278 raise chromium_utils.MissingArgument('Usage: %s' % USAGE) |
| 250 | 279 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 329 results_tracker = None | 358 results_tracker = None |
| 330 if options.generate_json_file: | 359 if options.generate_json_file: |
| 331 results_tracker = gtest_slave_utils.GTestUnexpectedDeathTracker() | 360 results_tracker = gtest_slave_utils.GTestUnexpectedDeathTracker() |
| 332 | 361 |
| 333 if os.path.exists(options.test_output_xml): | 362 if os.path.exists(options.test_output_xml): |
| 334 # remove the old XML output file. | 363 # remove the old XML output file. |
| 335 os.remove(options.test_output_xml) | 364 os.remove(options.test_output_xml) |
| 336 | 365 |
| 337 try: | 366 try: |
| 338 http_server = None | 367 http_server = None |
| 368 webpagereplay_server = None | |
| 339 if options.document_root: | 369 if options.document_root: |
| 340 http_server = start_http_server('linux', build_dir=build_dir, | 370 http_server = start_http_server('linux', build_dir=build_dir, |
| 341 test_exe_path=test_exe_path, | 371 test_exe_path=test_exe_path, |
| 342 document_root=options.document_root) | 372 document_root=options.document_root) |
| 373 if options.enable_wpr: | |
| 374 webpagereplay_server = start_wpr_server( | |
| 375 'linux', build_dir=build_dir, test_exe_path=test_exe_path, | |
| 376 data_dir=os.path.join(options.document_root, 'webpagereplay')) | |
| 343 if options.xvfb: | 377 if options.xvfb: |
| 344 xvfb.StartVirtualX( | 378 xvfb.StartVirtualX( |
| 345 slave_name, bin_dir, | 379 slave_name, bin_dir, |
| 346 with_wm=options.factory_properties.get('window_manager', True), | 380 with_wm=options.factory_properties.get('window_manager', True), |
| 347 server_dir=special_xvfb_dir) | 381 server_dir=special_xvfb_dir) |
| 348 if options.factory_properties.get('asan', False): | 382 if options.factory_properties.get('asan', False): |
| 349 symbolize = os.path.abspath(os.path.join('src', 'third_party', 'asan', | 383 symbolize = os.path.abspath(os.path.join('src', 'third_party', 'asan', |
| 350 'scripts', 'asan_symbolize.py')) | 384 'scripts', 'asan_symbolize.py')) |
| 351 pipes = [[sys.executable, symbolize], ['c++filt']] | 385 pipes = [[sys.executable, symbolize], ['c++filt']] |
| 352 result = _RunGTestCommand(command, pipes=pipes) | 386 result = _RunGTestCommand(command, pipes=pipes) |
| 353 else: | 387 else: |
| 354 result = _RunGTestCommand(command, results_tracker) | 388 result = _RunGTestCommand(command, results_tracker) |
| 355 finally: | 389 finally: |
| 356 if http_server: | 390 if http_server: |
| 357 http_server.StopServer() | 391 http_server.StopServer() |
| 392 if webpagereplay_server: | |
| 393 webpagereplay_server.StopServer() | |
| 358 if options.xvfb: | 394 if options.xvfb: |
| 359 xvfb.StopVirtualX(slave_name) | 395 xvfb.StopVirtualX(slave_name) |
| 360 | 396 |
| 361 if options.generate_json_file: | 397 if options.generate_json_file: |
| 362 _GenerateJSONForTestResults(options, results_tracker) | 398 _GenerateJSONForTestResults(options, results_tracker) |
| 363 | 399 |
| 364 return result | 400 return result |
| 365 | 401 |
| 366 def main_win(options, args): | 402 def main_win(options, args): |
| 367 """Using the target build configuration, run the executable given in the | 403 """Using the target build configuration, run the executable given in the |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 452 help='path to main build directory (the parent of ' | 488 help='path to main build directory (the parent of ' |
| 453 'the Release or Debug directory)') | 489 'the Release or Debug directory)') |
| 454 option_parser.add_option('', '--enable-pageheap', action='store_true', | 490 option_parser.add_option('', '--enable-pageheap', action='store_true', |
| 455 default=False, | 491 default=False, |
| 456 help='enable pageheap checking for chrome.exe') | 492 help='enable pageheap checking for chrome.exe') |
| 457 # --with-httpd assumes a chromium checkout with src/tools/python. | 493 # --with-httpd assumes a chromium checkout with src/tools/python. |
| 458 option_parser.add_option('', '--with-httpd', dest='document_root', | 494 option_parser.add_option('', '--with-httpd', dest='document_root', |
| 459 default=None, metavar='DOC_ROOT', | 495 default=None, metavar='DOC_ROOT', |
| 460 help='Start a local httpd server using the given ' | 496 help='Start a local httpd server using the given ' |
| 461 'document root, relative to the current dir') | 497 'document root, relative to the current dir') |
| 498 option_parser.add_option('', '--enable-wpr', action='store_true', | |
| 499 default=False, | |
| 500 help='Start the given Web Page Replay server using ' | |
| 501 'the httpd document root as the archive root.') | |
| 462 option_parser.add_option('', '--total-shards', dest='total_shards', | 502 option_parser.add_option('', '--total-shards', dest='total_shards', |
| 463 default=None, type="int", | 503 default=None, type="int", |
| 464 help='Number of shards to split this test into.') | 504 help='Number of shards to split this test into.') |
| 465 option_parser.add_option('', '--shard-index', dest='shard_index', | 505 option_parser.add_option('', '--shard-index', dest='shard_index', |
| 466 default=None, type="int", | 506 default=None, type="int", |
| 467 help='Shard to run. Must be between 1 and ' | 507 help='Shard to run. Must be between 1 and ' |
| 468 'total-shards.') | 508 'total-shards.') |
| 469 option_parser.add_option('', '--run-shell-script', action='store_true', | 509 option_parser.add_option('', '--run-shell-script', action='store_true', |
| 470 default=False, | 510 default=False, |
| 471 help='treat first argument as the shell script' | 511 help='treat first argument as the shell script' |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 516 option_parser.add_option('--build-properties', action='callback', | 556 option_parser.add_option('--build-properties', action='callback', |
| 517 callback=chromium_utils.convert_json, type='string', | 557 callback=chromium_utils.convert_json, type='string', |
| 518 nargs=1, default={}, | 558 nargs=1, default={}, |
| 519 help='build properties in JSON format') | 559 help='build properties in JSON format') |
| 520 option_parser.add_option('--factory-properties', action='callback', | 560 option_parser.add_option('--factory-properties', action='callback', |
| 521 callback=chromium_utils.convert_json, type='string', | 561 callback=chromium_utils.convert_json, type='string', |
| 522 nargs=1, default={}, | 562 nargs=1, default={}, |
| 523 help='factory properties in JSON format') | 563 help='factory properties in JSON format') |
| 524 options, args = option_parser.parse_args() | 564 options, args = option_parser.parse_args() |
| 525 | 565 |
| 566 if options.enable_wpr and not options.document_root: | |
| 567 sys.stderr.write('--enable-wpr requires --with-httpd for the document root.' ) | |
|
James Simonsen
2012/04/05 00:34:03
80 chars
| |
| 568 return 1 | |
| 526 if options.run_shell_script and options.run_python_script: | 569 if options.run_shell_script and options.run_python_script: |
| 527 sys.stderr.write('Use either --run-shell-script OR --run-python-script, ' | 570 sys.stderr.write('Use either --run-shell-script OR --run-python-script, ' |
| 528 'not both.') | 571 'not both.') |
| 529 return 1 | 572 return 1 |
| 530 | 573 |
| 531 # Print out builder name for log_parser | 574 # Print out builder name for log_parser |
| 532 print '[Running on builder: "%s"]' % options.builder_name | 575 print '[Running on builder: "%s"]' % options.builder_name |
| 533 | 576 |
| 534 # Instruct GTK to use malloc while running ASAN tests. | 577 # Instruct GTK to use malloc while running ASAN tests. |
| 535 if options.factory_properties.get('asan', False): | 578 if options.factory_properties.get('asan', False): |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 565 '%d new files were left in %s: Fix the tests to clean up themselves.' | 608 '%d new files were left in %s: Fix the tests to clean up themselves.' |
| 566 ) % ((new_temp_files - temp_files), tempfile.gettempdir()) | 609 ) % ((new_temp_files - temp_files), tempfile.gettempdir()) |
| 567 # TODO(maruel): Make it an error soon. Not yet since I want to iron out all | 610 # TODO(maruel): Make it an error soon. Not yet since I want to iron out all |
| 568 # the remaining cases before. | 611 # the remaining cases before. |
| 569 #result = 1 | 612 #result = 1 |
| 570 return result | 613 return result |
| 571 | 614 |
| 572 | 615 |
| 573 if '__main__' == __name__: | 616 if '__main__' == __name__: |
| 574 sys.exit(main()) | 617 sys.exit(main()) |
| OLD | NEW |