Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(78)

Side by Side Diff: build/android/test_runner.py

Issue 19537004: [Android] Converts host driven tests to common test_dispatcher (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@sharding_refactoring
Patch Set: Adds tagging of host-driven, re-adds exception handling Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # 2 #
3 # Copyright 2013 The Chromium Authors. All rights reserved. 3 # Copyright 2013 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be 4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file. 5 # found in the LICENSE file.
6 6
7 """Runs all types of tests from one unified interface. 7 """Runs all types of tests from one unified interface.
8 8
9 TODO(gkanwar): 9 TODO(gkanwar):
10 * Add options to run Monkey tests. 10 * Add options to run Monkey tests.
11 """ 11 """
12 12
13 import collections 13 import collections
14 import optparse 14 import optparse
15 import os 15 import os
16 import shutil 16 import shutil
17 import sys 17 import sys
18 18
19 from pylib import cmd_helper 19 from pylib import cmd_helper
20 from pylib import constants 20 from pylib import constants
21 from pylib import ports 21 from pylib import ports
22 from pylib.base import base_test_result 22 from pylib.base import base_test_result
23 from pylib.base import test_dispatcher 23 from pylib.base import test_dispatcher
24 from pylib.browsertests import setup as browsertests_setup 24 from pylib.browsertests import setup as browsertests_setup
25 from pylib.gtest import gtest_config
25 from pylib.gtest import setup as gtest_setup 26 from pylib.gtest import setup as gtest_setup
26 from pylib.gtest import gtest_config 27 from pylib.host_driven import setup as host_driven_setup
27 from pylib.host_driven import run_python_tests as python_dispatch
28 from pylib.instrumentation import setup as instrumentation_setup 28 from pylib.instrumentation import setup as instrumentation_setup
29 from pylib.uiautomator import setup as uiautomator_setup 29 from pylib.uiautomator import setup as uiautomator_setup
30 from pylib.utils import report_results 30 from pylib.utils import report_results
31 from pylib.utils import run_tests_helper 31 from pylib.utils import run_tests_helper
32 32
33 33
34 _SDK_OUT_DIR = os.path.join(constants.DIR_SOURCE_ROOT, 'out') 34 _SDK_OUT_DIR = os.path.join(constants.DIR_SOURCE_ROOT, 'out')
35 35
36 36
37 def AddBuildTypeOption(option_parser): 37 def AddBuildTypeOption(option_parser):
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 tests, runner_factory, options.wait_for_debugger, 427 tests, runner_factory, options.wait_for_debugger,
428 options.test_device, 428 options.test_device,
429 shard=True, 429 shard=True,
430 build_type=options.build_type, 430 build_type=options.build_type,
431 test_timeout=None, 431 test_timeout=None,
432 num_retries=options.num_retries) 432 num_retries=options.num_retries)
433 433
434 results.AddTestRunResults(test_results) 434 results.AddTestRunResults(test_results)
435 435
436 if options.run_python_tests: 436 if options.run_python_tests:
437 test_results, test_exit_code = ( 437 runner_factory, tests = host_driven_setup.InstrumentationSetup(
438 python_dispatch.DispatchPythonTests(options)) 438 options.python_test_root, options.official_build, options.annotations,
439 options.exclude_annotations, options.test_filter, options.tool,
440 options.build_type, options.push_deps, options.cleanup_test_files,
441 options.test_apk_path, options.test_apk_jar_path, options.test_data,
442 options.install_apk, options.save_perf_json,
443 options.screenshot_failures, options.wait_for_debugger,
444 options.disable_assertions)
445
446 test_results, test_exit_code = test_dispatcher.RunTests(
447 tests, runner_factory, False,
448 options.test_device,
449 shard=True,
450 build_type=options.build_type,
451 test_timeout=None,
452 num_retries=options.num_retries)
439 453
440 results.AddTestRunResults(test_results) 454 results.AddTestRunResults(test_results)
441 455
442 # Only allow exit code escalation 456 # Only allow exit code escalation
443 if test_exit_code and exit_code != constants.ERROR_EXIT_CODE: 457 if test_exit_code and exit_code != constants.ERROR_EXIT_CODE:
444 exit_code = test_exit_code 458 exit_code = test_exit_code
445 459
446 report_results.LogFull( 460 report_results.LogFull(
447 results=results, 461 results=results,
448 test_type='Instrumentation', 462 test_type='Instrumentation',
(...skipping 24 matching lines...) Expand all
473 test_results, exit_code = test_dispatcher.RunTests( 487 test_results, exit_code = test_dispatcher.RunTests(
474 tests, runner_factory, False, options.test_device, 488 tests, runner_factory, False, options.test_device,
475 shard=True, 489 shard=True,
476 build_type=options.build_type, 490 build_type=options.build_type,
477 test_timeout=None, 491 test_timeout=None,
478 num_retries=options.num_retries) 492 num_retries=options.num_retries)
479 493
480 results.AddTestRunResults(test_results) 494 results.AddTestRunResults(test_results)
481 495
482 if options.run_python_tests: 496 if options.run_python_tests:
483 test_results, test_exit_code = ( 497 # TODO(gkanwar): Create a UIAutomator Setup, use it here
484 python_dispatch.DispatchPythonTests(options)) 498 runner_factory, tests = host_driven_setup.InstrumentationSetup(
499 options.python_test_root, options.official_build, options.annotations,
500 options.exclude_annotations, options.test_filter, options.tool,
501 options.build_type, options.push_deps, options.cleanup_test_files,
502 options.test_apk_path, options.test_apk_jar_path, options.test_data,
503 options.install_apk, options.save_perf_json,
504 options.screenshot_failures, options.wait_for_debugger,
505 options.disable_assertion)
506
507 test_results, test_exit_code = test_dispatcher.RunTests(
508 tests, runner_factory, False,
509 options.test_device,
510 shard=True,
511 build_type=options.build_type,
512 test_timeout=None,
513 num_retries=options.num_retries)
485 514
486 results.AddTestRunResults(test_results) 515 results.AddTestRunResults(test_results)
487 516
488 # Only allow exit code escalation 517 # Only allow exit code escalation
489 if test_exit_code and exit_code != constants.ERROR_EXIT_CODE: 518 if test_exit_code and exit_code != constants.ERROR_EXIT_CODE:
490 exit_code = test_exit_code 519 exit_code = test_exit_code
491 520
492 report_results.LogFull( 521 report_results.LogFull(
493 results=results, 522 results=results,
494 test_type='UIAutomator', 523 test_type='UIAutomator',
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 return _RunGTests(options, option_parser.error) 558 return _RunGTests(options, option_parser.error)
530 elif command == 'content_browsertests': 559 elif command == 'content_browsertests':
531 return _RunContentBrowserTests(options, option_parser.error) 560 return _RunContentBrowserTests(options, option_parser.error)
532 elif command == 'instrumentation': 561 elif command == 'instrumentation':
533 return _RunInstrumentationTests(options, option_parser.error) 562 return _RunInstrumentationTests(options, option_parser.error)
534 elif command == 'uiautomator': 563 elif command == 'uiautomator':
535 return _RunUIAutomatorTests(options, option_parser.error) 564 return _RunUIAutomatorTests(options, option_parser.error)
536 else: 565 else:
537 raise Exception('Unknown test type.') 566 raise Exception('Unknown test type.')
538 567
539 return exit_code
540
541 568
542 def HelpCommand(command, options, args, option_parser): 569 def HelpCommand(command, options, args, option_parser):
543 """Display help for a certain command, or overall help. 570 """Display help for a certain command, or overall help.
544 571
545 Args: 572 Args:
546 command: String indicating the command that was received to trigger 573 command: String indicating the command that was received to trigger
547 this function. 574 this function.
548 options: optparse options dictionary. 575 options: optparse options dictionary.
549 args: List of extra args from optparse. 576 args: List of extra args from optparse.
550 option_parser: optparse.OptionParser object. 577 option_parser: optparse.OptionParser object.
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 625
599 626
600 class CommandOptionParser(optparse.OptionParser): 627 class CommandOptionParser(optparse.OptionParser):
601 """Wrapper class for OptionParser to help with listing commands.""" 628 """Wrapper class for OptionParser to help with listing commands."""
602 629
603 def __init__(self, *args, **kwargs): 630 def __init__(self, *args, **kwargs):
604 self.command_list = kwargs.pop('command_list', []) 631 self.command_list = kwargs.pop('command_list', [])
605 self.example = kwargs.pop('example', '') 632 self.example = kwargs.pop('example', '')
606 optparse.OptionParser.__init__(self, *args, **kwargs) 633 optparse.OptionParser.__init__(self, *args, **kwargs)
607 634
608 #override 635 # override
609 def get_usage(self): 636 def get_usage(self):
610 normal_usage = optparse.OptionParser.get_usage(self) 637 normal_usage = optparse.OptionParser.get_usage(self)
611 command_list = self.get_command_list() 638 command_list = self.get_command_list()
612 example = self.get_example() 639 example = self.get_example()
613 return self.expand_prog_name(normal_usage + example + command_list) 640 return self.expand_prog_name(normal_usage + example + command_list)
614 641
615 #override 642 # override
616 def get_command_list(self): 643 def get_command_list(self):
617 if self.command_list: 644 if self.command_list:
618 return '\nCommands:\n %s\n' % '\n '.join(sorted(self.command_list)) 645 return '\nCommands:\n %s\n' % '\n '.join(sorted(self.command_list))
619 return '' 646 return ''
620 647
621 def get_example(self): 648 def get_example(self):
622 if self.example: 649 if self.example:
623 return '\nExample:\n %s\n' % self.example 650 return '\nExample:\n %s\n' % self.example
624 return '' 651 return ''
625 652
626 653
627 def main(argv): 654 def main(argv):
628 option_parser = CommandOptionParser( 655 option_parser = CommandOptionParser(
629 usage='Usage: %prog <command> [options]', 656 usage='Usage: %prog <command> [options]',
630 command_list=VALID_COMMANDS.keys()) 657 command_list=VALID_COMMANDS.keys())
631 658
632 if len(argv) < 2 or argv[1] not in VALID_COMMANDS: 659 if len(argv) < 2 or argv[1] not in VALID_COMMANDS:
633 option_parser.print_help() 660 option_parser.print_help()
634 return 0 661 return 0
635 command = argv[1] 662 command = argv[1]
636 VALID_COMMANDS[command].add_options_func(option_parser) 663 VALID_COMMANDS[command].add_options_func(option_parser)
637 options, args = option_parser.parse_args(argv) 664 options, args = option_parser.parse_args(argv)
638 return VALID_COMMANDS[command].run_command_func( 665 return VALID_COMMANDS[command].run_command_func(
639 command, options, args, option_parser) 666 command, options, args, option_parser)
640 667
641 668
642 if __name__ == '__main__': 669 if __name__ == '__main__':
643 sys.exit(main(sys.argv)) 670 sys.exit(main(sys.argv))
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698