Aviv Keshet | 021c19f | 2013-02-22 13:19:43 -0800 | [diff] [blame] | 1 | #!/usr/bin/python |
| 2 | # Copyright (c) 2013 The Chromium OS Authors. All rights reserved. |
| 3 | # Use of this source code is governed by a BSD-style license that can be |
| 4 | # found in the LICENSE file. |
| 5 | |
| 6 | import argparse |
Aviv Keshet | 0e5d525 | 2013-04-26 16:01:36 -0700 | [diff] [blame] | 7 | import os |
Aviv Keshet | 7cd1231 | 2013-07-25 10:25:55 -0700 | [diff] [blame] | 8 | import pipes |
Aviv Keshet | 1d991ea | 2013-06-12 17:24:23 -0700 | [diff] [blame] | 9 | import signal |
Aviv Keshet | 0e5d525 | 2013-04-26 16:01:36 -0700 | [diff] [blame] | 10 | import subprocess |
Aviv Keshet | 021c19f | 2013-02-22 13:19:43 -0800 | [diff] [blame] | 11 | import sys |
| 12 | |
Aviv Keshet | e43bccf | 2013-08-14 14:11:59 -0700 | [diff] [blame] | 13 | import logging |
| 14 | # Turn the logging level to INFO before importing other autotest |
| 15 | # code, to avoid having failed import logging messages confuse the |
| 16 | # test_that user. |
| 17 | logging.basicConfig(level=logging.INFO) |
| 18 | |
Aviv Keshet | 021c19f | 2013-02-22 13:19:43 -0800 | [diff] [blame] | 19 | import common |
beeps | 4efdf03 | 2013-09-17 11:27:14 -0700 | [diff] [blame] | 20 | from autotest_lib.client.common_lib import error, logging_manager |
Aviv Keshet | e43bccf | 2013-08-14 14:11:59 -0700 | [diff] [blame] | 21 | from autotest_lib.server import server_logging_config |
Simran Basi | 14622bb | 2015-11-25 13:23:40 -0800 | [diff] [blame] | 22 | from autotest_lib.server.cros.dynamic_suite import constants |
| 23 | from autotest_lib.server.hosts import factory |
| 24 | from autotest_lib.site_utils import test_runner_utils |
Aviv Keshet | e43bccf | 2013-08-14 14:11:59 -0700 | [diff] [blame] | 25 | |
Aviv Keshet | d4a0430 | 2013-04-30 15:48:30 -0700 | [diff] [blame] | 26 | |
Aviv Keshet | 0e5d525 | 2013-04-26 16:01:36 -0700 | [diff] [blame] | 27 | try: |
| 28 | from chromite.lib import cros_build_lib |
| 29 | except ImportError: |
| 30 | print 'Unable to import chromite.' |
| 31 | print 'This script must be either:' |
| 32 | print ' - Be run in the chroot.' |
| 33 | print ' - (not yet supported) be run after running ' |
| 34 | print ' ../utils/build_externals.py' |
Aviv Keshet | 021c19f | 2013-02-22 13:19:43 -0800 | [diff] [blame] | 35 | |
Aviv Keshet | 2dc9893 | 2013-06-17 15:22:10 -0700 | [diff] [blame] | 36 | _QUICKMERGE_SCRIPTNAME = '/mnt/host/source/chromite/bin/autotest_quickmerge' |
beeps | 4efdf03 | 2013-09-17 11:27:14 -0700 | [diff] [blame] | 37 | |
| 38 | |
| 39 | def _get_board_from_host(remote): |
| 40 | """Get the board of the remote host. |
| 41 | |
| 42 | @param remote: string representing the IP of the remote host. |
| 43 | |
| 44 | @return: A string representing the board of the remote host. |
| 45 | """ |
| 46 | logging.info('Board unspecified, attempting to determine board from host.') |
| 47 | host = factory.create_host(remote) |
| 48 | try: |
| 49 | board = host.get_board().replace(constants.BOARD_PREFIX, '') |
| 50 | except error.AutoservRunError: |
Simran Basi | 14622bb | 2015-11-25 13:23:40 -0800 | [diff] [blame] | 51 | raise test_runner_utils.TestThatRunError( |
| 52 | 'Cannot determine board, please specify a --board option.') |
beeps | 4efdf03 | 2013-09-17 11:27:14 -0700 | [diff] [blame] | 53 | logging.info('Detected host board: %s', board) |
| 54 | return board |
| 55 | |
| 56 | |
Aviv Keshet | d4a0430 | 2013-04-30 15:48:30 -0700 | [diff] [blame] | 57 | def validate_arguments(arguments): |
Aviv Keshet | 0e5d525 | 2013-04-26 16:01:36 -0700 | [diff] [blame] | 58 | """ |
| 59 | Validates parsed arguments. |
| 60 | |
| 61 | @param arguments: arguments object, as parsed by ParseArguments |
| 62 | @raises: ValueError if arguments were invalid. |
| 63 | """ |
Aviv Keshet | d4a0430 | 2013-04-30 15:48:30 -0700 | [diff] [blame] | 64 | if arguments.remote == ':lab:': |
Aviv Keshet | 30322f9 | 2013-07-18 13:21:52 -0700 | [diff] [blame] | 65 | if arguments.args: |
| 66 | raise ValueError('--args flag not supported when running against ' |
| 67 | ':lab:') |
Aviv Keshet | c5e4609 | 2013-07-19 10:15:40 -0700 | [diff] [blame] | 68 | if arguments.pretend: |
| 69 | raise ValueError('--pretend flag not supported when running ' |
| 70 | 'against :lab:') |
Aviv Keshet | c14951a | 2013-08-12 18:17:35 -0700 | [diff] [blame] | 71 | if arguments.ssh_verbosity: |
| 72 | raise ValueError('--ssh_verbosity flag not supported when running ' |
| 73 | 'against :lab:') |
Prathmesh Prabhu | 68ee1c5 | 2017-07-05 10:21:18 -0700 | [diff] [blame] | 74 | if not arguments.board or arguments.build == test_runner_utils.NO_BUILD: |
J. Richard Barnette | 7c55662 | 2015-12-07 13:36:22 -0800 | [diff] [blame] | 75 | raise ValueError('--board and --build are both required when ' |
| 76 | 'running against :lab:') |
Laurence Goodby | 079312e | 2015-08-05 12:43:04 -0700 | [diff] [blame] | 77 | else: |
| 78 | if arguments.web: |
| 79 | raise ValueError('--web flag not supported when running locally') |
Aviv Keshet | c14951a | 2013-08-12 18:17:35 -0700 | [diff] [blame] | 80 | |
Aviv Keshet | d4a0430 | 2013-04-30 15:48:30 -0700 | [diff] [blame] | 81 | |
| 82 | def parse_arguments(argv): |
Aviv Keshet | 021c19f | 2013-02-22 13:19:43 -0800 | [diff] [blame] | 83 | """ |
| 84 | Parse command line arguments |
| 85 | |
| 86 | @param argv: argument list to parse |
Laurence Goodby | cbb5ba0 | 2015-08-11 11:26:53 -0700 | [diff] [blame] | 87 | @returns: parsed arguments |
| 88 | @raises SystemExit if arguments are malformed, or required arguments |
| 89 | are not present. |
| 90 | """ |
| 91 | return _parse_arguments_internal(argv)[0] |
| 92 | |
| 93 | |
| 94 | def _parse_arguments_internal(argv): |
| 95 | """ |
| 96 | Parse command line arguments |
| 97 | |
| 98 | @param argv: argument list to parse |
Laurence Goodby | 079312e | 2015-08-05 12:43:04 -0700 | [diff] [blame] | 99 | @returns: tuple of parsed arguments and argv suitable for remote runs |
Aviv Keshet | 7cd1231 | 2013-07-25 10:25:55 -0700 | [diff] [blame] | 100 | @raises SystemExit if arguments are malformed, or required arguments |
| 101 | are not present. |
Aviv Keshet | 021c19f | 2013-02-22 13:19:43 -0800 | [diff] [blame] | 102 | """ |
Laurence Goodby | 079312e | 2015-08-05 12:43:04 -0700 | [diff] [blame] | 103 | local_parser, remote_argv = parse_local_arguments(argv) |
| 104 | |
| 105 | parser = argparse.ArgumentParser(description='Run remote tests.', |
| 106 | parents=[local_parser]) |
Aviv Keshet | 021c19f | 2013-02-22 13:19:43 -0800 | [diff] [blame] | 107 | |
Aviv Keshet | 0e5d525 | 2013-04-26 16:01:36 -0700 | [diff] [blame] | 108 | parser.add_argument('remote', metavar='REMOTE', |
Aviv Keshet | 021c19f | 2013-02-22 13:19:43 -0800 | [diff] [blame] | 109 | help='hostname[:port] for remote device. Specify ' |
Aviv Keshet | 61078eb | 2015-11-18 09:14:12 -0800 | [diff] [blame] | 110 | ':lab: to run in test lab. When tests are run in ' |
| 111 | 'the lab, test_that will use the client autotest ' |
| 112 | 'package for the build specified with --build, ' |
| 113 | 'and the lab server code rather than local ' |
| 114 | 'changes.') |
Simran Basi | 14622bb | 2015-11-25 13:23:40 -0800 | [diff] [blame] | 115 | test_runner_utils.add_common_args(parser) |
Prathmesh Prabhu | 63f00aa | 2013-07-26 13:33:06 -0700 | [diff] [blame] | 116 | default_board = cros_build_lib.GetDefaultBoard() |
| 117 | parser.add_argument('-b', '--board', metavar='BOARD', default=default_board, |
Aviv Keshet | 0e5d525 | 2013-04-26 16:01:36 -0700 | [diff] [blame] | 118 | action='store', |
Prathmesh Prabhu | 63f00aa | 2013-07-26 13:33:06 -0700 | [diff] [blame] | 119 | help='Board for which the test will run. Default: %s' % |
| 120 | (default_board or 'Not configured')) |
Simran Basi | 14622bb | 2015-11-25 13:23:40 -0800 | [diff] [blame] | 121 | parser.add_argument('-i', '--build', metavar='BUILD', |
| 122 | default=test_runner_utils.NO_BUILD, |
Aviv Keshet | 021c19f | 2013-02-22 13:19:43 -0800 | [diff] [blame] | 123 | help='Build to test. Device will be reimaged if ' |
Aviv Keshet | e43bccf | 2013-08-14 14:11:59 -0700 | [diff] [blame] | 124 | 'necessary. Omit flag to skip reimage and test ' |
Aviv Keshet | 2113774 | 2014-01-10 14:52:38 -0800 | [diff] [blame] | 125 | 'against already installed DUT image. Examples: ' |
| 126 | 'link-paladin/R34-5222.0.0-rc2, ' |
| 127 | 'lumpy-release/R34-5205.0.0') |
J. Richard Barnette | 789f87c | 2015-03-23 16:25:25 -0700 | [diff] [blame] | 128 | parser.add_argument('-p', '--pool', metavar='POOL', default='suites', |
Simran Basi | b723b1b | 2015-02-04 14:25:52 -0800 | [diff] [blame] | 129 | help='Pool to use when running tests in the lab. ' |
J. Richard Barnette | 789f87c | 2015-03-23 16:25:25 -0700 | [diff] [blame] | 130 | 'Default is "suites"') |
Fang Deng | b3ee20b | 2013-09-17 10:34:13 -0700 | [diff] [blame] | 131 | parser.add_argument('--autotest_dir', metavar='AUTOTEST_DIR', |
| 132 | help='Use AUTOTEST_DIR instead of normal board sysroot ' |
| 133 | 'copy of autotest, and skip the quickmerge step.') |
Aviv Keshet | 8ea71df | 2013-07-19 10:49:36 -0700 | [diff] [blame] | 134 | parser.add_argument('--no-quickmerge', action='store_true', default=False, |
| 135 | dest='no_quickmerge', |
| 136 | help='Skip the quickmerge step and use the sysroot ' |
| 137 | 'as it currently is. May result in un-merged ' |
Jorge Lucangeli Obes | ad7309b | 2014-02-12 09:57:37 -0800 | [diff] [blame] | 138 | 'source tree changes not being reflected in the ' |
| 139 | 'run. If using --autotest_dir, this flag is ' |
Fang Deng | b3ee20b | 2013-09-17 10:34:13 -0700 | [diff] [blame] | 140 | 'automatically applied.') |
Aviv Keshet | fd77591 | 2013-08-06 11:37:16 -0700 | [diff] [blame] | 141 | parser.add_argument('--whitelist-chrome-crashes', action='store_true', |
| 142 | default=False, dest='whitelist_chrome_crashes', |
| 143 | help='Ignore chrome crashes when producing test ' |
Aviv Keshet | e43bccf | 2013-08-14 14:11:59 -0700 | [diff] [blame] | 144 | 'report. This flag gets passed along to the ' |
| 145 | 'report generation tool.') |
Daniel Wang | 48e5117 | 2015-06-24 11:20:32 -0700 | [diff] [blame] | 146 | parser.add_argument('--ssh_private_key', action='store', |
Simran Basi | 14622bb | 2015-11-25 13:23:40 -0800 | [diff] [blame] | 147 | default=test_runner_utils.TEST_KEY_PATH, |
| 148 | help='Path to the private ssh key.') |
Laurence Goodby | 079312e | 2015-08-05 12:43:04 -0700 | [diff] [blame] | 149 | return parser.parse_args(argv), remote_argv |
| 150 | |
| 151 | |
| 152 | def parse_local_arguments(argv): |
| 153 | """ |
| 154 | Strips out arguments that are not to be passed through to runs. |
| 155 | |
| 156 | Add any arguments that should not be passed to remote test_that runs here. |
| 157 | |
| 158 | @param argv: argument list to parse. |
| 159 | @returns: tuple of local argument parser and remaining argv. |
| 160 | """ |
| 161 | parser = argparse.ArgumentParser(add_help=False) |
| 162 | parser.add_argument('-w', '--web', dest='web', default=None, |
| 163 | help='Address of a webserver to receive test requests.') |
Laurence Goodby | 60dfcef | 2016-02-12 18:17:36 -0800 | [diff] [blame] | 164 | parser.add_argument('-x', '--max_runtime_mins', type=int, |
| 165 | dest='max_runtime_mins', default=20, |
| 166 | help='Default time allowed for the tests to complete.') |
Laurence Goodby | 079312e | 2015-08-05 12:43:04 -0700 | [diff] [blame] | 167 | _, remaining_argv = parser.parse_known_args(argv) |
| 168 | return parser, remaining_argv |
Aviv Keshet | 021c19f | 2013-02-22 13:19:43 -0800 | [diff] [blame] | 169 | |
| 170 | |
Simran Basi | 14622bb | 2015-11-25 13:23:40 -0800 | [diff] [blame] | 171 | def perform_bootstrap_into_autotest_root(arguments, autotest_path, argv): |
Aviv Keshet | 021c19f | 2013-02-22 13:19:43 -0800 | [diff] [blame] | 172 | """ |
Fang Deng | b3ee20b | 2013-09-17 10:34:13 -0700 | [diff] [blame] | 173 | Perfoms a bootstrap to run test_that from the |autotest_path|. |
Aviv Keshet | e10e8d0 | 2013-09-09 17:04:58 -0700 | [diff] [blame] | 174 | |
| 175 | This function is to be called from test_that's main() script, when |
| 176 | test_that is executed from the source tree location. It runs |
Fang Deng | b3ee20b | 2013-09-17 10:34:13 -0700 | [diff] [blame] | 177 | autotest_quickmerge to update the sysroot unless arguments.no_quickmerge |
| 178 | is set. It then executes and waits on the version of test_that.py |
| 179 | in |autotest_path|. |
Aviv Keshet | e10e8d0 | 2013-09-09 17:04:58 -0700 | [diff] [blame] | 180 | |
| 181 | @param arguments: A parsed arguments object, as returned from |
Simran Basi | 14622bb | 2015-11-25 13:23:40 -0800 | [diff] [blame] | 182 | test_that.parse_arguments(...). |
Fang Deng | b3ee20b | 2013-09-17 10:34:13 -0700 | [diff] [blame] | 183 | @param autotest_path: Full absolute path to the autotest root directory. |
Aviv Keshet | e10e8d0 | 2013-09-09 17:04:58 -0700 | [diff] [blame] | 184 | @param argv: The arguments list, as passed to main(...) |
| 185 | |
Fang Deng | b3ee20b | 2013-09-17 10:34:13 -0700 | [diff] [blame] | 186 | @returns: The return code of the test_that script that was executed in |
| 187 | |autotest_path|. |
Aviv Keshet | 021c19f | 2013-02-22 13:19:43 -0800 | [diff] [blame] | 188 | """ |
Aviv Keshet | e10e8d0 | 2013-09-09 17:04:58 -0700 | [diff] [blame] | 189 | logging_manager.configure_logging( |
| 190 | server_logging_config.ServerLoggingConfig(), |
| 191 | use_console=True, |
| 192 | verbose=arguments.debug) |
| 193 | if arguments.no_quickmerge: |
Fang Deng | b3ee20b | 2013-09-17 10:34:13 -0700 | [diff] [blame] | 194 | logging.info('Skipping quickmerge step.') |
Aviv Keshet | e10e8d0 | 2013-09-09 17:04:58 -0700 | [diff] [blame] | 195 | else: |
| 196 | logging.info('Running autotest_quickmerge step.') |
Simran Basi | 8bd6d48 | 2015-04-21 17:12:26 -0700 | [diff] [blame] | 197 | command = [_QUICKMERGE_SCRIPTNAME, '--board='+arguments.board] |
Aviv Keshet | 6c02839 | 2013-07-22 12:57:32 -0700 | [diff] [blame] | 198 | s = subprocess.Popen(command, |
| 199 | stdout=subprocess.PIPE, |
| 200 | stderr=subprocess.STDOUT) |
Aviv Keshet | e10e8d0 | 2013-09-09 17:04:58 -0700 | [diff] [blame] | 201 | for message in iter(s.stdout.readline, b''): |
Aviv Keshet | 9525124 | 2013-10-10 07:43:41 -0700 | [diff] [blame] | 202 | logging.info('quickmerge| %s', message.strip()) |
Aviv Keshet | f022942 | 2013-10-24 10:12:14 -0400 | [diff] [blame] | 203 | return_code = s.wait() |
| 204 | if return_code: |
Simran Basi | 14622bb | 2015-11-25 13:23:40 -0800 | [diff] [blame] | 205 | raise test_runner_utils.TestThatRunError( |
| 206 | 'autotest_quickmerge failed with error code %s.' % |
| 207 | return_code) |
Aviv Keshet | 0e5d525 | 2013-04-26 16:01:36 -0700 | [diff] [blame] | 208 | |
Fang Deng | b3ee20b | 2013-09-17 10:34:13 -0700 | [diff] [blame] | 209 | logging.info('Re-running test_that script in %s copy of autotest.', |
| 210 | autotest_path) |
| 211 | script_command = os.path.join(autotest_path, 'site_utils', |
Simran Basi | 14622bb | 2015-11-25 13:23:40 -0800 | [diff] [blame] | 212 | 'test_that.py') |
Aviv Keshet | 1a6ce6e | 2013-10-22 12:32:38 -0400 | [diff] [blame] | 213 | if not os.path.exists(script_command): |
Simran Basi | 14622bb | 2015-11-25 13:23:40 -0800 | [diff] [blame] | 214 | raise test_runner_utils.TestThatRunError( |
| 215 | 'Unable to bootstrap to autotest root, %s not found.' % |
| 216 | script_command) |
Aviv Keshet | e10e8d0 | 2013-09-09 17:04:58 -0700 | [diff] [blame] | 217 | proc = None |
| 218 | def resend_sig(signum, stack_frame): |
| 219 | #pylint: disable-msg=C0111 |
| 220 | if proc: |
| 221 | proc.send_signal(signum) |
| 222 | signal.signal(signal.SIGINT, resend_sig) |
| 223 | signal.signal(signal.SIGTERM, resend_sig) |
Aviv Keshet | 712128f | 2013-06-11 14:41:08 -0700 | [diff] [blame] | 224 | |
Aviv Keshet | e10e8d0 | 2013-09-09 17:04:58 -0700 | [diff] [blame] | 225 | proc = subprocess.Popen([script_command] + argv) |
Aviv Keshet | 0e5d525 | 2013-04-26 16:01:36 -0700 | [diff] [blame] | 226 | |
Aviv Keshet | e10e8d0 | 2013-09-09 17:04:58 -0700 | [diff] [blame] | 227 | return proc.wait() |
Aviv Keshet | 0e5d525 | 2013-04-26 16:01:36 -0700 | [diff] [blame] | 228 | |
Aviv Keshet | 0e5d525 | 2013-04-26 16:01:36 -0700 | [diff] [blame] | 229 | |
Aviv Keshet | 6f74e19 | 2013-09-23 11:09:07 -0700 | [diff] [blame] | 230 | def _main_for_local_run(argv, arguments): |
| 231 | """ |
| 232 | Effective entry point for local test_that runs. |
| 233 | |
| 234 | @param argv: Script command line arguments. |
| 235 | @param arguments: Parsed command line arguments. |
| 236 | """ |
| 237 | if not cros_build_lib.IsInsideChroot(): |
| 238 | print >> sys.stderr, 'For local runs, script must be run inside chroot.' |
Aviv Keshet | e10e8d0 | 2013-09-09 17:04:58 -0700 | [diff] [blame] | 239 | return 1 |
| 240 | |
Simran Basi | 14622bb | 2015-11-25 13:23:40 -0800 | [diff] [blame] | 241 | results_directory = test_runner_utils.create_results_directory( |
| 242 | arguments.results_dir) |
| 243 | test_runner_utils.add_ssh_identity(results_directory, |
| 244 | arguments.ssh_private_key) |
beeps | 4efdf03 | 2013-09-17 11:27:14 -0700 | [diff] [blame] | 245 | arguments.results_dir = results_directory |
| 246 | |
| 247 | # If the board has not been specified through --board, and is not set in the |
| 248 | # default_board file, determine the board by ssh-ing into the host. Also |
| 249 | # prepend it to argv so we can re-use it when we run test_that from the |
| 250 | # sysroot. |
| 251 | if arguments.board is None: |
| 252 | arguments.board = _get_board_from_host(arguments.remote) |
Allen Li | 910c604 | 2016-10-24 17:52:25 -0700 | [diff] [blame] | 253 | argv = ['--board=%s' % (arguments.board,)] + argv |
beeps | 4efdf03 | 2013-09-17 11:27:14 -0700 | [diff] [blame] | 254 | |
Fang Deng | b3ee20b | 2013-09-17 10:34:13 -0700 | [diff] [blame] | 255 | if arguments.autotest_dir: |
| 256 | autotest_path = arguments.autotest_dir |
| 257 | arguments.no_quickmerge = True |
| 258 | else: |
| 259 | sysroot_path = os.path.join('/build', arguments.board, '') |
Aviv Keshet | 6c02839 | 2013-07-22 12:57:32 -0700 | [diff] [blame] | 260 | |
Fang Deng | b3ee20b | 2013-09-17 10:34:13 -0700 | [diff] [blame] | 261 | if not os.path.exists(sysroot_path): |
| 262 | print >> sys.stderr, ('%s does not exist. Have you run ' |
| 263 | 'setup_board?' % sysroot_path) |
| 264 | return 1 |
Aviv Keshet | e10e8d0 | 2013-09-09 17:04:58 -0700 | [diff] [blame] | 265 | |
Aviv Keshet | 2252db3 | 2015-04-08 10:36:09 -0700 | [diff] [blame] | 266 | path_ending = 'usr/local/build/autotest' |
Aviv Keshet | 6c02839 | 2013-07-22 12:57:32 -0700 | [diff] [blame] | 267 | autotest_path = os.path.join(sysroot_path, path_ending) |
| 268 | |
Fang Deng | b3ee20b | 2013-09-17 10:34:13 -0700 | [diff] [blame] | 269 | site_utils_path = os.path.join(autotest_path, 'site_utils') |
| 270 | |
| 271 | if not os.path.exists(autotest_path): |
Aviv Keshet | e10e8d0 | 2013-09-09 17:04:58 -0700 | [diff] [blame] | 272 | print >> sys.stderr, ('%s does not exist. Have you run ' |
Fang Deng | b3ee20b | 2013-09-17 10:34:13 -0700 | [diff] [blame] | 273 | 'build_packages? Or if you are using ' |
Kevin Cheng | 47b68ee | 2016-06-06 11:36:49 -0700 | [diff] [blame] | 274 | '--autotest_dir, make sure it points to ' |
Fang Deng | b3ee20b | 2013-09-17 10:34:13 -0700 | [diff] [blame] | 275 | 'a valid autotest directory.' % autotest_path) |
Aviv Keshet | e10e8d0 | 2013-09-09 17:04:58 -0700 | [diff] [blame] | 276 | return 1 |
| 277 | |
| 278 | realpath = os.path.realpath(__file__) |
Fang Deng | 8a89e9b | 2014-10-08 11:35:42 -0700 | [diff] [blame] | 279 | site_utils_path = os.path.realpath(site_utils_path) |
Aviv Keshet | e10e8d0 | 2013-09-09 17:04:58 -0700 | [diff] [blame] | 280 | |
| 281 | # If we are not running the sysroot version of script, perform |
| 282 | # a quickmerge if necessary and then re-execute |
| 283 | # the sysroot version of script with the same arguments. |
Fang Deng | b3ee20b | 2013-09-17 10:34:13 -0700 | [diff] [blame] | 284 | if os.path.dirname(realpath) != site_utils_path: |
Simran Basi | 14622bb | 2015-11-25 13:23:40 -0800 | [diff] [blame] | 285 | return perform_bootstrap_into_autotest_root( |
Aviv Keshet | 2252db3 | 2015-04-08 10:36:09 -0700 | [diff] [blame] | 286 | arguments, autotest_path, argv) |
Aviv Keshet | e10e8d0 | 2013-09-09 17:04:58 -0700 | [diff] [blame] | 287 | else: |
Simran Basi | 14622bb | 2015-11-25 13:23:40 -0800 | [diff] [blame] | 288 | return test_runner_utils.perform_run_from_autotest_root( |
| 289 | autotest_path, argv, arguments.tests, arguments.remote, |
| 290 | build=arguments.build, board=arguments.board, |
| 291 | args=arguments.args, ignore_deps=not arguments.enforce_deps, |
| 292 | results_directory=results_directory, |
| 293 | ssh_verbosity=arguments.ssh_verbosity, |
| 294 | ssh_options=arguments.ssh_options, |
| 295 | iterations=arguments.iterations, |
| 296 | fast_mode=arguments.fast_mode, debug=arguments.debug, |
Simran Basi | 57740ca | 2016-02-19 11:20:22 -0800 | [diff] [blame] | 297 | whitelist_chrome_crashes=arguments.whitelist_chrome_crashes, |
| 298 | pretend=arguments.pretend) |
Aviv Keshet | ba4992a | 2013-07-02 14:09:23 -0700 | [diff] [blame] | 299 | |
Aviv Keshet | 021c19f | 2013-02-22 13:19:43 -0800 | [diff] [blame] | 300 | |
Aviv Keshet | 6f74e19 | 2013-09-23 11:09:07 -0700 | [diff] [blame] | 301 | def _main_for_lab_run(argv, arguments): |
| 302 | """ |
| 303 | Effective entry point for lab test_that runs. |
| 304 | |
| 305 | @param argv: Script command line arguments. |
| 306 | @param arguments: Parsed command line arguments. |
| 307 | """ |
| 308 | autotest_path = os.path.realpath(os.path.join(os.path.dirname(__file__), |
| 309 | '..')) |
| 310 | flattened_argv = ' '.join([pipes.quote(item) for item in argv]) |
| 311 | command = [os.path.join(autotest_path, 'site_utils', |
| 312 | 'run_suite.py'), |
Allen Li | 910c604 | 2016-10-24 17:52:25 -0700 | [diff] [blame] | 313 | '--board=%s' % (arguments.board,), |
| 314 | '--build=%s' % (arguments.build,), |
| 315 | '--suite_name=%s' % 'test_that_wrapper', |
| 316 | '--pool=%s' % (arguments.pool,), |
| 317 | '--max_runtime_mins=%s' % str(arguments.max_runtime_mins), |
| 318 | '--suite_args=%s' % (flattened_argv,)] |
Laurence Goodby | 079312e | 2015-08-05 12:43:04 -0700 | [diff] [blame] | 319 | if arguments.web: |
Allen Li | 910c604 | 2016-10-24 17:52:25 -0700 | [diff] [blame] | 320 | command.extend(['--web=%s' % (arguments.web,)]) |
Aviv Keshet | 6f74e19 | 2013-09-23 11:09:07 -0700 | [diff] [blame] | 321 | logging.info('About to start lab suite with command %s.', command) |
| 322 | return subprocess.call(command) |
| 323 | |
| 324 | |
| 325 | def main(argv): |
| 326 | """ |
| 327 | Entry point for test_that script. |
| 328 | |
| 329 | @param argv: arguments list |
| 330 | """ |
Laurence Goodby | cbb5ba0 | 2015-08-11 11:26:53 -0700 | [diff] [blame] | 331 | arguments, remote_argv = _parse_arguments_internal(argv) |
Aviv Keshet | 6f74e19 | 2013-09-23 11:09:07 -0700 | [diff] [blame] | 332 | try: |
| 333 | validate_arguments(arguments) |
| 334 | except ValueError as err: |
| 335 | print >> sys.stderr, ('Invalid arguments. %s' % err.message) |
| 336 | return 1 |
| 337 | |
| 338 | if arguments.remote == ':lab:': |
Laurence Goodby | 079312e | 2015-08-05 12:43:04 -0700 | [diff] [blame] | 339 | return _main_for_lab_run(remote_argv, arguments) |
Aviv Keshet | 6f74e19 | 2013-09-23 11:09:07 -0700 | [diff] [blame] | 340 | else: |
| 341 | return _main_for_local_run(argv, arguments) |
| 342 | |
| 343 | |
Aviv Keshet | 021c19f | 2013-02-22 13:19:43 -0800 | [diff] [blame] | 344 | if __name__ == '__main__': |
Aviv Keshet | d4a0430 | 2013-04-30 15:48:30 -0700 | [diff] [blame] | 345 | sys.exit(main(sys.argv[1:])) |