xref: /aosp_15_r20/external/cronet/build/chromeos/test_runner_test.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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