1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#!/usr/bin/env python
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# Copyright 2013 The Chromium Authors. All rights reserved.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# Use of this source code is governed by a BSD-style license that can be
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# found in the LICENSE file.
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)"""Runs all types of tests from one unified interface."""
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport collections
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import logging
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport optparse
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport os
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochimport shutil
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)import signal
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport sys
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)import threading
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from pylib import android_commands
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochfrom pylib import constants
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)from pylib import forwarder
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochfrom pylib import ports
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochfrom pylib.base import base_test_result
23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochfrom pylib.base import test_dispatcher
24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochfrom pylib.gtest import gtest_config
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)from pylib.gtest import setup as gtest_setup
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)from pylib.gtest import test_options as gtest_test_options
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)from pylib.linker import setup as linker_setup
283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochfrom pylib.host_driven import setup as host_driven_setup
29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochfrom pylib.instrumentation import setup as instrumentation_setup
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)from pylib.instrumentation import test_options as instrumentation_test_options
31bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochfrom pylib.monkey import setup as monkey_setup
32bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochfrom pylib.monkey import test_options as monkey_test_options
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from pylib.perf import setup as perf_setup
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from pylib.perf import test_options as perf_test_options
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from pylib.perf import test_runner as perf_test_runner
36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochfrom pylib.uiautomator import setup as uiautomator_setup
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)from pylib.uiautomator import test_options as uiautomator_test_options
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)from pylib.utils import command_option_parser
39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochfrom pylib.utils import report_results
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)from pylib.utils import reraiser_thread
41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochfrom pylib.utils import run_tests_helper
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdef AddCommonOptions(option_parser):
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  """Adds all common options to |option_parser|."""
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  group = optparse.OptionGroup(option_parser, 'Common Options')
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  default_build_type = os.environ.get('BUILDTYPE', 'Debug')
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  group.add_option('--debug', action='store_const', const='Debug',
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   dest='build_type', default=default_build_type,
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   help=('If set, run test suites under out/Debug. '
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                         'Default is env var BUILDTYPE or Debug.'))
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  group.add_option('--release', action='store_const',
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   const='Release', dest='build_type',
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   help=('If set, run test suites under out/Release.'
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                         ' Default is env var BUILDTYPE or Debug.'))
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  group.add_option('-c', dest='cleanup_test_files',
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   help='Cleanup test files on the device after run',
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   action='store_true')
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  group.add_option('--num_retries', dest='num_retries', type='int',
61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   default=2,
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   help=('Number of retries for a test before '
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                         'giving up.'))
64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  group.add_option('-v',
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   '--verbose',
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   dest='verbose_count',
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   default=0,
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   action='count',
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   help='Verbose level (multiple times for more)')
70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  group.add_option('--tool',
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   dest='tool',
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   help=('Run the test under a tool '
73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                         '(use --tool help to list them)'))
74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  group.add_option('--flakiness-dashboard-server',
75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   dest='flakiness_dashboard_server',
76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   help=('Address of the server that is hosting the '
77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                         'Chrome for Android flakiness dashboard.'))
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  group.add_option('--skip-deps-push', dest='push_deps',
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   action='store_false', default=True,
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   help=('Do not push dependencies to the device. '
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                         'Use this at own risk for speeding up test '
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                         'execution on local machine.'))
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  group.add_option('-d', '--device', dest='test_device',
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   help=('Target device for the test suite '
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                         'to run on.'))
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  option_parser.add_option_group(group)
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdef ProcessCommonOptions(options):
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  """Processes and handles all common options."""
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  run_tests_helper.SetLogLevel(options.verbose_count)
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  constants.SetBuildType(options.build_type)
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochdef AddGTestOptions(option_parser):
967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  """Adds gtest options to |option_parser|."""
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  option_parser.usage = '%prog gtest [options]'
99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  option_parser.commands_dict = {}
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  option_parser.example = '%prog gtest -s base_unittests'
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  # TODO(gkanwar): Make this option required
103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  option_parser.add_option('-s', '--suite', dest='suite_name',
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                           help=('Executable name of the test suite to run '
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                 '(use -s help to list them).'))
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  option_parser.add_option('-f', '--gtest_filter', '--gtest-filter',
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           dest='test_filter',
108fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch                           help='googletest-style filter string.')
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  option_parser.add_option('--gtest_also_run_disabled_tests',
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           '--gtest-also-run-disabled-tests',
111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                           dest='run_disabled', action='store_true',
112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                           help='Also run disabled tests if applicable.')
113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  option_parser.add_option('-a', '--test-arguments', dest='test_arguments',
114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                           default='',
115fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch                           help='Additional arguments to pass to the test.')
116fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  option_parser.add_option('-t', dest='timeout',
117fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch                           help='Timeout to wait for each test',
118fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch                           type='int',
119fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch                           default=60)
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  option_parser.add_option('--isolate_file_path',
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           '--isolate-file-path',
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           dest='isolate_file_path',
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           help='.isolate file path to override the default '
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                'path')
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  # TODO(gkanwar): Move these to Common Options once we have the plumbing
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  # in our other test types to handle these commands
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddCommonOptions(option_parser)
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)def AddLinkerTestOptions(option_parser):
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  option_parser.usage = '%prog linker'
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  option_parser.commands_dict = {}
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  option_parser.example = '%prog linker'
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  option_parser.add_option('-f', '--gtest-filter', dest='test_filter',
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           help='googletest-style filter string.')
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddCommonOptions(option_parser)
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
140ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochdef ProcessGTestOptions(options):
141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  """Intercept test suite help to list test suites.
142ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
143ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  Args:
144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    options: Command line options.
145ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  """
146ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if options.suite_name == 'help':
147ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    print 'Available test suites are:'
148fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    for test_suite in (gtest_config.STABLE_TEST_SUITES +
149fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch                       gtest_config.EXPERIMENTAL_TEST_SUITES):
150fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch      print test_suite
151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    sys.exit(0)
152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
153ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  # Convert to a list, assuming all test suites if nothing was specified.
154ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  # TODO(gkanwar): Require having a test suite
155ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if options.suite_name:
156ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    options.suite_name = [options.suite_name]
157ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  else:
158fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    options.suite_name = [s for s in gtest_config.STABLE_TEST_SUITES]
159ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdef AddJavaTestOptions(option_parser):
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  """Adds the Java test options to |option_parser|."""
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
164d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  option_parser.add_option('-f', '--test-filter', dest='test_filter',
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           help=('Test filter (if not fully qualified, '
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 'will run all matches).'))
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  option_parser.add_option(
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      '-A', '--annotation', dest='annotation_str',
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      help=('Comma-separated list of annotations. Run only tests with any of '
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            'the given annotations. An annotation can be either a key or a '
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            'key-values pair. A test that has no annotation is considered '
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            '"SmallTest".'))
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  option_parser.add_option(
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      '-E', '--exclude-annotation', dest='exclude_annotation_str',
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      help=('Comma-separated list of annotations. Exclude tests with these '
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            'annotations.'))
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  option_parser.add_option('--screenshot', dest='screenshot_failures',
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           action='store_true',
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           help='Capture screenshots of test failures')
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  option_parser.add_option('--save-perf-json', action='store_true',
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           help='Saves the JSON file for each UI Perf test.')
1823240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  option_parser.add_option('--official-build', action='store_true',
1833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                           help='Run official build tests.')
184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  option_parser.add_option('--test_data', action='append', default=[],
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           help=('Each instance defines a directory of test '
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 'data that should be copied to the target(s) '
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 'before running the tests. The argument '
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 'should be of the form <target>:<source>, '
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 '<target> is relative to the device data'
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 'directory, and <source> is relative to the '
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 'chromium build directory.'))
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochdef ProcessJavaTestOptions(options):
195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  """Processes options/arguments and populates |options| with defaults."""
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if options.annotation_str:
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    options.annotations = options.annotation_str.split(',')
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  elif options.test_filter:
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    options.annotations = []
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  else:
202ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    options.annotations = ['Smoke', 'SmallTest', 'MediumTest', 'LargeTest',
203ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                           'EnormousTest']
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if options.exclude_annotation_str:
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    options.exclude_annotations = options.exclude_annotation_str.split(',')
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  else:
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    options.exclude_annotations = []
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdef AddInstrumentationTestOptions(option_parser):
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  """Adds Instrumentation test options to |option_parser|."""
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  option_parser.usage = '%prog instrumentation [options]'
215d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  option_parser.commands_dict = {}
216558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  option_parser.example = ('%prog instrumentation '
217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           '--test-apk=ChromeShellTest')
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddJavaTestOptions(option_parser)
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddCommonOptions(option_parser)
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
222d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  option_parser.add_option('-j', '--java-only', action='store_true',
2233240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                           default=False, help='Run only the Java tests.')
224d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  option_parser.add_option('-p', '--python-only', action='store_true',
2253240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                           default=False,
2263240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                           help='Run only the host-driven tests.')
2273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  option_parser.add_option('--host-driven-root',
2283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                           help='Root of the host-driven tests.')
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  option_parser.add_option('-w', '--wait_debugger', dest='wait_for_debugger',
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           action='store_true',
231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           help='Wait for debugger.')
232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  option_parser.add_option(
233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      '--test-apk', dest='test_apk',
234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      help=('The name of the apk containing the tests '
23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            '(without the .apk extension; e.g. "ContentShellTest").'))
2363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  option_parser.add_option('--coverage-dir',
2373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                           help=('Directory in which to place all generated '
2383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 'EMMA coverage files.'))
239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdef ProcessInstrumentationOptions(options, error_func):
242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  """Processes options/arguments and populate |options| with defaults.
243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  Args:
245a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    options: optparse.Options object.
246a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    error_func: Function to call with the error message in case of an error.
247a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
248a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  Returns:
249a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    An InstrumentationOptions named tuple which contains all options relevant to
250a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    instrumentation tests.
251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  """
252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ProcessJavaTestOptions(options)
254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if options.java_only and options.python_only:
2563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    error_func('Options java_only (-j) and python_only (-p) '
2573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch               'are mutually exclusive.')
2583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  options.run_java_tests = True
2593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  options.run_python_tests = True
2603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if options.java_only:
2613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    options.run_python_tests = False
2623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  elif options.python_only:
2633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    options.run_java_tests = False
2643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if not options.host_driven_root:
2663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    options.run_python_tests = False
2673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if not options.test_apk:
269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    error_func('--test-apk must be specified.')
270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
27268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  options.test_apk_path = os.path.join(constants.GetOutDirectory(),
27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                       constants.SDK_BUILD_APKS_DIR,
27468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                       '%s.apk' % options.test_apk)
27568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  options.test_apk_jar_path = os.path.join(
27668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      constants.GetOutDirectory(),
27768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      constants.SDK_BUILD_TEST_JAVALIB_DIR,
27868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      '%s.jar' %  options.test_apk)
279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return instrumentation_test_options.InstrumentationOptions(
281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.tool,
282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.cleanup_test_files,
283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.push_deps,
284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.annotations,
285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.exclude_annotations,
286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.test_filter,
287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.test_data,
288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.save_perf_json,
289a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.screenshot_failures,
290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.wait_for_debugger,
2913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      options.coverage_dir,
292a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.test_apk,
293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.test_apk_path,
294a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.test_apk_jar_path)
295a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
296eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdef AddUIAutomatorTestOptions(option_parser):
298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  """Adds UI Automator test options to |option_parser|."""
299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  option_parser.usage = '%prog uiautomator [options]'
301d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  option_parser.commands_dict = {}
302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  option_parser.example = (
303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      '%prog uiautomator --test-jar=chrome_shell_uiautomator_tests'
304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ' --package=chrome_shell')
305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  option_parser.add_option(
3064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      '--package',
3074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      help=('Package under test. Possible values: %s' %
3084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            constants.PACKAGE_INFO.keys()))
309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  option_parser.add_option(
310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      '--test-jar', dest='test_jar',
311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      help=('The name of the dexed jar containing the tests (without the '
312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            '.dex.jar extension). Alternatively, this can be a full path '
313eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            'to the jar.'))
314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddJavaTestOptions(option_parser)
316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  AddCommonOptions(option_parser)
317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdef ProcessUIAutomatorOptions(options, error_func):
320a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  """Processes UIAutomator options/arguments.
321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
322a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  Args:
323a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    options: optparse.Options object.
324a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    error_func: Function to call with the error message in case of an error.
325a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
326a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  Returns:
327a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    A UIAutomatorOptions named tuple which contains all options relevant to
328bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    uiautomator tests.
329a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  """
330eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
331effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ProcessJavaTestOptions(options)
332eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if not options.package:
3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    error_func('--package is required.')
3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if options.package not in constants.PACKAGE_INFO:
3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    error_func('Invalid package.')
338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if not options.test_jar:
340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    error_func('--test-jar must be specified.')
341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if os.path.exists(options.test_jar):
343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    # The dexed JAR is fully qualified, assume the info JAR lives along side.
344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    options.uiautomator_jar = options.test_jar
345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  else:
346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    options.uiautomator_jar = os.path.join(
34768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        constants.GetOutDirectory(),
34868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        constants.SDK_BUILD_JAVALIB_DIR,
349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        '%s.dex.jar' % options.test_jar)
350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  options.uiautomator_info_jar = (
351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      options.uiautomator_jar[:options.uiautomator_jar.find('.dex.jar')] +
352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      '_java.jar')
353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
354a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return uiautomator_test_options.UIAutomatorOptions(
355a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.tool,
356a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.cleanup_test_files,
357a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.push_deps,
358a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.annotations,
359a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.exclude_annotations,
360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.test_filter,
361a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.test_data,
362a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.save_perf_json,
363a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.screenshot_failures,
364a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.uiautomator_jar,
365a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      options.uiautomator_info_jar,
3664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      options.package)
367a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
369bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochdef AddMonkeyTestOptions(option_parser):
370bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  """Adds monkey test options to |option_parser|."""
371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  option_parser.usage = '%prog monkey [options]'
373d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  option_parser.commands_dict = {}
374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  option_parser.example = (
375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      '%prog monkey --package=chrome_shell')
376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
377bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  option_parser.add_option(
3784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      '--package',
3794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      help=('Package under test. Possible values: %s' %
3804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            constants.PACKAGE_INFO.keys()))
381bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  option_parser.add_option(
382bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      '--event-count', default=10000, type='int',
383bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      help='Number of events to generate [default: %default].')
384bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  option_parser.add_option(
385bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      '--category', default='',
386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      help='A list of allowed categories.')
387bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  option_parser.add_option(
388bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      '--throttle', default=100, type='int',
389bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      help='Delay between events (ms) [default: %default]. ')
390bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  option_parser.add_option(
391bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      '--seed', type='int',
392bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      help=('Seed value for pseudo-random generator. Same seed value generates '
393bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch            'the same sequence of events. Seed is randomized by default.'))
394bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  option_parser.add_option(
395bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      '--extra-args', default='',
396bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      help=('String of other args to pass to the command verbatim '
397bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch            '[default: "%default"].'))
398bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
399bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  AddCommonOptions(option_parser)
400bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
401bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
402bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochdef ProcessMonkeyTestOptions(options, error_func):
403bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  """Processes all monkey test options.
404bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
405bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  Args:
406bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    options: optparse.Options object.
407bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    error_func: Function to call with the error message in case of an error.
408bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
409bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  Returns:
410bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    A MonkeyOptions named tuple which contains all options relevant to
411bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    monkey tests.
412bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  """
4134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if not options.package:
4144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    error_func('--package is required.')
4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if options.package not in constants.PACKAGE_INFO:
4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    error_func('Invalid package.')
418bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
419bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  category = options.category
420bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  if category:
421bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    category = options.category.split(',')
422bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
423bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  return monkey_test_options.MonkeyOptions(
424bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      options.verbose_count,
4254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      options.package,
426bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      options.event_count,
427bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      category,
428bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      options.throttle,
429bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      options.seed,
430bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      options.extra_args)
431bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
432bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
4333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)def AddPerfTestOptions(option_parser):
4343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  """Adds perf test options to |option_parser|."""
4353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  option_parser.usage = '%prog perf [options]'
437d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  option_parser.commands_dict = {}
438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  option_parser.example = ('%prog perf '
439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           '[--single-step -- command args] or '
440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           '[--steps perf_steps.json] or '
441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           '[--print-step step]')
4423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
44358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  option_parser.add_option(
444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      '--single-step',
445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      action='store_true',
446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      help='Execute the given command with retries, but only print the result '
447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)           'for the "most successful" round.')
448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  option_parser.add_option(
44958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      '--steps',
450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      help='JSON file containing the list of commands to run.')
45158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  option_parser.add_option(
45258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      '--flaky-steps',
45358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      help=('A JSON file containing steps that are flaky '
45458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            'and will have its exit code ignored.'))
45558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  option_parser.add_option(
456f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      '--output-json-list',
457f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      help='Write a simple list of names from --steps into the given file.')
458f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  option_parser.add_option(
45958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      '--print-step',
46058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      help='The name of a previously executed perf step to print.')
46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  option_parser.add_option(
46258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      '--no-timeout', action='store_true',
46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      help=('Do not impose a timeout. Each perf step is responsible for '
46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            'implementing the timeout logic.'))
4654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  option_parser.add_option(
4664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      '-f', '--test-filter',
4674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      help=('Test filter (will match against the names listed in --steps).'))
4684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  option_parser.add_option(
4694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      '--dry-run',
4704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      action='store_true',
4714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      help='Just print the steps without executing.')
4723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  AddCommonOptions(option_parser)
4733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)def ProcessPerfTestOptions(options, args, error_func):
4763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  """Processes all perf test options.
4773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Args:
4793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    options: optparse.Options object.
4803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    error_func: Function to call with the error message in case of an error.
4813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Returns:
4833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    A PerfOptions named tuple which contains all options relevant to
4843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    perf tests.
4853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  """
486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  # Only one of steps, print_step or single_step must be provided.
487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  count = len(filter(None,
488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     [options.steps, options.print_step, options.single_step]))
489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if count != 1:
490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    error_func('Please specify one of: --steps, --print-step, --single-step.')
491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  single_step = None
492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if options.single_step:
493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    single_step = ' '.join(args[2:])
4943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return perf_test_options.PerfOptions(
495f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      options.steps, options.flaky_steps, options.output_json_list,
496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      options.print_step, options.no_timeout, options.test_filter,
497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      options.dry_run, single_step)
4983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
500effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochdef _RunGTests(options, devices):
501ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  """Subcommand of RunTestsCommands which runs gtests."""
502a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ProcessGTestOptions(options)
503ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
504ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  exit_code = 0
505ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for suite_name in options.suite_name:
506a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    # TODO(gkanwar): Move this into ProcessGTestOptions once we require -s for
507a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    # the gtest command.
508a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    gtest_options = gtest_test_options.GTestOptions(
509a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        options.tool,
510a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        options.cleanup_test_files,
511a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        options.push_deps,
512a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        options.test_filter,
513d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        options.run_disabled,
514a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        options.test_arguments,
515a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        options.timeout,
516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        options.isolate_file_path,
517a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        suite_name)
5183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    runner_factory, tests = gtest_setup.Setup(gtest_options, devices)
519ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
520ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    results, test_exit_code = test_dispatcher.RunTests(
5213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        tests, runner_factory, devices, shard=True, test_timeout=None,
522ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        num_retries=options.num_retries)
523ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
524ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if test_exit_code and exit_code != constants.ERROR_EXIT_CODE:
525ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      exit_code = test_exit_code
526ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
527ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    report_results.LogFull(
528ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        results=results,
529ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        test_type='Unit test',
530ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        test_package=suite_name,
531ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        flakiness_server=options.flakiness_dashboard_server)
532ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
533ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if os.path.isdir(constants.ISOLATE_DEPS_DIR):
534ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    shutil.rmtree(constants.ISOLATE_DEPS_DIR)
535ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
536ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return exit_code
537ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
538ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
539effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochdef _RunLinkerTests(options, devices):
5404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  """Subcommand of RunTestsCommands which runs linker tests."""
5414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  runner_factory, tests = linker_setup.Setup(options, devices)
5424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  results, exit_code = test_dispatcher.RunTests(
5444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      tests, runner_factory, devices, shard=True, test_timeout=60,
5454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      num_retries=options.num_retries)
5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  report_results.LogFull(
5484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      results=results,
5494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      test_type='Linker test',
5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      test_package='ChromiumLinkerTest')
5514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return exit_code
5534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)def _RunInstrumentationTests(options, error_func, devices):
556ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  """Subcommand of RunTestsCommands which runs instrumentation tests."""
557a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  instrumentation_options = ProcessInstrumentationOptions(options, error_func)
558ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
5593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if len(devices) > 1 and options.wait_for_debugger:
5603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    logging.warning('Debugger can not be sharded, using first available device')
5613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    devices = devices[:1]
5623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
563ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  results = base_test_result.TestRunResults()
564ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  exit_code = 0
565ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
566ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if options.run_java_tests:
567a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    runner_factory, tests = instrumentation_setup.Setup(instrumentation_options)
568ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
569ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    test_results, exit_code = test_dispatcher.RunTests(
5703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        tests, runner_factory, devices, shard=True, test_timeout=None,
571ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        num_retries=options.num_retries)
572ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
573ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    results.AddTestRunResults(test_results)
574ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
575ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if options.run_python_tests:
5763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    runner_factory, tests = host_driven_setup.InstrumentationSetup(
5773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        options.host_driven_root, options.official_build,
5783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        instrumentation_options)
579ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
5803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    if tests:
5813240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      test_results, test_exit_code = test_dispatcher.RunTests(
5823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          tests, runner_factory, devices, shard=True, test_timeout=None,
5833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch          num_retries=options.num_retries)
584ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
5853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      results.AddTestRunResults(test_results)
5863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
5873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      # Only allow exit code escalation
5883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      if test_exit_code and exit_code != constants.ERROR_EXIT_CODE:
5893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        exit_code = test_exit_code
590ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
591ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  report_results.LogFull(
592ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      results=results,
593ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      test_type='Instrumentation',
594ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      test_package=os.path.basename(options.test_apk),
595ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      annotation=options.annotations,
596ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      flakiness_server=options.flakiness_dashboard_server)
597ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
598ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return exit_code
599ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
600ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
6013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)def _RunUIAutomatorTests(options, error_func, devices):
602ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  """Subcommand of RunTestsCommands which runs uiautomator tests."""
603a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  uiautomator_options = ProcessUIAutomatorOptions(options, error_func)
604ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
6053240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  runner_factory, tests = uiautomator_setup.Setup(uiautomator_options)
606ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
6073240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  results, exit_code = test_dispatcher.RunTests(
6083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      tests, runner_factory, devices, shard=True, test_timeout=None,
6093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      num_retries=options.num_retries)
610ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
611ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  report_results.LogFull(
612ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      results=results,
613ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      test_type='UIAutomator',
614ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      test_package=os.path.basename(options.test_jar),
615ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      annotation=options.annotations,
616ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      flakiness_server=options.flakiness_dashboard_server)
617ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
618ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return exit_code
619ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
620ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
6213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)def _RunMonkeyTests(options, error_func, devices):
622bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  """Subcommand of RunTestsCommands which runs monkey tests."""
623bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  monkey_options = ProcessMonkeyTestOptions(options, error_func)
624bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
625bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  runner_factory, tests = monkey_setup.Setup(monkey_options)
626bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
627bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  results, exit_code = test_dispatcher.RunTests(
62858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      tests, runner_factory, devices, shard=False, test_timeout=None,
62958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      num_retries=options.num_retries)
630bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
631bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  report_results.LogFull(
632bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      results=results,
633bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      test_type='Monkey',
6343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      test_package='Monkey')
635bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
636bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  return exit_code
637bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
638bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
63946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)def _RunPerfTests(options, args, error_func):
6403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  """Subcommand of RunTestsCommands which runs perf tests."""
641f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  perf_options = ProcessPerfTestOptions(options, args, error_func)
642f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
643f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  # Just save a simple json with a list of test names.
644f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if perf_options.output_json_list:
645f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return perf_test_runner.OutputJsonList(
646f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        perf_options.steps, perf_options.output_json_list)
647f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
648f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  # Just print the results from a single previously executed step.
6493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if perf_options.print_step:
6503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return perf_test_runner.PrintTestOutput(perf_options.print_step)
6513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
65246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  runner_factory, tests, devices = perf_setup.Setup(perf_options)
6533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
65446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  # shard=False means that each device will get the full list of tests
65546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  # and then each one will decide their own affinity.
65646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  # shard=True means each device will pop the next test available from a queue,
65746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  # which increases throughput but have no affinity.
6583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  results, _ = test_dispatcher.RunTests(
65946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      tests, runner_factory, devices, shard=False, test_timeout=None,
66058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      num_retries=options.num_retries)
6613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  report_results.LogFull(
6633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      results=results,
6643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      test_type='Perf',
6653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      test_package='Perf')
666f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
667f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if perf_options.single_step:
668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return perf_test_runner.PrintTestOutput('single_step')
669f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  perf_test_runner.PrintSummary(tests)
6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  # Always return 0 on the sharding stage. Individual tests exit_code
6733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  # will be returned on the print_step stage.
6743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return 0
6753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)def _GetAttachedDevices(test_device=None):
6783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  """Get all attached devices.
6793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Args:
6813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    test_device: Name of a specific device to use.
6823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Returns:
6843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    A list of attached devices.
6853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  """
6863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  attached_devices = []
6873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  attached_devices = android_commands.GetAttachedDevices()
6893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if test_device:
6903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    assert test_device in attached_devices, (
6913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        'Did not find device %s among attached device. Attached devices: %s'
6923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        % (test_device, ', '.join(attached_devices)))
6933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    attached_devices = [test_device]
6943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  assert attached_devices, 'No devices attached.'
6963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return sorted(attached_devices)
6983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
699bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
700eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdef RunTestsCommand(command, options, args, option_parser):
701eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  """Checks test type and dispatches to the appropriate function.
702eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
703eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Args:
704eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    command: String indicating the command that was received to trigger
705eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        this function.
706eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    options: optparse options dictionary.
707eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    args: List of extra args from optparse.
708eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    option_parser: optparse.OptionParser object.
709eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
710eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Returns:
711eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Integer indicated exit code.
7127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Raises:
7147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Exception: Unknown command name passed in, or an exception from an
7157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        individual test runner.
716eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  """
717eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  # Check for extra arguments
719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if len(args) > 2 and command != 'perf':
7207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    option_parser.error('Unrecognized arguments: %s' % (' '.join(args[2:])))
7217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return constants.ERROR_EXIT_CODE
722f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if command == 'perf':
723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if ((options.single_step and len(args) <= 2) or
724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        (not options.single_step and len(args) > 2)):
725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      option_parser.error('Unrecognized arguments: %s' % (' '.join(args)))
726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return constants.ERROR_EXIT_CODE
7277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
728eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ProcessCommonOptions(options)
729eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  devices = _GetAttachedDevices(options.test_device)
7313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
732f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  forwarder.Forwarder.RemoveHostLog()
733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if not ports.ResetTestServerPortAllocation():
734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    raise Exception('Failed to reset test server port.')
735f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
736eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if command == 'gtest':
737effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return _RunGTests(options, devices)
7384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  elif command == 'linker':
739effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return _RunLinkerTests(options, devices)
740eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  elif command == 'instrumentation':
7413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return _RunInstrumentationTests(options, option_parser.error, devices)
742eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  elif command == 'uiautomator':
7433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return _RunUIAutomatorTests(options, option_parser.error, devices)
744bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  elif command == 'monkey':
7453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return _RunMonkeyTests(options, option_parser.error, devices)
7463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  elif command == 'perf':
74746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return _RunPerfTests(options, args, option_parser.error)
748eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  else:
749ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    raise Exception('Unknown test type.')
750eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
751eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
752effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochdef HelpCommand(command, _options, args, option_parser):
753eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  """Display help for a certain command, or overall help.
754eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
755eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Args:
756eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    command: String indicating the command that was received to trigger
757eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        this function.
758effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    options: optparse options dictionary. unused.
759eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    args: List of extra args from optparse.
760eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    option_parser: optparse.OptionParser object.
761eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
762eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Returns:
763eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Integer indicated exit code.
764eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  """
765eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  # If we don't have any args, display overall help
766eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if len(args) < 3:
767eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    option_parser.print_help()
768eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return 0
7697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  # If we have too many args, print an error
7707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if len(args) > 3:
7717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    option_parser.error('Unrecognized arguments: %s' % (' '.join(args[3:])))
7727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return constants.ERROR_EXIT_CODE
773eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
774eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  command = args[2]
775eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
776eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if command not in VALID_COMMANDS:
777eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    option_parser.error('Unrecognized command.')
778eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
779eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  # Treat the help command as a special case. We don't care about showing a
780eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  # specific help page for itself.
781eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if command == 'help':
782eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    option_parser.print_help()
783eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return 0
784eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
785eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  VALID_COMMANDS[command].add_options_func(option_parser)
786eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  option_parser.usage = '%prog ' + command + ' [options]'
787d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  option_parser.commands_dict = {}
788eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  option_parser.print_help()
789eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
790eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return 0
791eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
792eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
793eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# Define a named tuple for the values in the VALID_COMMANDS dictionary so the
794eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# syntax is a bit prettier. The tuple is two functions: (add options, run
795eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# command).
796eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochCommandFunctionTuple = collections.namedtuple(
797eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    'CommandFunctionTuple', ['add_options_func', 'run_command_func'])
798eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochVALID_COMMANDS = {
799eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    'gtest': CommandFunctionTuple(AddGTestOptions, RunTestsCommand),
800eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    'instrumentation': CommandFunctionTuple(
801eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        AddInstrumentationTestOptions, RunTestsCommand),
802eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    'uiautomator': CommandFunctionTuple(
803eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        AddUIAutomatorTestOptions, RunTestsCommand),
804bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    'monkey': CommandFunctionTuple(
805bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        AddMonkeyTestOptions, RunTestsCommand),
8063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'perf': CommandFunctionTuple(
8073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        AddPerfTestOptions, RunTestsCommand),
8084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    'linker': CommandFunctionTuple(
8094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AddLinkerTestOptions, RunTestsCommand),
810eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    'help': CommandFunctionTuple(lambda option_parser: None, HelpCommand)
811eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
812eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
813eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
814effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochdef DumpThreadStacks(_signal, _frame):
815f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for thread in threading.enumerate():
816f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    reraiser_thread.LogThreadStack(thread)
817f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
818f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
819effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochdef main():
820f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  signal.signal(signal.SIGUSR1, DumpThreadStacks)
8213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  option_parser = command_option_parser.CommandOptionParser(
8223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      commands_dict=VALID_COMMANDS)
8233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return command_option_parser.ParseAndExecute(option_parser)
824eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
825eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
826eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochif __name__ == '__main__':
827effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  sys.exit(main())
828