| 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 collections | 9 import collections |
| 10 import logging | 10 import logging |
| 11 import optparse | 11 import optparse |
| 12 import os | 12 import os |
| 13 import shutil | 13 import shutil |
| 14 import signal | 14 import signal |
| 15 import sys | 15 import sys |
| 16 import threading | 16 import threading |
| 17 import unittest |
| 17 | 18 |
| 18 from pylib import android_commands | 19 from pylib import android_commands |
| 19 from pylib import constants | 20 from pylib import constants |
| 20 from pylib import forwarder | 21 from pylib import forwarder |
| 21 from pylib import ports | 22 from pylib import ports |
| 22 from pylib.base import base_test_result | 23 from pylib.base import base_test_result |
| 23 from pylib.base import test_dispatcher | 24 from pylib.base import test_dispatcher |
| 24 from pylib.gtest import gtest_config | 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 test_options as gtest_test_options | 27 from pylib.gtest import test_options as gtest_test_options |
| (...skipping 10 matching lines...) Expand all Loading... |
| 37 from pylib.perf import test_runner as perf_test_runner | 38 from pylib.perf import test_runner as perf_test_runner |
| 38 from pylib.uiautomator import setup as uiautomator_setup | 39 from pylib.uiautomator import setup as uiautomator_setup |
| 39 from pylib.uiautomator import test_options as uiautomator_test_options | 40 from pylib.uiautomator import test_options as uiautomator_test_options |
| 40 from pylib.utils import apk_helper | 41 from pylib.utils import apk_helper |
| 41 from pylib.utils import command_option_parser | 42 from pylib.utils import command_option_parser |
| 42 from pylib.utils import report_results | 43 from pylib.utils import report_results |
| 43 from pylib.utils import reraiser_thread | 44 from pylib.utils import reraiser_thread |
| 44 from pylib.utils import run_tests_helper | 45 from pylib.utils import run_tests_helper |
| 45 | 46 |
| 46 | 47 |
| 48 HOST_TESTS = ['junit', 'python'] |
| 49 |
| 50 |
| 47 def AddCommonOptions(option_parser): | 51 def AddCommonOptions(option_parser): |
| 48 """Adds all common options to |option_parser|.""" | 52 """Adds all common options to |option_parser|.""" |
| 49 | 53 |
| 50 group = optparse.OptionGroup(option_parser, 'Common Options') | 54 group = optparse.OptionGroup(option_parser, 'Common Options') |
| 51 default_build_type = os.environ.get('BUILDTYPE', 'Debug') | 55 default_build_type = os.environ.get('BUILDTYPE', 'Debug') |
| 52 group.add_option('--debug', action='store_const', const='Debug', | 56 group.add_option('--debug', action='store_const', const='Debug', |
| 53 dest='build_type', default=default_build_type, | 57 dest='build_type', default=default_build_type, |
| 54 help=('If set, run test suites under out/Debug. ' | 58 help=('If set, run test suites under out/Debug. ' |
| 55 'Default is env var BUILDTYPE or Debug.')) | 59 'Default is env var BUILDTYPE or Debug.')) |
| 56 group.add_option('--release', action='store_const', | 60 group.add_option('--release', action='store_const', |
| 57 const='Release', dest='build_type', | 61 const='Release', dest='build_type', |
| 58 help=('If set, run test suites under out/Release.' | 62 help=('If set, run test suites under out/Release.' |
| 59 ' Default is env var BUILDTYPE or Debug.')) | 63 ' Default is env var BUILDTYPE or Debug.')) |
| 60 group.add_option('--build-directory', dest='build_directory', | 64 group.add_option('--build-directory', dest='build_directory', |
| 61 help=('Path to the directory in which build files are' | 65 help=('Path to the directory in which build files are' |
| 62 ' located (should not include build type)')) | 66 ' located (should not include build type)')) |
| 63 group.add_option('-c', dest='cleanup_test_files', | |
| 64 help='Cleanup test files on the device after run', | |
| 65 action='store_true') | |
| 66 group.add_option('--num_retries', dest='num_retries', type='int', | 67 group.add_option('--num_retries', dest='num_retries', type='int', |
| 67 default=2, | 68 default=2, |
| 68 help=('Number of retries for a test before ' | 69 help=('Number of retries for a test before ' |
| 69 'giving up.')) | 70 'giving up.')) |
| 70 group.add_option('-v', | 71 group.add_option('-v', |
| 71 '--verbose', | 72 '--verbose', |
| 72 dest='verbose_count', | 73 dest='verbose_count', |
| 73 default=0, | 74 default=0, |
| 74 action='count', | 75 action='count', |
| 75 help='Verbose level (multiple times for more)') | 76 help='Verbose level (multiple times for more)') |
| 76 group.add_option('--tool', | |
| 77 dest='tool', | |
| 78 help=('Run the test under a tool ' | |
| 79 '(use --tool help to list them)')) | |
| 80 group.add_option('--flakiness-dashboard-server', | 77 group.add_option('--flakiness-dashboard-server', |
| 81 dest='flakiness_dashboard_server', | 78 dest='flakiness_dashboard_server', |
| 82 help=('Address of the server that is hosting the ' | 79 help=('Address of the server that is hosting the ' |
| 83 'Chrome for Android flakiness dashboard.')) | 80 'Chrome for Android flakiness dashboard.')) |
| 84 group.add_option('--skip-deps-push', dest='push_deps', | |
| 85 action='store_false', default=True, | |
| 86 help=('Do not push dependencies to the device. ' | |
| 87 'Use this at own risk for speeding up test ' | |
| 88 'execution on local machine.')) | |
| 89 group.add_option('-d', '--device', dest='test_device', | |
| 90 help=('Target device for the test suite ' | |
| 91 'to run on.')) | |
| 92 option_parser.add_option_group(group) | 81 option_parser.add_option_group(group) |
| 93 | 82 |
| 94 | 83 |
| 95 def ProcessCommonOptions(options): | 84 def ProcessCommonOptions(options): |
| 96 """Processes and handles all common options.""" | 85 """Processes and handles all common options.""" |
| 97 run_tests_helper.SetLogLevel(options.verbose_count) | 86 run_tests_helper.SetLogLevel(options.verbose_count) |
| 98 constants.SetBuildType(options.build_type) | 87 constants.SetBuildType(options.build_type) |
| 99 if options.build_directory: | 88 if options.build_directory: |
| 100 constants.SetBuildDirectory(options.build_directory) | 89 constants.SetBuildDirectory(options.build_directory) |
| 101 | 90 |
| 102 | 91 |
| 92 def AddDeviceOptions(option_parser): |
| 93 group = optparse.OptionGroup(option_parser, 'Device Options') |
| 94 group.add_option('-c', dest='cleanup_test_files', |
| 95 help='Cleanup test files on the device after run', |
| 96 action='store_true') |
| 97 group.add_option('--tool', |
| 98 dest='tool', |
| 99 help=('Run the test under a tool ' |
| 100 '(use --tool help to list them)')) |
| 101 group.add_option('--skip-deps-push', dest='push_deps', |
| 102 action='store_false', default=True, |
| 103 help=('Do not push dependencies to the device. ' |
| 104 'Use this at own risk for speeding up test ' |
| 105 'execution on local machine.')) |
| 106 group.add_option('-d', '--device', dest='test_device', |
| 107 help=('Target device for the test suite ' |
| 108 'to run on.')) |
| 109 option_parser.add_option_group(group) |
| 110 |
| 111 |
| 103 def AddGTestOptions(option_parser): | 112 def AddGTestOptions(option_parser): |
| 104 """Adds gtest options to |option_parser|.""" | 113 """Adds gtest options to |option_parser|.""" |
| 105 | 114 |
| 106 option_parser.usage = '%prog gtest [options]' | 115 option_parser.usage = '%prog gtest [options]' |
| 107 option_parser.commands_dict = {} | 116 option_parser.commands_dict = {} |
| 108 option_parser.example = '%prog gtest -s base_unittests' | 117 option_parser.example = '%prog gtest -s base_unittests' |
| 109 | 118 |
| 110 # TODO(gkanwar): Make this option required | 119 # TODO(gkanwar): Make this option required |
| 111 option_parser.add_option('-s', '--suite', dest='suite_name', | 120 option_parser.add_option('-s', '--suite', dest='suite_name', |
| 112 help=('Executable name of the test suite to run ' | 121 help=('Executable name of the test suite to run ' |
| (...skipping 13 matching lines...) Expand all Loading... |
| 126 type='int', | 135 type='int', |
| 127 default=60) | 136 default=60) |
| 128 option_parser.add_option('--isolate_file_path', | 137 option_parser.add_option('--isolate_file_path', |
| 129 '--isolate-file-path', | 138 '--isolate-file-path', |
| 130 dest='isolate_file_path', | 139 dest='isolate_file_path', |
| 131 help='.isolate file path to override the default ' | 140 help='.isolate file path to override the default ' |
| 132 'path') | 141 'path') |
| 133 # TODO(gkanwar): Move these to Common Options once we have the plumbing | 142 # TODO(gkanwar): Move these to Common Options once we have the plumbing |
| 134 # in our other test types to handle these commands | 143 # in our other test types to handle these commands |
| 135 AddCommonOptions(option_parser) | 144 AddCommonOptions(option_parser) |
| 145 AddDeviceOptions(option_parser) |
| 136 | 146 |
| 137 | 147 |
| 138 def AddLinkerTestOptions(option_parser): | 148 def AddLinkerTestOptions(option_parser): |
| 139 option_parser.usage = '%prog linker' | 149 option_parser.usage = '%prog linker' |
| 140 option_parser.commands_dict = {} | 150 option_parser.commands_dict = {} |
| 141 option_parser.example = '%prog linker' | 151 option_parser.example = '%prog linker' |
| 142 | 152 |
| 143 option_parser.add_option('-f', '--gtest-filter', dest='test_filter', | 153 option_parser.add_option('-f', '--gtest-filter', dest='test_filter', |
| 144 help='googletest-style filter string.') | 154 help='googletest-style filter string.') |
| 145 AddCommonOptions(option_parser) | 155 AddCommonOptions(option_parser) |
| 156 AddDeviceOptions(option_parser) |
| 146 | 157 |
| 147 | 158 |
| 148 def ProcessGTestOptions(options): | 159 def ProcessGTestOptions(options): |
| 149 """Intercept test suite help to list test suites. | 160 """Intercept test suite help to list test suites. |
| 150 | 161 |
| 151 Args: | 162 Args: |
| 152 options: Command line options. | 163 options: Command line options. |
| 153 """ | 164 """ |
| 154 if options.suite_name == 'help': | 165 if options.suite_name == 'help': |
| 155 print 'Available test suites are:' | 166 print 'Available test suites are:' |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 def AddInstrumentationTestOptions(option_parser): | 230 def AddInstrumentationTestOptions(option_parser): |
| 220 """Adds Instrumentation test options to |option_parser|.""" | 231 """Adds Instrumentation test options to |option_parser|.""" |
| 221 | 232 |
| 222 option_parser.usage = '%prog instrumentation [options]' | 233 option_parser.usage = '%prog instrumentation [options]' |
| 223 option_parser.commands_dict = {} | 234 option_parser.commands_dict = {} |
| 224 option_parser.example = ('%prog instrumentation ' | 235 option_parser.example = ('%prog instrumentation ' |
| 225 '--test-apk=ChromeShellTest') | 236 '--test-apk=ChromeShellTest') |
| 226 | 237 |
| 227 AddJavaTestOptions(option_parser) | 238 AddJavaTestOptions(option_parser) |
| 228 AddCommonOptions(option_parser) | 239 AddCommonOptions(option_parser) |
| 240 AddDeviceOptions(option_parser) |
| 229 | 241 |
| 230 option_parser.add_option('-j', '--java-only', action='store_true', | 242 option_parser.add_option('-j', '--java-only', action='store_true', |
| 231 default=False, help='Run only the Java tests.') | 243 default=False, help='Run only the Java tests.') |
| 232 option_parser.add_option('-p', '--python-only', action='store_true', | 244 option_parser.add_option('-p', '--python-only', action='store_true', |
| 233 default=False, | 245 default=False, |
| 234 help='Run only the host-driven tests.') | 246 help='Run only the host-driven tests.') |
| 235 option_parser.add_option('--host-driven-root', | 247 option_parser.add_option('--host-driven-root', |
| 236 help='Root of the host-driven tests.') | 248 help='Root of the host-driven tests.') |
| 237 option_parser.add_option('-w', '--wait_debugger', dest='wait_for_debugger', | 249 option_parser.add_option('-w', '--wait_debugger', dest='wait_for_debugger', |
| 238 action='store_true', | 250 action='store_true', |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 help=('Package under test. Possible values: %s' % | 339 help=('Package under test. Possible values: %s' % |
| 328 constants.PACKAGE_INFO.keys())) | 340 constants.PACKAGE_INFO.keys())) |
| 329 option_parser.add_option( | 341 option_parser.add_option( |
| 330 '--test-jar', dest='test_jar', | 342 '--test-jar', dest='test_jar', |
| 331 help=('The name of the dexed jar containing the tests (without the ' | 343 help=('The name of the dexed jar containing the tests (without the ' |
| 332 '.dex.jar extension). Alternatively, this can be a full path ' | 344 '.dex.jar extension). Alternatively, this can be a full path ' |
| 333 'to the jar.')) | 345 'to the jar.')) |
| 334 | 346 |
| 335 AddJavaTestOptions(option_parser) | 347 AddJavaTestOptions(option_parser) |
| 336 AddCommonOptions(option_parser) | 348 AddCommonOptions(option_parser) |
| 349 AddDeviceOptions(option_parser) |
| 337 | 350 |
| 338 | 351 |
| 339 def ProcessUIAutomatorOptions(options, error_func): | 352 def ProcessUIAutomatorOptions(options, error_func): |
| 340 """Processes UIAutomator options/arguments. | 353 """Processes UIAutomator options/arguments. |
| 341 | 354 |
| 342 Args: | 355 Args: |
| 343 options: optparse.Options object. | 356 options: optparse.Options object. |
| 344 error_func: Function to call with the error message in case of an error. | 357 error_func: Function to call with the error message in case of an error. |
| 345 | 358 |
| 346 Returns: | 359 Returns: |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 option_parser.add_option( | 453 option_parser.add_option( |
| 441 '--seed', type='int', | 454 '--seed', type='int', |
| 442 help=('Seed value for pseudo-random generator. Same seed value generates ' | 455 help=('Seed value for pseudo-random generator. Same seed value generates ' |
| 443 'the same sequence of events. Seed is randomized by default.')) | 456 'the same sequence of events. Seed is randomized by default.')) |
| 444 option_parser.add_option( | 457 option_parser.add_option( |
| 445 '--extra-args', default='', | 458 '--extra-args', default='', |
| 446 help=('String of other args to pass to the command verbatim ' | 459 help=('String of other args to pass to the command verbatim ' |
| 447 '[default: "%default"].')) | 460 '[default: "%default"].')) |
| 448 | 461 |
| 449 AddCommonOptions(option_parser) | 462 AddCommonOptions(option_parser) |
| 463 AddDeviceOptions(option_parser) |
| 450 | 464 |
| 451 | 465 |
| 452 def ProcessMonkeyTestOptions(options, error_func): | 466 def ProcessMonkeyTestOptions(options, error_func): |
| 453 """Processes all monkey test options. | 467 """Processes all monkey test options. |
| 454 | 468 |
| 455 Args: | 469 Args: |
| 456 options: optparse.Options object. | 470 options: optparse.Options object. |
| 457 error_func: Function to call with the error message in case of an error. | 471 error_func: Function to call with the error message in case of an error. |
| 458 | 472 |
| 459 Returns: | 473 Returns: |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 help=('Do not impose a timeout. Each perf step is responsible for ' | 527 help=('Do not impose a timeout. Each perf step is responsible for ' |
| 514 'implementing the timeout logic.')) | 528 'implementing the timeout logic.')) |
| 515 option_parser.add_option( | 529 option_parser.add_option( |
| 516 '-f', '--test-filter', | 530 '-f', '--test-filter', |
| 517 help=('Test filter (will match against the names listed in --steps).')) | 531 help=('Test filter (will match against the names listed in --steps).')) |
| 518 option_parser.add_option( | 532 option_parser.add_option( |
| 519 '--dry-run', | 533 '--dry-run', |
| 520 action='store_true', | 534 action='store_true', |
| 521 help='Just print the steps without executing.') | 535 help='Just print the steps without executing.') |
| 522 AddCommonOptions(option_parser) | 536 AddCommonOptions(option_parser) |
| 537 AddDeviceOptions(option_parser) |
| 523 | 538 |
| 524 | 539 |
| 525 def ProcessPerfTestOptions(options, args, error_func): | 540 def ProcessPerfTestOptions(options, args, error_func): |
| 526 """Processes all perf test options. | 541 """Processes all perf test options. |
| 527 | 542 |
| 528 Args: | 543 Args: |
| 529 options: optparse.Options object. | 544 options: optparse.Options object. |
| 530 error_func: Function to call with the error message in case of an error. | 545 error_func: Function to call with the error message in case of an error. |
| 531 | 546 |
| 532 Returns: | 547 Returns: |
| 533 A PerfOptions named tuple which contains all options relevant to | 548 A PerfOptions named tuple which contains all options relevant to |
| 534 perf tests. | 549 perf tests. |
| 535 """ | 550 """ |
| 536 # Only one of steps, print_step or single_step must be provided. | 551 # Only one of steps, print_step or single_step must be provided. |
| 537 count = len(filter(None, | 552 count = len(filter(None, |
| 538 [options.steps, options.print_step, options.single_step])) | 553 [options.steps, options.print_step, options.single_step])) |
| 539 if count != 1: | 554 if count != 1: |
| 540 error_func('Please specify one of: --steps, --print-step, --single-step.') | 555 error_func('Please specify one of: --steps, --print-step, --single-step.') |
| 541 single_step = None | 556 single_step = None |
| 542 if options.single_step: | 557 if options.single_step: |
| 543 single_step = ' '.join(args[2:]) | 558 single_step = ' '.join(args[2:]) |
| 544 return perf_test_options.PerfOptions( | 559 return perf_test_options.PerfOptions( |
| 545 options.steps, options.flaky_steps, options.output_json_list, | 560 options.steps, options.flaky_steps, options.output_json_list, |
| 546 options.print_step, options.no_timeout, options.test_filter, | 561 options.print_step, options.no_timeout, options.test_filter, |
| 547 options.dry_run, single_step) | 562 options.dry_run, single_step) |
| 548 | 563 |
| 549 | 564 |
| 565 def AddPythonTestOptions(option_parser): |
| 566 option_parser.add_option('-s', '--suite', dest='suite_name', |
| 567 help=('Name of the test suite to run' |
| 568 '(use -s help to list them).')) |
| 569 AddCommonOptions(option_parser) |
| 570 |
| 571 |
| 572 def ProcessPythonTestOptions(options, error_func): |
| 573 if options.suite_name not in constants.PYTHON_UNIT_TEST_SUITES: |
| 574 available = ('Available test suites: [%s]' % |
| 575 ', '.join(constants.PYTHON_UNIT_TEST_SUITES.iterkeys())) |
| 576 if options.suite_name == 'help': |
| 577 print available |
| 578 else: |
| 579 error_func('"%s" is not a valid suite. %s' % |
| 580 (options.suite_name, available)) |
| 581 |
| 582 |
| 550 def _RunGTests(options, devices): | 583 def _RunGTests(options, devices): |
| 551 """Subcommand of RunTestsCommands which runs gtests.""" | 584 """Subcommand of RunTestsCommands which runs gtests.""" |
| 552 ProcessGTestOptions(options) | 585 ProcessGTestOptions(options) |
| 553 | 586 |
| 554 exit_code = 0 | 587 exit_code = 0 |
| 555 for suite_name in options.suite_name: | 588 for suite_name in options.suite_name: |
| 556 # TODO(gkanwar): Move this into ProcessGTestOptions once we require -s for | 589 # TODO(gkanwar): Move this into ProcessGTestOptions once we require -s for |
| 557 # the gtest command. | 590 # the gtest command. |
| 558 gtest_options = gtest_test_options.GTestOptions( | 591 gtest_options = gtest_test_options.GTestOptions( |
| 559 options.tool, | 592 options.tool, |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 730 if perf_options.single_step: | 763 if perf_options.single_step: |
| 731 return perf_test_runner.PrintTestOutput('single_step') | 764 return perf_test_runner.PrintTestOutput('single_step') |
| 732 | 765 |
| 733 perf_test_runner.PrintSummary(tests) | 766 perf_test_runner.PrintSummary(tests) |
| 734 | 767 |
| 735 # Always return 0 on the sharding stage. Individual tests exit_code | 768 # Always return 0 on the sharding stage. Individual tests exit_code |
| 736 # will be returned on the print_step stage. | 769 # will be returned on the print_step stage. |
| 737 return 0 | 770 return 0 |
| 738 | 771 |
| 739 | 772 |
| 773 def _RunPythonTests(options, error_func): |
| 774 """Subcommand of RunTestsCommand which runs python unit tests.""" |
| 775 ProcessPythonTestOptions(options, error_func) |
| 776 |
| 777 suite_vars = constants.PYTHON_UNIT_TEST_SUITES[options.suite_name] |
| 778 suite_path = suite_vars['path'] |
| 779 suite_test_modules = suite_vars['test_modules'] |
| 780 |
| 781 sys.path = [suite_path] + sys.path |
| 782 try: |
| 783 suite = unittest.TestSuite() |
| 784 suite.addTests(unittest.defaultTestLoader.loadTestsFromName(m) |
| 785 for m in suite_test_modules) |
| 786 runner = unittest.TextTestRunner(verbosity=1+options.verbose_count) |
| 787 return 0 if runner.run(suite).wasSuccessful() else 1 |
| 788 finally: |
| 789 sys.path = sys.path[1:] |
| 790 |
| 791 |
| 740 def _GetAttachedDevices(test_device=None): | 792 def _GetAttachedDevices(test_device=None): |
| 741 """Get all attached devices. | 793 """Get all attached devices. |
| 742 | 794 |
| 743 Args: | 795 Args: |
| 744 test_device: Name of a specific device to use. | 796 test_device: Name of a specific device to use. |
| 745 | 797 |
| 746 Returns: | 798 Returns: |
| 747 A list of attached devices. | 799 A list of attached devices. |
| 748 """ | 800 """ |
| 749 attached_devices = [] | 801 attached_devices = [] |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 783 option_parser.error('Unrecognized arguments: %s' % (' '.join(args[2:]))) | 835 option_parser.error('Unrecognized arguments: %s' % (' '.join(args[2:]))) |
| 784 return constants.ERROR_EXIT_CODE | 836 return constants.ERROR_EXIT_CODE |
| 785 if command == 'perf': | 837 if command == 'perf': |
| 786 if ((options.single_step and len(args) <= 2) or | 838 if ((options.single_step and len(args) <= 2) or |
| 787 (not options.single_step and len(args) > 2)): | 839 (not options.single_step and len(args) > 2)): |
| 788 option_parser.error('Unrecognized arguments: %s' % (' '.join(args))) | 840 option_parser.error('Unrecognized arguments: %s' % (' '.join(args))) |
| 789 return constants.ERROR_EXIT_CODE | 841 return constants.ERROR_EXIT_CODE |
| 790 | 842 |
| 791 ProcessCommonOptions(options) | 843 ProcessCommonOptions(options) |
| 792 | 844 |
| 793 devices = _GetAttachedDevices(options.test_device) | 845 if command in HOST_TESTS: |
| 846 devices = [] |
| 847 else: |
| 848 devices = _GetAttachedDevices(options.test_device) |
| 794 | 849 |
| 795 forwarder.Forwarder.RemoveHostLog() | 850 forwarder.Forwarder.RemoveHostLog() |
| 796 if not ports.ResetTestServerPortAllocation(): | 851 if not ports.ResetTestServerPortAllocation(): |
| 797 raise Exception('Failed to reset test server port.') | 852 raise Exception('Failed to reset test server port.') |
| 798 | 853 |
| 799 if command == 'gtest': | 854 if command == 'gtest': |
| 800 return _RunGTests(options, devices) | 855 return _RunGTests(options, devices) |
| 801 elif command == 'linker': | 856 elif command == 'linker': |
| 802 return _RunLinkerTests(options, devices) | 857 return _RunLinkerTests(options, devices) |
| 803 elif command == 'instrumentation': | 858 elif command == 'instrumentation': |
| 804 return _RunInstrumentationTests(options, option_parser.error, devices) | 859 return _RunInstrumentationTests(options, option_parser.error, devices) |
| 805 elif command == 'uiautomator': | 860 elif command == 'uiautomator': |
| 806 return _RunUIAutomatorTests(options, option_parser.error, devices) | 861 return _RunUIAutomatorTests(options, option_parser.error, devices) |
| 807 elif command == 'junit': | 862 elif command == 'junit': |
| 808 return _RunJUnitTests(options, option_parser.error) | 863 return _RunJUnitTests(options, option_parser.error) |
| 809 elif command == 'monkey': | 864 elif command == 'monkey': |
| 810 return _RunMonkeyTests(options, option_parser.error, devices) | 865 return _RunMonkeyTests(options, option_parser.error, devices) |
| 811 elif command == 'perf': | 866 elif command == 'perf': |
| 812 return _RunPerfTests(options, args, option_parser.error) | 867 return _RunPerfTests(options, args, option_parser.error) |
| 868 elif command == 'python': |
| 869 return _RunPythonTests(options, option_parser.error) |
| 813 else: | 870 else: |
| 814 raise Exception('Unknown test type.') | 871 raise Exception('Unknown test type.') |
| 815 | 872 |
| 816 | 873 |
| 817 def HelpCommand(command, _options, args, option_parser): | 874 def HelpCommand(command, _options, args, option_parser): |
| 818 """Display help for a certain command, or overall help. | 875 """Display help for a certain command, or overall help. |
| 819 | 876 |
| 820 Args: | 877 Args: |
| 821 command: String indicating the command that was received to trigger | 878 command: String indicating the command that was received to trigger |
| 822 this function. | 879 this function. |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 865 'instrumentation': CommandFunctionTuple( | 922 'instrumentation': CommandFunctionTuple( |
| 866 AddInstrumentationTestOptions, RunTestsCommand), | 923 AddInstrumentationTestOptions, RunTestsCommand), |
| 867 'uiautomator': CommandFunctionTuple( | 924 'uiautomator': CommandFunctionTuple( |
| 868 AddUIAutomatorTestOptions, RunTestsCommand), | 925 AddUIAutomatorTestOptions, RunTestsCommand), |
| 869 'junit': CommandFunctionTuple( | 926 'junit': CommandFunctionTuple( |
| 870 AddJUnitTestOptions, RunTestsCommand), | 927 AddJUnitTestOptions, RunTestsCommand), |
| 871 'monkey': CommandFunctionTuple( | 928 'monkey': CommandFunctionTuple( |
| 872 AddMonkeyTestOptions, RunTestsCommand), | 929 AddMonkeyTestOptions, RunTestsCommand), |
| 873 'perf': CommandFunctionTuple( | 930 'perf': CommandFunctionTuple( |
| 874 AddPerfTestOptions, RunTestsCommand), | 931 AddPerfTestOptions, RunTestsCommand), |
| 932 'python': CommandFunctionTuple( |
| 933 AddPythonTestOptions, RunTestsCommand), |
| 875 'linker': CommandFunctionTuple( | 934 'linker': CommandFunctionTuple( |
| 876 AddLinkerTestOptions, RunTestsCommand), | 935 AddLinkerTestOptions, RunTestsCommand), |
| 877 'help': CommandFunctionTuple(lambda option_parser: None, HelpCommand) | 936 'help': CommandFunctionTuple(lambda option_parser: None, HelpCommand) |
| 878 } | 937 } |
| 879 | 938 |
| 880 | 939 |
| 881 def DumpThreadStacks(_signal, _frame): | 940 def DumpThreadStacks(_signal, _frame): |
| 882 for thread in threading.enumerate(): | 941 for thread in threading.enumerate(): |
| 883 reraiser_thread.LogThreadStack(thread) | 942 reraiser_thread.LogThreadStack(thread) |
| 884 | 943 |
| 885 | 944 |
| 886 def main(): | 945 def main(): |
| 887 signal.signal(signal.SIGUSR1, DumpThreadStacks) | 946 signal.signal(signal.SIGUSR1, DumpThreadStacks) |
| 888 option_parser = command_option_parser.CommandOptionParser( | 947 option_parser = command_option_parser.CommandOptionParser( |
| 889 commands_dict=VALID_COMMANDS) | 948 commands_dict=VALID_COMMANDS) |
| 890 return command_option_parser.ParseAndExecute(option_parser) | 949 return command_option_parser.ParseAndExecute(option_parser) |
| 891 | 950 |
| 892 | 951 |
| 893 if __name__ == '__main__': | 952 if __name__ == '__main__': |
| 894 sys.exit(main()) | 953 sys.exit(main()) |
| OLD | NEW |