OLD | NEW |
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 import argparse | 9 import argparse |
10 import collections | 10 import collections |
(...skipping 18 matching lines...) Expand all Loading... |
29 from pylib import constants | 29 from pylib import constants |
30 from pylib.base import base_test_result | 30 from pylib.base import base_test_result |
31 from pylib.base import environment_factory | 31 from pylib.base import environment_factory |
32 from pylib.base import test_dispatcher | 32 from pylib.base import test_dispatcher |
33 from pylib.base import test_instance_factory | 33 from pylib.base import test_instance_factory |
34 from pylib.base import test_run_factory | 34 from pylib.base import test_run_factory |
35 from pylib.constants import host_paths | 35 from pylib.constants import host_paths |
36 from pylib.linker import setup as linker_setup | 36 from pylib.linker import setup as linker_setup |
37 from pylib.junit import setup as junit_setup | 37 from pylib.junit import setup as junit_setup |
38 from pylib.junit import test_dispatcher as junit_dispatcher | 38 from pylib.junit import test_dispatcher as junit_dispatcher |
39 from pylib.monkey import setup as monkey_setup | |
40 from pylib.monkey import test_options as monkey_test_options | |
41 from pylib.results import json_results | 39 from pylib.results import json_results |
42 from pylib.results import report_results | 40 from pylib.results import report_results |
43 | 41 |
44 | 42 |
45 _DEVIL_STATIC_CONFIG_FILE = os.path.abspath(os.path.join( | 43 _DEVIL_STATIC_CONFIG_FILE = os.path.abspath(os.path.join( |
46 host_paths.DIR_SOURCE_ROOT, 'build', 'android', 'devil_config.json')) | 44 host_paths.DIR_SOURCE_ROOT, 'build', 'android', 'devil_config.json')) |
47 | 45 |
48 | 46 |
49 def AddCommonOptions(parser): | 47 def AddCommonOptions(parser): |
50 """Adds all common options to |parser|.""" | 48 """Adds all common options to |parser|.""" |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 '--coverage-dir', dest='coverage_dir', type=os.path.realpath, | 414 '--coverage-dir', dest='coverage_dir', type=os.path.realpath, |
417 help='Directory to store coverage info.') | 415 help='Directory to store coverage info.') |
418 AddCommonOptions(parser) | 416 AddCommonOptions(parser) |
419 | 417 |
420 | 418 |
421 def AddMonkeyTestOptions(parser): | 419 def AddMonkeyTestOptions(parser): |
422 """Adds monkey test options to |parser|.""" | 420 """Adds monkey test options to |parser|.""" |
423 | 421 |
424 group = parser.add_argument_group('Monkey Test Options') | 422 group = parser.add_argument_group('Monkey Test Options') |
425 group.add_argument( | 423 group.add_argument( |
426 '--package', required=True, choices=constants.PACKAGE_INFO.keys(), | 424 '--browser', required=True, choices=constants.PACKAGE_INFO.keys(), |
427 metavar='PACKAGE', help='Package under test.') | 425 metavar='BROWSER', help='Browser under test.') |
428 group.add_argument( | 426 group.add_argument( |
429 '--event-count', default=10000, type=int, | 427 '--event-count', default=10000, type=int, |
430 help='Number of events to generate (default: %(default)s).') | 428 help='Number of events to generate (default: %(default)s).') |
431 group.add_argument( | 429 group.add_argument( |
432 '--category', default='', | 430 '--category', nargs='*', dest='categories', default=[], |
433 help='A list of allowed categories.') | 431 help='A list of allowed categories. Monkey will only visit activities ' |
| 432 'that are listed with one of the specified categories.') |
434 group.add_argument( | 433 group.add_argument( |
435 '--throttle', default=100, type=int, | 434 '--throttle', default=100, type=int, |
436 help='Delay between events (ms) (default: %(default)s). ') | 435 help='Delay between events (ms) (default: %(default)s). ') |
437 group.add_argument( | 436 group.add_argument( |
438 '--seed', type=int, | 437 '--seed', type=int, |
439 help=('Seed value for pseudo-random generator. Same seed value generates ' | 438 help='Seed value for pseudo-random generator. Same seed value generates ' |
440 'the same sequence of events. Seed is randomized by default.')) | 439 'the same sequence of events. Seed is randomized by default.') |
441 group.add_argument( | 440 group.add_argument( |
442 '--extra-args', default='', | 441 '--repeat', dest='repeat', type=int, default=0, |
443 help=('String of other args to pass to the command verbatim.')) | 442 help='Number of times to repeat the specified set of tests.') |
444 | 443 group.add_argument( |
| 444 '--break-on-failure', '--break_on_failure', |
| 445 dest='break_on_failure', action='store_true', |
| 446 help='Whether to break on failure.') |
445 AddCommonOptions(parser) | 447 AddCommonOptions(parser) |
446 AddDeviceOptions(parser) | 448 AddDeviceOptions(parser) |
447 | 449 |
448 def ProcessMonkeyTestOptions(args): | |
449 """Processes all monkey test options. | |
450 | |
451 Args: | |
452 args: argparse.Namespace object. | |
453 | |
454 Returns: | |
455 A MonkeyOptions named tuple which contains all options relevant to | |
456 monkey tests. | |
457 """ | |
458 # TODO(jbudorick): Handle this directly in argparse with nargs='+' | |
459 category = args.category | |
460 if category: | |
461 category = args.category.split(',') | |
462 | |
463 # TODO(jbudorick): Get rid of MonkeyOptions. | |
464 return monkey_test_options.MonkeyOptions( | |
465 args.verbose_count, | |
466 args.package, | |
467 args.event_count, | |
468 category, | |
469 args.throttle, | |
470 args.seed, | |
471 args.extra_args) | |
472 | |
473 | 450 |
474 def AddPerfTestOptions(parser): | 451 def AddPerfTestOptions(parser): |
475 """Adds perf test options to |parser|.""" | 452 """Adds perf test options to |parser|.""" |
476 | 453 |
477 group = parser.add_argument_group('Perf Test Options') | 454 group = parser.add_argument_group('Perf Test Options') |
478 | 455 |
479 class SingleStepAction(argparse.Action): | 456 class SingleStepAction(argparse.Action): |
480 def __call__(self, parser, namespace, values, option_string=None): | 457 def __call__(self, parser, namespace, values, option_string=None): |
481 if values and not namespace.single_step: | 458 if values and not namespace.single_step: |
482 parser.error('single step command provided, ' | 459 parser.error('single step command provided, ' |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 results=results, | 575 results=results, |
599 test_type='JUnit', | 576 test_type='JUnit', |
600 test_package=args.test_suite) | 577 test_package=args.test_suite) |
601 | 578 |
602 if args.json_results_file: | 579 if args.json_results_file: |
603 json_results.GenerateJsonResultsFile([results], args.json_results_file) | 580 json_results.GenerateJsonResultsFile([results], args.json_results_file) |
604 | 581 |
605 return exit_code | 582 return exit_code |
606 | 583 |
607 | 584 |
608 def _RunMonkeyTests(args, devices): | |
609 """Subcommand of RunTestsCommands which runs monkey tests.""" | |
610 monkey_options = ProcessMonkeyTestOptions(args) | |
611 | |
612 runner_factory, tests = monkey_setup.Setup(monkey_options) | |
613 | |
614 results, exit_code = test_dispatcher.RunTests( | |
615 tests, runner_factory, devices, shard=False, test_timeout=None, | |
616 num_retries=args.num_retries) | |
617 | |
618 report_results.LogFull( | |
619 results=results, | |
620 test_type='Monkey', | |
621 test_package='Monkey') | |
622 | |
623 if args.json_results_file: | |
624 json_results.GenerateJsonResultsFile([results], args.json_results_file) | |
625 | |
626 return exit_code | |
627 | |
628 | |
629 def _RunPythonTests(args): | 585 def _RunPythonTests(args): |
630 """Subcommand of RunTestsCommand which runs python unit tests.""" | 586 """Subcommand of RunTestsCommand which runs python unit tests.""" |
631 suite_vars = constants.PYTHON_UNIT_TEST_SUITES[args.suite_name] | 587 suite_vars = constants.PYTHON_UNIT_TEST_SUITES[args.suite_name] |
632 suite_path = suite_vars['path'] | 588 suite_path = suite_vars['path'] |
633 suite_test_modules = suite_vars['test_modules'] | 589 suite_test_modules = suite_vars['test_modules'] |
634 | 590 |
635 sys.path = [suite_path] + sys.path | 591 sys.path = [suite_path] + sys.path |
636 try: | 592 try: |
637 suite = unittest.TestSuite() | 593 suite = unittest.TestSuite() |
638 suite.addTests(unittest.defaultTestLoader.loadTestsFromName(m) | 594 suite.addTests(unittest.defaultTestLoader.loadTestsFromName(m) |
(...skipping 29 matching lines...) Expand all Loading... |
668 'Did not find device %s among attached device. Attached devices: %s' | 624 'Did not find device %s among attached device. Attached devices: %s' |
669 % (test_device, ', '.join(attached_devices))) | 625 % (test_device, ', '.join(attached_devices))) |
670 return test_device | 626 return test_device |
671 | 627 |
672 else: | 628 else: |
673 if not attached_devices: | 629 if not attached_devices: |
674 raise device_errors.NoDevicesError() | 630 raise device_errors.NoDevicesError() |
675 return sorted(attached_devices) | 631 return sorted(attached_devices) |
676 | 632 |
677 | 633 |
678 _DEFAULT_PLATFORM_MODE_TESTS = ['gtest', 'instrumentation', 'perf'] | 634 _DEFAULT_PLATFORM_MODE_TESTS = ['gtest', 'instrumentation', 'monkey', 'perf'] |
679 | 635 |
680 | 636 |
681 def RunTestsCommand(args): # pylint: disable=too-many-return-statements | 637 def RunTestsCommand(args): # pylint: disable=too-many-return-statements |
682 """Checks test type and dispatches to the appropriate function. | 638 """Checks test type and dispatches to the appropriate function. |
683 | 639 |
684 Args: | 640 Args: |
685 args: argparse.Namespace object. | 641 args: argparse.Namespace object. |
686 | 642 |
687 Returns: | 643 Returns: |
688 Integer indicated exit code. | 644 Integer indicated exit code. |
(...skipping 19 matching lines...) Expand all Loading... |
708 # pylint: enable=protected-access | 664 # pylint: enable=protected-access |
709 | 665 |
710 def get_devices(): | 666 def get_devices(): |
711 return _GetAttachedDevices(args.blacklist_file, args.test_device, | 667 return _GetAttachedDevices(args.blacklist_file, args.test_device, |
712 args.enable_device_cache, args.num_retries) | 668 args.enable_device_cache, args.num_retries) |
713 | 669 |
714 if command == 'linker': | 670 if command == 'linker': |
715 return _RunLinkerTests(args, get_devices()) | 671 return _RunLinkerTests(args, get_devices()) |
716 elif command == 'junit': | 672 elif command == 'junit': |
717 return _RunJUnitTests(args) | 673 return _RunJUnitTests(args) |
718 elif command == 'monkey': | |
719 return _RunMonkeyTests(args, get_devices()) | |
720 elif command == 'python': | 674 elif command == 'python': |
721 return _RunPythonTests(args) | 675 return _RunPythonTests(args) |
722 else: | 676 else: |
723 raise Exception('Unknown test type.') | 677 raise Exception('Unknown test type.') |
724 | 678 |
725 | 679 |
726 _SUPPORTED_IN_PLATFORM_MODE = [ | 680 _SUPPORTED_IN_PLATFORM_MODE = [ |
727 # TODO(jbudorick): Add support for more test types. | 681 # TODO(jbudorick): Add support for more test types. |
728 'gtest', | 682 'gtest', |
729 'instrumentation', | 683 'instrumentation', |
730 'junit', | 684 'junit', |
| 685 'monkey', |
731 'perf', | 686 'perf', |
732 ] | 687 ] |
733 | 688 |
734 | 689 |
735 def RunTestsInPlatformMode(args): | 690 def RunTestsInPlatformMode(args): |
736 | 691 |
737 def infra_error(message): | 692 def infra_error(message): |
738 logging.fatal(message) | 693 logging.fatal(message) |
739 sys.exit(constants.INFRA_EXIT_CODE) | 694 sys.exit(constants.INFRA_EXIT_CODE) |
740 | 695 |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
879 if e.is_infra_error: | 834 if e.is_infra_error: |
880 return constants.INFRA_EXIT_CODE | 835 return constants.INFRA_EXIT_CODE |
881 return constants.ERROR_EXIT_CODE | 836 return constants.ERROR_EXIT_CODE |
882 except: # pylint: disable=W0702 | 837 except: # pylint: disable=W0702 |
883 logging.exception('Unrecognized error occurred.') | 838 logging.exception('Unrecognized error occurred.') |
884 return constants.ERROR_EXIT_CODE | 839 return constants.ERROR_EXIT_CODE |
885 | 840 |
886 | 841 |
887 if __name__ == '__main__': | 842 if __name__ == '__main__': |
888 sys.exit(main()) | 843 sys.exit(main()) |
OLD | NEW |