1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env vpython3 2*6777b538SAndroid Build Coastguard Worker# Copyright 2020 The Chromium Authors 3*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 5*6777b538SAndroid Build Coastguard Worker 6*6777b538SAndroid Build Coastguard Workerimport json 7*6777b538SAndroid Build Coastguard Workerimport os 8*6777b538SAndroid Build Coastguard Workerimport shutil 9*6777b538SAndroid Build Coastguard Workerimport sys 10*6777b538SAndroid Build Coastguard Workerimport tempfile 11*6777b538SAndroid Build Coastguard Workerfrom textwrap import dedent 12*6777b538SAndroid Build Coastguard Workerimport unittest 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker# The following non-std imports are fetched via vpython. See the list at 15*6777b538SAndroid Build Coastguard Worker# //.vpython3 16*6777b538SAndroid Build Coastguard Workerimport mock # pylint: disable=import-error 17*6777b538SAndroid Build Coastguard Workerfrom parameterized import parameterized # pylint: disable=import-error 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Workerimport test_runner 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker_TAST_TEST_RESULTS_JSON = { 22*6777b538SAndroid Build Coastguard Worker "name": "login.Chrome", 23*6777b538SAndroid Build Coastguard Worker "errors": None, 24*6777b538SAndroid Build Coastguard Worker "start": "2020-01-01T15:41:30.799228462-08:00", 25*6777b538SAndroid Build Coastguard Worker "end": "2020-01-01T15:41:53.318914698-08:00", 26*6777b538SAndroid Build Coastguard Worker "skipReason": "" 27*6777b538SAndroid Build Coastguard Worker} 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Workerclass TestRunnerTest(unittest.TestCase): 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker def setUp(self): 33*6777b538SAndroid Build Coastguard Worker self._tmp_dir = tempfile.mkdtemp() 34*6777b538SAndroid Build Coastguard Worker self.mock_rdb = mock.patch.object( 35*6777b538SAndroid Build Coastguard Worker test_runner.result_sink, 'TryInitClient', return_value=None) 36*6777b538SAndroid Build Coastguard Worker self.mock_rdb.start() 37*6777b538SAndroid Build Coastguard Worker self.mock_env = mock.patch.dict( 38*6777b538SAndroid Build Coastguard Worker os.environ, {'SWARMING_BOT_ID': 'cros-chrome-chromeos8-row29'}) 39*6777b538SAndroid Build Coastguard Worker self.mock_env.start() 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker def tearDown(self): 42*6777b538SAndroid Build Coastguard Worker shutil.rmtree(self._tmp_dir, ignore_errors=True) 43*6777b538SAndroid Build Coastguard Worker self.mock_rdb.stop() 44*6777b538SAndroid Build Coastguard Worker self.mock_env.stop() 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker def safeAssertItemsEqual(self, list1, list2): 47*6777b538SAndroid Build Coastguard Worker """A Py3 safe version of assertItemsEqual. 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker See https://bugs.python.org/issue17866. 50*6777b538SAndroid Build Coastguard Worker """ 51*6777b538SAndroid Build Coastguard Worker self.assertSetEqual(set(list1), set(list2)) 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Workerclass TastTests(TestRunnerTest): 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard Worker def get_common_tast_args(self, use_vm, fetch_cros_hostname): 57*6777b538SAndroid Build Coastguard Worker return [ 58*6777b538SAndroid Build Coastguard Worker 'script_name', 59*6777b538SAndroid Build Coastguard Worker 'tast', 60*6777b538SAndroid Build Coastguard Worker '--suite-name=chrome_all_tast_tests', 61*6777b538SAndroid Build Coastguard Worker '--board=eve', 62*6777b538SAndroid Build Coastguard Worker '--flash', 63*6777b538SAndroid Build Coastguard Worker '--path-to-outdir=out_eve/Release', 64*6777b538SAndroid Build Coastguard Worker '--logs-dir=%s' % self._tmp_dir, 65*6777b538SAndroid Build Coastguard Worker '--use-vm' if use_vm else 66*6777b538SAndroid Build Coastguard Worker ('--fetch-cros-hostname' 67*6777b538SAndroid Build Coastguard Worker if fetch_cros_hostname else '--device=localhost:2222'), 68*6777b538SAndroid Build Coastguard Worker ] 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker def get_common_tast_expectations(self, 71*6777b538SAndroid Build Coastguard Worker use_vm, 72*6777b538SAndroid Build Coastguard Worker fetch_cros_hostname, 73*6777b538SAndroid Build Coastguard Worker is_lacros=False): 74*6777b538SAndroid Build Coastguard Worker expectation = [ 75*6777b538SAndroid Build Coastguard Worker test_runner.CROS_RUN_TEST_PATH, 76*6777b538SAndroid Build Coastguard Worker '--board', 77*6777b538SAndroid Build Coastguard Worker 'eve', 78*6777b538SAndroid Build Coastguard Worker '--cache-dir', 79*6777b538SAndroid Build Coastguard Worker test_runner.DEFAULT_CROS_CACHE, 80*6777b538SAndroid Build Coastguard Worker '--results-dest-dir', 81*6777b538SAndroid Build Coastguard Worker '%s/system_logs' % self._tmp_dir, 82*6777b538SAndroid Build Coastguard Worker '--flash', 83*6777b538SAndroid Build Coastguard Worker '--build-dir', 84*6777b538SAndroid Build Coastguard Worker 'out_eve/Release', 85*6777b538SAndroid Build Coastguard Worker '--results-dir', 86*6777b538SAndroid Build Coastguard Worker self._tmp_dir, 87*6777b538SAndroid Build Coastguard Worker '--tast-total-shards=1', 88*6777b538SAndroid Build Coastguard Worker '--tast-shard-index=0', 89*6777b538SAndroid Build Coastguard Worker ] 90*6777b538SAndroid Build Coastguard Worker expectation.extend(['--start', '--copy-on-write'] if use_vm else ( 91*6777b538SAndroid Build Coastguard Worker ['--device', 'chrome-chromeos8-row29'] 92*6777b538SAndroid Build Coastguard Worker if fetch_cros_hostname else ['--device', 'localhost:2222'])) 93*6777b538SAndroid Build Coastguard Worker for p in test_runner.SYSTEM_LOG_LOCATIONS: 94*6777b538SAndroid Build Coastguard Worker expectation.extend(['--results-src', p]) 95*6777b538SAndroid Build Coastguard Worker 96*6777b538SAndroid Build Coastguard Worker if not is_lacros: 97*6777b538SAndroid Build Coastguard Worker expectation += [ 98*6777b538SAndroid Build Coastguard Worker '--mount', 99*6777b538SAndroid Build Coastguard Worker '--deploy', 100*6777b538SAndroid Build Coastguard Worker '--nostrip', 101*6777b538SAndroid Build Coastguard Worker ] 102*6777b538SAndroid Build Coastguard Worker return expectation 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Worker def test_tast_gtest_filter(self): 105*6777b538SAndroid Build Coastguard Worker """Tests running tast tests with a gtest-style filter.""" 106*6777b538SAndroid Build Coastguard Worker with open(os.path.join(self._tmp_dir, 'streamed_results.jsonl'), 'w') as f: 107*6777b538SAndroid Build Coastguard Worker json.dump(_TAST_TEST_RESULTS_JSON, f) 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker args = self.get_common_tast_args(False, False) + [ 110*6777b538SAndroid Build Coastguard Worker '--attr-expr=( "group:mainline" && "dep:chrome" && !informational)', 111*6777b538SAndroid Build Coastguard Worker '--gtest_filter=login.Chrome:ui.WindowControl', 112*6777b538SAndroid Build Coastguard Worker ] 113*6777b538SAndroid Build Coastguard Worker with mock.patch.object(sys, 'argv', args),\ 114*6777b538SAndroid Build Coastguard Worker mock.patch.object(test_runner.subprocess, 'Popen') as mock_popen: 115*6777b538SAndroid Build Coastguard Worker mock_popen.return_value.returncode = 0 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Worker test_runner.main() 118*6777b538SAndroid Build Coastguard Worker # The gtest filter should cause the Tast expr to be replaced with a list 119*6777b538SAndroid Build Coastguard Worker # of the tests in the filter. 120*6777b538SAndroid Build Coastguard Worker expected_cmd = self.get_common_tast_expectations(False, False) + [ 121*6777b538SAndroid Build Coastguard Worker '--tast=("name:login.Chrome" || "name:ui.WindowControl")' 122*6777b538SAndroid Build Coastguard Worker ] 123*6777b538SAndroid Build Coastguard Worker 124*6777b538SAndroid Build Coastguard Worker self.safeAssertItemsEqual(expected_cmd, mock_popen.call_args[0][0]) 125*6777b538SAndroid Build Coastguard Worker 126*6777b538SAndroid Build Coastguard Worker @parameterized.expand([ 127*6777b538SAndroid Build Coastguard Worker [True, False], 128*6777b538SAndroid Build Coastguard Worker [False, True], 129*6777b538SAndroid Build Coastguard Worker [False, False], 130*6777b538SAndroid Build Coastguard Worker ]) 131*6777b538SAndroid Build Coastguard Worker def test_tast_attr_expr(self, use_vm, fetch_cros_hostname): 132*6777b538SAndroid Build Coastguard Worker """Tests running a tast tests specified by an attribute expression.""" 133*6777b538SAndroid Build Coastguard Worker with open(os.path.join(self._tmp_dir, 'streamed_results.jsonl'), 'w') as f: 134*6777b538SAndroid Build Coastguard Worker json.dump(_TAST_TEST_RESULTS_JSON, f) 135*6777b538SAndroid Build Coastguard Worker 136*6777b538SAndroid Build Coastguard Worker args = self.get_common_tast_args(use_vm, fetch_cros_hostname) + [ 137*6777b538SAndroid Build Coastguard Worker '--attr-expr=( "group:mainline" && "dep:chrome" && !informational)', 138*6777b538SAndroid Build Coastguard Worker ] 139*6777b538SAndroid Build Coastguard Worker with mock.patch.object(sys, 'argv', args),\ 140*6777b538SAndroid Build Coastguard Worker mock.patch.object(test_runner.subprocess, 'Popen') as mock_popen: 141*6777b538SAndroid Build Coastguard Worker mock_popen.return_value.returncode = 0 142*6777b538SAndroid Build Coastguard Worker 143*6777b538SAndroid Build Coastguard Worker test_runner.main() 144*6777b538SAndroid Build Coastguard Worker expected_cmd = self.get_common_tast_expectations( 145*6777b538SAndroid Build Coastguard Worker use_vm, fetch_cros_hostname) + [ 146*6777b538SAndroid Build Coastguard Worker '--tast=( "group:mainline" && "dep:chrome" && !informational)', 147*6777b538SAndroid Build Coastguard Worker ] 148*6777b538SAndroid Build Coastguard Worker 149*6777b538SAndroid Build Coastguard Worker self.safeAssertItemsEqual(expected_cmd, mock_popen.call_args[0][0]) 150*6777b538SAndroid Build Coastguard Worker 151*6777b538SAndroid Build Coastguard Worker @parameterized.expand([ 152*6777b538SAndroid Build Coastguard Worker [True, False], 153*6777b538SAndroid Build Coastguard Worker [False, True], 154*6777b538SAndroid Build Coastguard Worker [False, False], 155*6777b538SAndroid Build Coastguard Worker ]) 156*6777b538SAndroid Build Coastguard Worker def test_tast_lacros(self, use_vm, fetch_cros_hostname): 157*6777b538SAndroid Build Coastguard Worker """Tests running a tast tests for Lacros.""" 158*6777b538SAndroid Build Coastguard Worker with open(os.path.join(self._tmp_dir, 'streamed_results.jsonl'), 'w') as f: 159*6777b538SAndroid Build Coastguard Worker json.dump(_TAST_TEST_RESULTS_JSON, f) 160*6777b538SAndroid Build Coastguard Worker 161*6777b538SAndroid Build Coastguard Worker args = self.get_common_tast_args(use_vm, fetch_cros_hostname) + [ 162*6777b538SAndroid Build Coastguard Worker '-t=lacros.Basic', 163*6777b538SAndroid Build Coastguard Worker '--deploy-lacros', 164*6777b538SAndroid Build Coastguard Worker ] 165*6777b538SAndroid Build Coastguard Worker 166*6777b538SAndroid Build Coastguard Worker with mock.patch.object(sys, 'argv', args),\ 167*6777b538SAndroid Build Coastguard Worker mock.patch.object(test_runner.subprocess, 'Popen') as mock_popen: 168*6777b538SAndroid Build Coastguard Worker mock_popen.return_value.returncode = 0 169*6777b538SAndroid Build Coastguard Worker 170*6777b538SAndroid Build Coastguard Worker test_runner.main() 171*6777b538SAndroid Build Coastguard Worker expected_cmd = self.get_common_tast_expectations( 172*6777b538SAndroid Build Coastguard Worker use_vm, fetch_cros_hostname, is_lacros=True) + [ 173*6777b538SAndroid Build Coastguard Worker '--tast', 174*6777b538SAndroid Build Coastguard Worker 'lacros.Basic', 175*6777b538SAndroid Build Coastguard Worker '--deploy-lacros', 176*6777b538SAndroid Build Coastguard Worker '--lacros-launcher-script', 177*6777b538SAndroid Build Coastguard Worker test_runner.LACROS_LAUNCHER_SCRIPT_PATH, 178*6777b538SAndroid Build Coastguard Worker ] 179*6777b538SAndroid Build Coastguard Worker 180*6777b538SAndroid Build Coastguard Worker self.safeAssertItemsEqual(expected_cmd, mock_popen.call_args[0][0]) 181*6777b538SAndroid Build Coastguard Worker 182*6777b538SAndroid Build Coastguard Worker @parameterized.expand([ 183*6777b538SAndroid Build Coastguard Worker [True, False], 184*6777b538SAndroid Build Coastguard Worker [False, True], 185*6777b538SAndroid Build Coastguard Worker [False, False], 186*6777b538SAndroid Build Coastguard Worker ]) 187*6777b538SAndroid Build Coastguard Worker def test_tast_with_vars(self, use_vm, fetch_cros_hostname): 188*6777b538SAndroid Build Coastguard Worker """Tests running a tast tests with runtime variables.""" 189*6777b538SAndroid Build Coastguard Worker with open(os.path.join(self._tmp_dir, 'streamed_results.jsonl'), 'w') as f: 190*6777b538SAndroid Build Coastguard Worker json.dump(_TAST_TEST_RESULTS_JSON, f) 191*6777b538SAndroid Build Coastguard Worker 192*6777b538SAndroid Build Coastguard Worker args = self.get_common_tast_args(use_vm, fetch_cros_hostname) + [ 193*6777b538SAndroid Build Coastguard Worker '-t=login.Chrome', 194*6777b538SAndroid Build Coastguard Worker '--tast-var=key=value', 195*6777b538SAndroid Build Coastguard Worker ] 196*6777b538SAndroid Build Coastguard Worker with mock.patch.object(sys, 'argv', args),\ 197*6777b538SAndroid Build Coastguard Worker mock.patch.object(test_runner.subprocess, 'Popen') as mock_popen: 198*6777b538SAndroid Build Coastguard Worker mock_popen.return_value.returncode = 0 199*6777b538SAndroid Build Coastguard Worker test_runner.main() 200*6777b538SAndroid Build Coastguard Worker expected_cmd = self.get_common_tast_expectations( 201*6777b538SAndroid Build Coastguard Worker use_vm, fetch_cros_hostname) + [ 202*6777b538SAndroid Build Coastguard Worker '--tast', 'login.Chrome', '--tast-var', 'key=value' 203*6777b538SAndroid Build Coastguard Worker ] 204*6777b538SAndroid Build Coastguard Worker 205*6777b538SAndroid Build Coastguard Worker self.safeAssertItemsEqual(expected_cmd, mock_popen.call_args[0][0]) 206*6777b538SAndroid Build Coastguard Worker 207*6777b538SAndroid Build Coastguard Worker @parameterized.expand([ 208*6777b538SAndroid Build Coastguard Worker [True, False], 209*6777b538SAndroid Build Coastguard Worker [False, True], 210*6777b538SAndroid Build Coastguard Worker [False, False], 211*6777b538SAndroid Build Coastguard Worker ]) 212*6777b538SAndroid Build Coastguard Worker def test_tast_retries(self, use_vm, fetch_cros_hostname): 213*6777b538SAndroid Build Coastguard Worker """Tests running a tast tests with retries.""" 214*6777b538SAndroid Build Coastguard Worker with open(os.path.join(self._tmp_dir, 'streamed_results.jsonl'), 'w') as f: 215*6777b538SAndroid Build Coastguard Worker json.dump(_TAST_TEST_RESULTS_JSON, f) 216*6777b538SAndroid Build Coastguard Worker 217*6777b538SAndroid Build Coastguard Worker args = self.get_common_tast_args(use_vm, fetch_cros_hostname) + [ 218*6777b538SAndroid Build Coastguard Worker '-t=login.Chrome', 219*6777b538SAndroid Build Coastguard Worker '--tast-retries=1', 220*6777b538SAndroid Build Coastguard Worker ] 221*6777b538SAndroid Build Coastguard Worker with mock.patch.object(sys, 'argv', args),\ 222*6777b538SAndroid Build Coastguard Worker mock.patch.object(test_runner.subprocess, 'Popen') as mock_popen: 223*6777b538SAndroid Build Coastguard Worker mock_popen.return_value.returncode = 0 224*6777b538SAndroid Build Coastguard Worker test_runner.main() 225*6777b538SAndroid Build Coastguard Worker expected_cmd = self.get_common_tast_expectations( 226*6777b538SAndroid Build Coastguard Worker use_vm, 227*6777b538SAndroid Build Coastguard Worker fetch_cros_hostname) + ['--tast', 'login.Chrome', '--tast-retries=1'] 228*6777b538SAndroid Build Coastguard Worker 229*6777b538SAndroid Build Coastguard Worker self.safeAssertItemsEqual(expected_cmd, mock_popen.call_args[0][0]) 230*6777b538SAndroid Build Coastguard Worker 231*6777b538SAndroid Build Coastguard Worker @parameterized.expand([ 232*6777b538SAndroid Build Coastguard Worker [True, False], 233*6777b538SAndroid Build Coastguard Worker [False, True], 234*6777b538SAndroid Build Coastguard Worker [False, False], 235*6777b538SAndroid Build Coastguard Worker ]) 236*6777b538SAndroid Build Coastguard Worker def test_tast(self, use_vm, fetch_cros_hostname): 237*6777b538SAndroid Build Coastguard Worker """Tests running a tast tests.""" 238*6777b538SAndroid Build Coastguard Worker with open(os.path.join(self._tmp_dir, 'streamed_results.jsonl'), 'w') as f: 239*6777b538SAndroid Build Coastguard Worker json.dump(_TAST_TEST_RESULTS_JSON, f) 240*6777b538SAndroid Build Coastguard Worker 241*6777b538SAndroid Build Coastguard Worker args = self.get_common_tast_args(use_vm, fetch_cros_hostname) + [ 242*6777b538SAndroid Build Coastguard Worker '-t=login.Chrome', 243*6777b538SAndroid Build Coastguard Worker ] 244*6777b538SAndroid Build Coastguard Worker with mock.patch.object(sys, 'argv', args),\ 245*6777b538SAndroid Build Coastguard Worker mock.patch.object(test_runner.subprocess, 'Popen') as mock_popen: 246*6777b538SAndroid Build Coastguard Worker mock_popen.return_value.returncode = 0 247*6777b538SAndroid Build Coastguard Worker 248*6777b538SAndroid Build Coastguard Worker test_runner.main() 249*6777b538SAndroid Build Coastguard Worker expected_cmd = self.get_common_tast_expectations( 250*6777b538SAndroid Build Coastguard Worker use_vm, fetch_cros_hostname) + ['--tast', 'login.Chrome'] 251*6777b538SAndroid Build Coastguard Worker 252*6777b538SAndroid Build Coastguard Worker self.safeAssertItemsEqual(expected_cmd, mock_popen.call_args[0][0]) 253*6777b538SAndroid Build Coastguard Worker 254*6777b538SAndroid Build Coastguard Worker 255*6777b538SAndroid Build Coastguard Workerclass GTestTest(TestRunnerTest): 256*6777b538SAndroid Build Coastguard Worker 257*6777b538SAndroid Build Coastguard Worker @parameterized.expand([ 258*6777b538SAndroid Build Coastguard Worker [True, True, True, False], 259*6777b538SAndroid Build Coastguard Worker [True, False, False, False], 260*6777b538SAndroid Build Coastguard Worker [False, True, True, True], 261*6777b538SAndroid Build Coastguard Worker [False, False, False, True], 262*6777b538SAndroid Build Coastguard Worker [False, True, True, False], 263*6777b538SAndroid Build Coastguard Worker [False, False, False, False], 264*6777b538SAndroid Build Coastguard Worker ]) 265*6777b538SAndroid Build Coastguard Worker def test_gtest(self, use_vm, stop_ui, use_test_sudo_helper, 266*6777b538SAndroid Build Coastguard Worker fetch_cros_hostname): 267*6777b538SAndroid Build Coastguard Worker """Tests running a gtest.""" 268*6777b538SAndroid Build Coastguard Worker fd_mock = mock.mock_open() 269*6777b538SAndroid Build Coastguard Worker 270*6777b538SAndroid Build Coastguard Worker args = [ 271*6777b538SAndroid Build Coastguard Worker 'script_name', 272*6777b538SAndroid Build Coastguard Worker 'gtest', 273*6777b538SAndroid Build Coastguard Worker '--test-exe=out_eve/Release/base_unittests', 274*6777b538SAndroid Build Coastguard Worker '--board=eve', 275*6777b538SAndroid Build Coastguard Worker '--path-to-outdir=out_eve/Release', 276*6777b538SAndroid Build Coastguard Worker '--use-vm' if use_vm else 277*6777b538SAndroid Build Coastguard Worker ('--fetch-cros-hostname' 278*6777b538SAndroid Build Coastguard Worker if fetch_cros_hostname else '--device=localhost:2222'), 279*6777b538SAndroid Build Coastguard Worker ] 280*6777b538SAndroid Build Coastguard Worker if stop_ui: 281*6777b538SAndroid Build Coastguard Worker args.append('--stop-ui') 282*6777b538SAndroid Build Coastguard Worker if use_test_sudo_helper: 283*6777b538SAndroid Build Coastguard Worker args.append('--run-test-sudo-helper') 284*6777b538SAndroid Build Coastguard Worker 285*6777b538SAndroid Build Coastguard Worker with mock.patch.object(sys, 'argv', args),\ 286*6777b538SAndroid Build Coastguard Worker mock.patch.object(test_runner.subprocess, 'Popen') as mock_popen,\ 287*6777b538SAndroid Build Coastguard Worker mock.patch.object(os, 'fdopen', fd_mock),\ 288*6777b538SAndroid Build Coastguard Worker mock.patch.object(os, 'remove') as mock_remove,\ 289*6777b538SAndroid Build Coastguard Worker mock.patch.object(tempfile, 'mkstemp', 290*6777b538SAndroid Build Coastguard Worker return_value=(3, 'out_eve/Release/device_script.sh')),\ 291*6777b538SAndroid Build Coastguard Worker mock.patch.object(os, 'fchmod'): 292*6777b538SAndroid Build Coastguard Worker mock_popen.return_value.returncode = 0 293*6777b538SAndroid Build Coastguard Worker 294*6777b538SAndroid Build Coastguard Worker test_runner.main() 295*6777b538SAndroid Build Coastguard Worker self.assertEqual(1, mock_popen.call_count) 296*6777b538SAndroid Build Coastguard Worker expected_cmd = [ 297*6777b538SAndroid Build Coastguard Worker 'vpython3', test_runner.CROS_RUN_TEST_PATH, '--board', 'eve', 298*6777b538SAndroid Build Coastguard Worker '--cache-dir', test_runner.DEFAULT_CROS_CACHE, '--remote-cmd', 299*6777b538SAndroid Build Coastguard Worker '--cwd', 'out_eve/Release', '--files', 300*6777b538SAndroid Build Coastguard Worker 'out_eve/Release/device_script.sh' 301*6777b538SAndroid Build Coastguard Worker ] 302*6777b538SAndroid Build Coastguard Worker if not stop_ui: 303*6777b538SAndroid Build Coastguard Worker expected_cmd.append('--as-chronos') 304*6777b538SAndroid Build Coastguard Worker expected_cmd.extend(['--start', '--copy-on-write'] if use_vm else ( 305*6777b538SAndroid Build Coastguard Worker ['--device', 'chrome-chromeos8-row29'] 306*6777b538SAndroid Build Coastguard Worker if fetch_cros_hostname else ['--device', 'localhost:2222'])) 307*6777b538SAndroid Build Coastguard Worker expected_cmd.extend(['--', './device_script.sh']) 308*6777b538SAndroid Build Coastguard Worker self.safeAssertItemsEqual(expected_cmd, mock_popen.call_args[0][0]) 309*6777b538SAndroid Build Coastguard Worker 310*6777b538SAndroid Build Coastguard Worker expected_device_script = dedent("""\ 311*6777b538SAndroid Build Coastguard Worker #!/bin/sh 312*6777b538SAndroid Build Coastguard Worker export HOME=/usr/local/tmp 313*6777b538SAndroid Build Coastguard Worker export TMPDIR=/usr/local/tmp 314*6777b538SAndroid Build Coastguard Worker """) 315*6777b538SAndroid Build Coastguard Worker 316*6777b538SAndroid Build Coastguard Worker core_cmd = 'LD_LIBRARY_PATH=./ ./out_eve/Release/base_unittests'\ 317*6777b538SAndroid Build Coastguard Worker ' --test-launcher-shard-index=0 --test-launcher-total-shards=1' 318*6777b538SAndroid Build Coastguard Worker 319*6777b538SAndroid Build Coastguard Worker if use_test_sudo_helper: 320*6777b538SAndroid Build Coastguard Worker expected_device_script += dedent("""\ 321*6777b538SAndroid Build Coastguard Worker TEST_SUDO_HELPER_PATH=$(mktemp) 322*6777b538SAndroid Build Coastguard Worker ./test_sudo_helper.py --socket-path=${TEST_SUDO_HELPER_PATH} & 323*6777b538SAndroid Build Coastguard Worker TEST_SUDO_HELPER_PID=$! 324*6777b538SAndroid Build Coastguard Worker """) 325*6777b538SAndroid Build Coastguard Worker core_cmd += ' --test-sudo-helper-socket-path=${TEST_SUDO_HELPER_PATH}' 326*6777b538SAndroid Build Coastguard Worker 327*6777b538SAndroid Build Coastguard Worker if stop_ui: 328*6777b538SAndroid Build Coastguard Worker dbus_cmd = 'dbus-send --system --type=method_call'\ 329*6777b538SAndroid Build Coastguard Worker ' --dest=org.chromium.PowerManager'\ 330*6777b538SAndroid Build Coastguard Worker ' /org/chromium/PowerManager'\ 331*6777b538SAndroid Build Coastguard Worker ' org.chromium.PowerManager.HandleUserActivity int32:0' 332*6777b538SAndroid Build Coastguard Worker expected_device_script += dedent("""\ 333*6777b538SAndroid Build Coastguard Worker stop ui 334*6777b538SAndroid Build Coastguard Worker {0} 335*6777b538SAndroid Build Coastguard Worker chown -R chronos: ../.. 336*6777b538SAndroid Build Coastguard Worker sudo -E -u chronos -- /bin/bash -c \"{1}\" 337*6777b538SAndroid Build Coastguard Worker TEST_RETURN_CODE=$? 338*6777b538SAndroid Build Coastguard Worker start ui 339*6777b538SAndroid Build Coastguard Worker """).format(dbus_cmd, core_cmd) 340*6777b538SAndroid Build Coastguard Worker else: 341*6777b538SAndroid Build Coastguard Worker expected_device_script += dedent("""\ 342*6777b538SAndroid Build Coastguard Worker {0} 343*6777b538SAndroid Build Coastguard Worker TEST_RETURN_CODE=$? 344*6777b538SAndroid Build Coastguard Worker """).format(core_cmd) 345*6777b538SAndroid Build Coastguard Worker 346*6777b538SAndroid Build Coastguard Worker if use_test_sudo_helper: 347*6777b538SAndroid Build Coastguard Worker expected_device_script += dedent("""\ 348*6777b538SAndroid Build Coastguard Worker pkill -P $TEST_SUDO_HELPER_PID 349*6777b538SAndroid Build Coastguard Worker kill $TEST_SUDO_HELPER_PID 350*6777b538SAndroid Build Coastguard Worker unlink ${TEST_SUDO_HELPER_PATH} 351*6777b538SAndroid Build Coastguard Worker """) 352*6777b538SAndroid Build Coastguard Worker expected_device_script += dedent("""\ 353*6777b538SAndroid Build Coastguard Worker exit $TEST_RETURN_CODE 354*6777b538SAndroid Build Coastguard Worker """) 355*6777b538SAndroid Build Coastguard Worker self.assertEqual(1, fd_mock().write.call_count) 356*6777b538SAndroid Build Coastguard Worker # Split the strings to make failure messages easier to read. 357*6777b538SAndroid Build Coastguard Worker self.assertListEqual( 358*6777b538SAndroid Build Coastguard Worker expected_device_script.split('\n'), 359*6777b538SAndroid Build Coastguard Worker fd_mock().write.call_args[0][0].split('\n')) 360*6777b538SAndroid Build Coastguard Worker mock_remove.assert_called_once_with('out_eve/Release/device_script.sh') 361*6777b538SAndroid Build Coastguard Worker 362*6777b538SAndroid Build Coastguard Worker def test_gtest_with_vpython(self): 363*6777b538SAndroid Build Coastguard Worker """Tests building a gtest with --vpython-dir.""" 364*6777b538SAndroid Build Coastguard Worker args = mock.MagicMock() 365*6777b538SAndroid Build Coastguard Worker args.test_exe = 'base_unittests' 366*6777b538SAndroid Build Coastguard Worker args.test_launcher_summary_output = None 367*6777b538SAndroid Build Coastguard Worker args.trace_dir = None 368*6777b538SAndroid Build Coastguard Worker args.runtime_deps_path = None 369*6777b538SAndroid Build Coastguard Worker args.path_to_outdir = self._tmp_dir 370*6777b538SAndroid Build Coastguard Worker args.vpython_dir = self._tmp_dir 371*6777b538SAndroid Build Coastguard Worker args.logs_dir = self._tmp_dir 372*6777b538SAndroid Build Coastguard Worker 373*6777b538SAndroid Build Coastguard Worker # With vpython_dir initially empty, the test_runner should error out 374*6777b538SAndroid Build Coastguard Worker # due to missing vpython binaries. 375*6777b538SAndroid Build Coastguard Worker gtest = test_runner.GTestTest(args, None) 376*6777b538SAndroid Build Coastguard Worker with self.assertRaises(test_runner.TestFormatError): 377*6777b538SAndroid Build Coastguard Worker gtest.build_test_command() 378*6777b538SAndroid Build Coastguard Worker 379*6777b538SAndroid Build Coastguard Worker # Create the two expected tools, and the test should be ready to run. 380*6777b538SAndroid Build Coastguard Worker with open(os.path.join(args.vpython_dir, 'vpython3'), 'w'): 381*6777b538SAndroid Build Coastguard Worker pass # Just touch the file. 382*6777b538SAndroid Build Coastguard Worker os.mkdir(os.path.join(args.vpython_dir, 'bin')) 383*6777b538SAndroid Build Coastguard Worker with open(os.path.join(args.vpython_dir, 'bin', 'python3'), 'w'): 384*6777b538SAndroid Build Coastguard Worker pass 385*6777b538SAndroid Build Coastguard Worker gtest = test_runner.GTestTest(args, None) 386*6777b538SAndroid Build Coastguard Worker gtest.build_test_command() 387*6777b538SAndroid Build Coastguard Worker 388*6777b538SAndroid Build Coastguard Worker 389*6777b538SAndroid Build Coastguard Workerclass HostCmdTests(TestRunnerTest): 390*6777b538SAndroid Build Coastguard Worker 391*6777b538SAndroid Build Coastguard Worker @parameterized.expand([ 392*6777b538SAndroid Build Coastguard Worker [True, False, True], 393*6777b538SAndroid Build Coastguard Worker [False, True, True], 394*6777b538SAndroid Build Coastguard Worker [True, True, False], 395*6777b538SAndroid Build Coastguard Worker [False, True, False], 396*6777b538SAndroid Build Coastguard Worker ]) 397*6777b538SAndroid Build Coastguard Worker def test_host_cmd(self, is_lacros, is_ash, strip_chrome): 398*6777b538SAndroid Build Coastguard Worker args = [ 399*6777b538SAndroid Build Coastguard Worker 'script_name', 400*6777b538SAndroid Build Coastguard Worker 'host-cmd', 401*6777b538SAndroid Build Coastguard Worker '--board=eve', 402*6777b538SAndroid Build Coastguard Worker '--flash', 403*6777b538SAndroid Build Coastguard Worker '--path-to-outdir=out/Release', 404*6777b538SAndroid Build Coastguard Worker '--device=localhost:2222', 405*6777b538SAndroid Build Coastguard Worker ] 406*6777b538SAndroid Build Coastguard Worker if is_lacros: 407*6777b538SAndroid Build Coastguard Worker args += ['--deploy-lacros'] 408*6777b538SAndroid Build Coastguard Worker if is_ash: 409*6777b538SAndroid Build Coastguard Worker args += ['--deploy-chrome'] 410*6777b538SAndroid Build Coastguard Worker if strip_chrome: 411*6777b538SAndroid Build Coastguard Worker args += ['--strip-chrome'] 412*6777b538SAndroid Build Coastguard Worker args += [ 413*6777b538SAndroid Build Coastguard Worker '--', 414*6777b538SAndroid Build Coastguard Worker 'fake_cmd', 415*6777b538SAndroid Build Coastguard Worker ] 416*6777b538SAndroid Build Coastguard Worker with mock.patch.object(sys, 'argv', args),\ 417*6777b538SAndroid Build Coastguard Worker mock.patch.object(test_runner.subprocess, 'Popen') as mock_popen: 418*6777b538SAndroid Build Coastguard Worker mock_popen.return_value.returncode = 0 419*6777b538SAndroid Build Coastguard Worker 420*6777b538SAndroid Build Coastguard Worker test_runner.main() 421*6777b538SAndroid Build Coastguard Worker expected_cmd = [ 422*6777b538SAndroid Build Coastguard Worker test_runner.CROS_RUN_TEST_PATH, 423*6777b538SAndroid Build Coastguard Worker '--board', 424*6777b538SAndroid Build Coastguard Worker 'eve', 425*6777b538SAndroid Build Coastguard Worker '--cache-dir', 426*6777b538SAndroid Build Coastguard Worker test_runner.DEFAULT_CROS_CACHE, 427*6777b538SAndroid Build Coastguard Worker '--flash', 428*6777b538SAndroid Build Coastguard Worker '--device', 429*6777b538SAndroid Build Coastguard Worker 'localhost:2222', 430*6777b538SAndroid Build Coastguard Worker '--build-dir', 431*6777b538SAndroid Build Coastguard Worker os.path.join(test_runner.CHROMIUM_SRC_PATH, 'out/Release'), 432*6777b538SAndroid Build Coastguard Worker '--host-cmd', 433*6777b538SAndroid Build Coastguard Worker ] 434*6777b538SAndroid Build Coastguard Worker if is_lacros: 435*6777b538SAndroid Build Coastguard Worker expected_cmd += [ 436*6777b538SAndroid Build Coastguard Worker '--deploy-lacros', 437*6777b538SAndroid Build Coastguard Worker '--lacros-launcher-script', 438*6777b538SAndroid Build Coastguard Worker test_runner.LACROS_LAUNCHER_SCRIPT_PATH, 439*6777b538SAndroid Build Coastguard Worker ] 440*6777b538SAndroid Build Coastguard Worker if is_ash: 441*6777b538SAndroid Build Coastguard Worker expected_cmd += ['--mount', '--deploy'] 442*6777b538SAndroid Build Coastguard Worker if not strip_chrome: 443*6777b538SAndroid Build Coastguard Worker expected_cmd += ['--nostrip'] 444*6777b538SAndroid Build Coastguard Worker 445*6777b538SAndroid Build Coastguard Worker expected_cmd += [ 446*6777b538SAndroid Build Coastguard Worker '--', 447*6777b538SAndroid Build Coastguard Worker 'fake_cmd', 448*6777b538SAndroid Build Coastguard Worker ] 449*6777b538SAndroid Build Coastguard Worker 450*6777b538SAndroid Build Coastguard Worker self.safeAssertItemsEqual(expected_cmd, mock_popen.call_args[0][0]) 451*6777b538SAndroid Build Coastguard Worker 452*6777b538SAndroid Build Coastguard Worker 453*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__': 454*6777b538SAndroid Build Coastguard Worker unittest.main() 455