xref: /aosp_15_r20/external/cronet/build/lacros/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 logging
7*6777b538SAndroid Build Coastguard Workerimport os
8*6777b538SAndroid Build Coastguard Workerimport subprocess
9*6777b538SAndroid Build Coastguard Workerimport sys
10*6777b538SAndroid Build Coastguard Workerimport tempfile
11*6777b538SAndroid Build Coastguard Workerimport time
12*6777b538SAndroid Build Coastguard Workerimport unittest
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Workerimport mock
15*6777b538SAndroid Build Coastguard Workerfrom parameterized import parameterized
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Workerimport test_runner
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Worker
20*6777b538SAndroid Build Coastguard Workerclass TestRunnerTest(unittest.TestCase):
21*6777b538SAndroid Build Coastguard Worker  def setUp(self):
22*6777b538SAndroid Build Coastguard Worker    logging.disable(logging.CRITICAL)
23*6777b538SAndroid Build Coastguard Worker    time.sleep = mock.Mock()
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Worker  def tearDown(self):
26*6777b538SAndroid Build Coastguard Worker    logging.disable(logging.NOTSET)
27*6777b538SAndroid Build Coastguard Worker
28*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path,
29*6777b538SAndroid Build Coastguard Worker                     'dirname',
30*6777b538SAndroid Build Coastguard Worker                     return_value='chromium/src/build/lacros')
31*6777b538SAndroid Build Coastguard Worker  def test_expand_filter_file(self, _):
32*6777b538SAndroid Build Coastguard Worker    args = ['--some_flag="flag"']
33*6777b538SAndroid Build Coastguard Worker    test_runner._ExpandFilterFileIfNeeded('browser_tests', args)
34*6777b538SAndroid Build Coastguard Worker    self.assertTrue(args[1].endswith(
35*6777b538SAndroid Build Coastguard Worker        'chromium/src/'
36*6777b538SAndroid Build Coastguard Worker        'testing/buildbot/filters/linux-lacros.browser_tests.filter'))
37*6777b538SAndroid Build Coastguard Worker    self.assertTrue(args[1].startswith('--test-launcher-filter-file='))
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard Worker    args = ['--some_flag="flag"']
40*6777b538SAndroid Build Coastguard Worker    test_runner._ExpandFilterFileIfNeeded('random_tests', args)
41*6777b538SAndroid Build Coastguard Worker    self.assertEqual(len(args), 1)
42*6777b538SAndroid Build Coastguard Worker
43*6777b538SAndroid Build Coastguard Worker    args = ['--test-launcher-filter-file=new/filter']
44*6777b538SAndroid Build Coastguard Worker    test_runner._ExpandFilterFileIfNeeded('browser_tests', args)
45*6777b538SAndroid Build Coastguard Worker    self.assertEqual(len(args), 1)
46*6777b538SAndroid Build Coastguard Worker    self.assertTrue(args[0].endswith('new/filter'))
47*6777b538SAndroid Build Coastguard Worker
48*6777b538SAndroid Build Coastguard Worker  @parameterized.expand([
49*6777b538SAndroid Build Coastguard Worker      'url_unittests',
50*6777b538SAndroid Build Coastguard Worker      './url_unittests',
51*6777b538SAndroid Build Coastguard Worker      'out/release/url_unittests',
52*6777b538SAndroid Build Coastguard Worker      './out/release/url_unittests',
53*6777b538SAndroid Build Coastguard Worker  ])
54*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path, 'isfile', return_value=True)
55*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(test_runner, '_DownloadAshChromeIfNecessary')
56*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(subprocess, 'Popen', return_value=mock.Mock())
57*6777b538SAndroid Build Coastguard Worker  # Tests that the test runner doesn't attempt to download ash-chrome if not
58*6777b538SAndroid Build Coastguard Worker  # required.
59*6777b538SAndroid Build Coastguard Worker  def test_do_not_require_ash_chrome(self, command, mock_popen, mock_download,
60*6777b538SAndroid Build Coastguard Worker                                     _):
61*6777b538SAndroid Build Coastguard Worker    args = ['script_name', 'test', command]
62*6777b538SAndroid Build Coastguard Worker    with mock.patch.object(sys, 'argv', args):
63*6777b538SAndroid Build Coastguard Worker      test_runner.Main()
64*6777b538SAndroid Build Coastguard Worker      self.assertEqual(1, mock_popen.call_count)
65*6777b538SAndroid Build Coastguard Worker      mock_popen.assert_called_with([command])
66*6777b538SAndroid Build Coastguard Worker      self.assertFalse(mock_download.called)
67*6777b538SAndroid Build Coastguard Worker
68*6777b538SAndroid Build Coastguard Worker  @parameterized.expand([
69*6777b538SAndroid Build Coastguard Worker      'browser_tests', 'components_browsertests', 'content_browsertests',
70*6777b538SAndroid Build Coastguard Worker      'lacros_chrome_browsertests',
71*6777b538SAndroid Build Coastguard Worker      'browser_tests --enable-pixel-output-in-tests'
72*6777b538SAndroid Build Coastguard Worker  ])
73*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os,
74*6777b538SAndroid Build Coastguard Worker                     'listdir',
75*6777b538SAndroid Build Coastguard Worker                     return_value=['wayland-exo', 'wayland-exo.lock'])
76*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(tempfile,
77*6777b538SAndroid Build Coastguard Worker                     'mkdtemp',
78*6777b538SAndroid Build Coastguard Worker                     side_effect=['/tmp/xdg', '/tmp/ash-data', '/tmp/unique'])
79*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.environ, 'copy', side_effect=[{}, {}])
80*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path, 'exists', return_value=True)
81*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path, 'isfile', return_value=True)
82*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path, 'abspath', return_value='/a/b/filter')
83*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(test_runner,
84*6777b538SAndroid Build Coastguard Worker                     '_GetLatestVersionOfAshChrome',
85*6777b538SAndroid Build Coastguard Worker                     return_value='793554')
86*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(test_runner, '_DownloadAshChromeIfNecessary')
87*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(subprocess, 'Popen', return_value=mock.Mock())
88*6777b538SAndroid Build Coastguard Worker  # Tests that the test runner downloads and spawns ash-chrome if ash-chrome is
89*6777b538SAndroid Build Coastguard Worker  # required.
90*6777b538SAndroid Build Coastguard Worker  def test_require_ash_chrome(self, command, mock_popen, mock_download, *_):
91*6777b538SAndroid Build Coastguard Worker    command_parts = command.split()
92*6777b538SAndroid Build Coastguard Worker    args = ['script_name', 'test']
93*6777b538SAndroid Build Coastguard Worker    args.extend(command_parts)
94*6777b538SAndroid Build Coastguard Worker    with mock.patch.object(sys, 'argv', args):
95*6777b538SAndroid Build Coastguard Worker      test_runner.Main()
96*6777b538SAndroid Build Coastguard Worker      mock_download.assert_called_with('793554')
97*6777b538SAndroid Build Coastguard Worker      self.assertEqual(2, mock_popen.call_count)
98*6777b538SAndroid Build Coastguard Worker
99*6777b538SAndroid Build Coastguard Worker      ash_chrome_args = mock_popen.call_args_list[0][0][0]
100*6777b538SAndroid Build Coastguard Worker      self.assertTrue(ash_chrome_args[0].endswith(
101*6777b538SAndroid Build Coastguard Worker          'build/lacros/prebuilt_ash_chrome/793554/test_ash_chrome'))
102*6777b538SAndroid Build Coastguard Worker      expected_ash_chrome_args = [
103*6777b538SAndroid Build Coastguard Worker          '--user-data-dir=/tmp/ash-data',
104*6777b538SAndroid Build Coastguard Worker          '--enable-wayland-server',
105*6777b538SAndroid Build Coastguard Worker          '--no-startup-window',
106*6777b538SAndroid Build Coastguard Worker          '--disable-input-event-activation-protection',
107*6777b538SAndroid Build Coastguard Worker          '--disable-lacros-keep-alive',
108*6777b538SAndroid Build Coastguard Worker          '--disable-login-lacros-opening',
109*6777b538SAndroid Build Coastguard Worker          '--enable-field-trial-config',
110*6777b538SAndroid Build Coastguard Worker          '--enable-logging=stderr',
111*6777b538SAndroid Build Coastguard Worker          '--enable-features=LacrosSupport,LacrosPrimary,LacrosOnly',
112*6777b538SAndroid Build Coastguard Worker          '--ash-ready-file-path=/tmp/ash-data/ash_ready.txt',
113*6777b538SAndroid Build Coastguard Worker          '--wayland-server-socket=wayland-exo',
114*6777b538SAndroid Build Coastguard Worker      ]
115*6777b538SAndroid Build Coastguard Worker      if '--enable-pixel-output-in-tests' not in command_parts:
116*6777b538SAndroid Build Coastguard Worker        expected_ash_chrome_args.append('--disable-gl-drawing-for-tests')
117*6777b538SAndroid Build Coastguard Worker      if command == 'lacros_chrome_browsertests':
118*6777b538SAndroid Build Coastguard Worker        expected_ash_chrome_args.append(
119*6777b538SAndroid Build Coastguard Worker            '--lacros-mojo-socket-for-testing=/tmp/ash-data/lacros.sock')
120*6777b538SAndroid Build Coastguard Worker      self.assertListEqual(expected_ash_chrome_args, ash_chrome_args[1:])
121*6777b538SAndroid Build Coastguard Worker      ash_chrome_env = mock_popen.call_args_list[0][1].get('env', {})
122*6777b538SAndroid Build Coastguard Worker      self.assertDictEqual({'XDG_RUNTIME_DIR': '/tmp/xdg'}, ash_chrome_env)
123*6777b538SAndroid Build Coastguard Worker
124*6777b538SAndroid Build Coastguard Worker      test_args = mock_popen.call_args_list[1][0][0]
125*6777b538SAndroid Build Coastguard Worker      if command == 'lacros_chrome_browsertests':
126*6777b538SAndroid Build Coastguard Worker        self.assertListEqual([
127*6777b538SAndroid Build Coastguard Worker            command, '--test-launcher-filter-file=/a/b/filter',
128*6777b538SAndroid Build Coastguard Worker            '--lacros-mojo-socket-for-testing=/tmp/ash-data/lacros.sock',
129*6777b538SAndroid Build Coastguard Worker            '--ash-chrome-path=' + ash_chrome_args[0],
130*6777b538SAndroid Build Coastguard Worker            '--unique-ash-dir=/tmp/unique'
131*6777b538SAndroid Build Coastguard Worker        ], test_args)
132*6777b538SAndroid Build Coastguard Worker      else:
133*6777b538SAndroid Build Coastguard Worker        self.assertListEqual(test_args[:len(command_parts)], command_parts)
134*6777b538SAndroid Build Coastguard Worker
135*6777b538SAndroid Build Coastguard Worker      test_env = mock_popen.call_args_list[1][1].get('env', {})
136*6777b538SAndroid Build Coastguard Worker      self.assertDictEqual(
137*6777b538SAndroid Build Coastguard Worker          {
138*6777b538SAndroid Build Coastguard Worker              'WAYLAND_DISPLAY': 'wayland-exo',
139*6777b538SAndroid Build Coastguard Worker              'XDG_RUNTIME_DIR': '/tmp/xdg',
140*6777b538SAndroid Build Coastguard Worker              'EGL_PLATFORM': 'surfaceless'
141*6777b538SAndroid Build Coastguard Worker          }, test_env)
142*6777b538SAndroid Build Coastguard Worker
143*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os,
144*6777b538SAndroid Build Coastguard Worker                     'listdir',
145*6777b538SAndroid Build Coastguard Worker                     return_value=['wayland-exo', 'wayland-exo.lock'])
146*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path, 'exists', return_value=True)
147*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path, 'isfile', return_value=True)
148*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(test_runner,
149*6777b538SAndroid Build Coastguard Worker                     '_GetLatestVersionOfAshChrome',
150*6777b538SAndroid Build Coastguard Worker                     return_value='793554')
151*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(test_runner, '_DownloadAshChromeIfNecessary')
152*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(subprocess, 'Popen', return_value=mock.Mock())
153*6777b538SAndroid Build Coastguard Worker  # Tests that when a ash-chrome version is specified, that version is used
154*6777b538SAndroid Build Coastguard Worker  # instead of the latest one.
155*6777b538SAndroid Build Coastguard Worker  def test_specify_ash_chrome_version(self, mock_popen, mock_download, *_):
156*6777b538SAndroid Build Coastguard Worker    args = [
157*6777b538SAndroid Build Coastguard Worker        'script_name', 'test', 'browser_tests', '--ash-chrome-version', '781122'
158*6777b538SAndroid Build Coastguard Worker    ]
159*6777b538SAndroid Build Coastguard Worker    with mock.patch.object(sys, 'argv', args):
160*6777b538SAndroid Build Coastguard Worker      test_runner.Main()
161*6777b538SAndroid Build Coastguard Worker      mock_download.assert_called_with('781122')
162*6777b538SAndroid Build Coastguard Worker
163*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os,
164*6777b538SAndroid Build Coastguard Worker                     'listdir',
165*6777b538SAndroid Build Coastguard Worker                     return_value=['wayland-exo', 'wayland-exo.lock'])
166*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path, 'exists', return_value=True)
167*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path, 'isfile', return_value=True)
168*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(test_runner, '_DownloadAshChromeIfNecessary')
169*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(subprocess, 'Popen', return_value=mock.Mock())
170*6777b538SAndroid Build Coastguard Worker  # Tests that if a ash-chrome version is specified, uses ash-chrome to run
171*6777b538SAndroid Build Coastguard Worker  # tests anyway even if |_TARGETS_REQUIRE_ASH_CHROME| indicates an ash-chrome
172*6777b538SAndroid Build Coastguard Worker  # is not required.
173*6777b538SAndroid Build Coastguard Worker  def test_overrides_do_not_require_ash_chrome(self, mock_popen, mock_download,
174*6777b538SAndroid Build Coastguard Worker                                               *_):
175*6777b538SAndroid Build Coastguard Worker    args = [
176*6777b538SAndroid Build Coastguard Worker        'script_name', 'test', './url_unittests', '--ash-chrome-version',
177*6777b538SAndroid Build Coastguard Worker        '793554'
178*6777b538SAndroid Build Coastguard Worker    ]
179*6777b538SAndroid Build Coastguard Worker    with mock.patch.object(sys, 'argv', args):
180*6777b538SAndroid Build Coastguard Worker      test_runner.Main()
181*6777b538SAndroid Build Coastguard Worker      mock_download.assert_called_with('793554')
182*6777b538SAndroid Build Coastguard Worker      self.assertEqual(2, mock_popen.call_count)
183*6777b538SAndroid Build Coastguard Worker
184*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os,
185*6777b538SAndroid Build Coastguard Worker                     'listdir',
186*6777b538SAndroid Build Coastguard Worker                     return_value=['wayland-exo', 'wayland-exo.lock'])
187*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path, 'exists', return_value=True)
188*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path, 'isfile', return_value=True)
189*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(test_runner, '_GetLatestVersionOfAshChrome')
190*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(test_runner, '_DownloadAshChromeIfNecessary')
191*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(subprocess, 'Popen', return_value=mock.Mock())
192*6777b538SAndroid Build Coastguard Worker  # Tests that when an ash-chrome path is specified, the test runner doesn't try
193*6777b538SAndroid Build Coastguard Worker  # to download prebuilt ash-chrome.
194*6777b538SAndroid Build Coastguard Worker  def test_specify_ash_chrome_path(self, mock_popen, mock_download,
195*6777b538SAndroid Build Coastguard Worker                                   mock_get_latest_version, *_):
196*6777b538SAndroid Build Coastguard Worker    args = [
197*6777b538SAndroid Build Coastguard Worker        'script_name',
198*6777b538SAndroid Build Coastguard Worker        'test',
199*6777b538SAndroid Build Coastguard Worker        'browser_tests',
200*6777b538SAndroid Build Coastguard Worker        '--ash-chrome-path',
201*6777b538SAndroid Build Coastguard Worker        '/ash/test_ash_chrome',
202*6777b538SAndroid Build Coastguard Worker    ]
203*6777b538SAndroid Build Coastguard Worker    with mock.patch.object(sys, 'argv', args):
204*6777b538SAndroid Build Coastguard Worker      test_runner.Main()
205*6777b538SAndroid Build Coastguard Worker      self.assertFalse(mock_get_latest_version.called)
206*6777b538SAndroid Build Coastguard Worker      self.assertFalse(mock_download.called)
207*6777b538SAndroid Build Coastguard Worker
208*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path, 'isfile', return_value=True)
209*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(test_runner, '_DownloadAshChromeIfNecessary')
210*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(subprocess, 'Popen', return_value=mock.Mock())
211*6777b538SAndroid Build Coastguard Worker  # Tests that arguments not known to the test runner are forwarded to the
212*6777b538SAndroid Build Coastguard Worker  # command that invokes tests.
213*6777b538SAndroid Build Coastguard Worker  def test_command_arguments(self, mock_popen, mock_download, _):
214*6777b538SAndroid Build Coastguard Worker    args = [
215*6777b538SAndroid Build Coastguard Worker        'script_name', 'test', './url_unittests', '--gtest_filter=Suite.Test'
216*6777b538SAndroid Build Coastguard Worker    ]
217*6777b538SAndroid Build Coastguard Worker    with mock.patch.object(sys, 'argv', args):
218*6777b538SAndroid Build Coastguard Worker      test_runner.Main()
219*6777b538SAndroid Build Coastguard Worker      mock_popen.assert_called_with(
220*6777b538SAndroid Build Coastguard Worker          ['./url_unittests', '--gtest_filter=Suite.Test'])
221*6777b538SAndroid Build Coastguard Worker      self.assertFalse(mock_download.called)
222*6777b538SAndroid Build Coastguard Worker
223*6777b538SAndroid Build Coastguard Worker  @mock.patch.dict(os.environ, {'ASH_WRAPPER': 'gdb --args'}, clear=False)
224*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os,
225*6777b538SAndroid Build Coastguard Worker                     'listdir',
226*6777b538SAndroid Build Coastguard Worker                     return_value=['wayland-exo', 'wayland-exo.lock'])
227*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(tempfile,
228*6777b538SAndroid Build Coastguard Worker                     'mkdtemp',
229*6777b538SAndroid Build Coastguard Worker                     side_effect=['/tmp/xdg', '/tmp/ash-data', '/tmp/unique'])
230*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.environ, 'copy', side_effect=[{}, {}])
231*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path, 'exists', return_value=True)
232*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path, 'isfile', return_value=True)
233*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(test_runner,
234*6777b538SAndroid Build Coastguard Worker                     '_GetLatestVersionOfAshChrome',
235*6777b538SAndroid Build Coastguard Worker                     return_value='793554')
236*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(test_runner, '_DownloadAshChromeIfNecessary')
237*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(subprocess, 'Popen', return_value=mock.Mock())
238*6777b538SAndroid Build Coastguard Worker  # Tests that, when the ASH_WRAPPER environment variable is set, it forwards
239*6777b538SAndroid Build Coastguard Worker  # the commands to the invocation of ash.
240*6777b538SAndroid Build Coastguard Worker  def test_ash_wrapper(self, mock_popen, *_):
241*6777b538SAndroid Build Coastguard Worker    args = [
242*6777b538SAndroid Build Coastguard Worker        'script_name', 'test', './browser_tests', '--gtest_filter=Suite.Test'
243*6777b538SAndroid Build Coastguard Worker    ]
244*6777b538SAndroid Build Coastguard Worker    with mock.patch.object(sys, 'argv', args):
245*6777b538SAndroid Build Coastguard Worker      test_runner.Main()
246*6777b538SAndroid Build Coastguard Worker      ash_args = mock_popen.call_args_list[0][0][0]
247*6777b538SAndroid Build Coastguard Worker      self.assertTrue(ash_args[2].endswith('test_ash_chrome'))
248*6777b538SAndroid Build Coastguard Worker      self.assertEqual(['gdb', '--args'], ash_args[:2])
249*6777b538SAndroid Build Coastguard Worker
250*6777b538SAndroid Build Coastguard Worker
251*6777b538SAndroid Build Coastguard Worker  # Test when ash is newer, test runner skips running tests and returns 0.
252*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path, 'exists', return_value=True)
253*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path, 'isfile', return_value=True)
254*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(test_runner, '_FindLacrosMajorVersion', return_value=91)
255*6777b538SAndroid Build Coastguard Worker  def test_version_skew_ash_newer(self, *_):
256*6777b538SAndroid Build Coastguard Worker    args = [
257*6777b538SAndroid Build Coastguard Worker        'script_name', 'test', './browser_tests', '--gtest_filter=Suite.Test',
258*6777b538SAndroid Build Coastguard Worker        '--ash-chrome-path-override=\
259*6777b538SAndroid Build Coastguard Workerlacros_version_skew_tests_v92.0.100.0/test_ash_chrome'
260*6777b538SAndroid Build Coastguard Worker    ]
261*6777b538SAndroid Build Coastguard Worker    with mock.patch.object(sys, 'argv', args):
262*6777b538SAndroid Build Coastguard Worker      self.assertEqual(test_runner.Main(), 0)
263*6777b538SAndroid Build Coastguard Worker
264*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path, 'exists', return_value=True)
265*6777b538SAndroid Build Coastguard Worker  def test_lacros_version_from_chrome_version(self, *_):
266*6777b538SAndroid Build Coastguard Worker    version_data = '''\
267*6777b538SAndroid Build Coastguard WorkerMAJOR=95
268*6777b538SAndroid Build Coastguard WorkerMINOR=0
269*6777b538SAndroid Build Coastguard WorkerBUILD=4615
270*6777b538SAndroid Build Coastguard WorkerPATCH=0\
271*6777b538SAndroid Build Coastguard Worker'''
272*6777b538SAndroid Build Coastguard Worker    open_lib = '__builtin__.open'
273*6777b538SAndroid Build Coastguard Worker    if sys.version_info[0] >= 3:
274*6777b538SAndroid Build Coastguard Worker      open_lib = 'builtins.open'
275*6777b538SAndroid Build Coastguard Worker    with mock.patch(open_lib,
276*6777b538SAndroid Build Coastguard Worker                    mock.mock_open(read_data=version_data)) as mock_file:
277*6777b538SAndroid Build Coastguard Worker      version = test_runner._FindLacrosMajorVersion()
278*6777b538SAndroid Build Coastguard Worker      self.assertEqual(95, version)
279*6777b538SAndroid Build Coastguard Worker
280*6777b538SAndroid Build Coastguard Worker  @mock.patch.object(os.path, 'exists', return_value=True)
281*6777b538SAndroid Build Coastguard Worker  def test_lacros_version_from_metadata(self, *_):
282*6777b538SAndroid Build Coastguard Worker    metadata_json = '''
283*6777b538SAndroid Build Coastguard Worker{
284*6777b538SAndroid Build Coastguard Worker  "content": {
285*6777b538SAndroid Build Coastguard Worker    "version": "92.1.4389.2"
286*6777b538SAndroid Build Coastguard Worker  },
287*6777b538SAndroid Build Coastguard Worker  "metadata_version": 1
288*6777b538SAndroid Build Coastguard Worker}
289*6777b538SAndroid Build Coastguard Worker    '''
290*6777b538SAndroid Build Coastguard Worker    open_lib = '__builtin__.open'
291*6777b538SAndroid Build Coastguard Worker    if sys.version_info[0] >= 3:
292*6777b538SAndroid Build Coastguard Worker      open_lib = 'builtins.open'
293*6777b538SAndroid Build Coastguard Worker    with mock.patch(open_lib,
294*6777b538SAndroid Build Coastguard Worker                    mock.mock_open(read_data=metadata_json)) as mock_file:
295*6777b538SAndroid Build Coastguard Worker      version = test_runner._FindLacrosMajorVersionFromMetadata()
296*6777b538SAndroid Build Coastguard Worker      self.assertEqual(92, version)
297*6777b538SAndroid Build Coastguard Worker      mock_file.assert_called_with('metadata.json', 'r')
298*6777b538SAndroid Build Coastguard Worker
299*6777b538SAndroid Build Coastguard Worker
300*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__':
301*6777b538SAndroid Build Coastguard Worker  unittest.main()
302