xref: /aosp_15_r20/external/autotest/server/cros/tradefed/push_arc_image_unittest.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1# Copyright 2021 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import unittest
6from unittest.mock import Mock, ANY, call
7
8from autotest_lib.server.cros.tradefed import push_arc_image
9
10# Use this version for tests if there isn't a special version that has to be
11# tested.
12_TEST_DEFAULT_ARC_VERSION = '7750398'
13
14# Use this host port combination if there isn't a special configuration that has
15# to be tested.
16_TEST_HOST_PORT = 'somehost:9384'
17
18# Expected command to be run on the host (device) to mark the device for
19# reprovisioning.
20_MARK_DIRTY_PROVISION_COMMAND = 'touch /mnt/stateful_partition/.force_provision'
21
22# The expected default values passed to run for mocks created with create*()
23# methods, and they are unmodified.
24_DEFAULT_EXPECTED_RUN_ARGS = [
25        '--use-prebuilt-file',
26        'arc-img.zip',
27        '--sepolicy-artifacts-path',
28        'sepolicy.zip',
29        '--force',
30        'somehost:9384',
31]
32
33# The expected default values passed to run as the script path for mocks created
34# with create*() methods, and they are unmodified.
35_DEFAULT_EXPECTED_PTD_PATH = 'some/extracted/dir/push_to_device.py'
36
37
38class PushArcImageTest(unittest.TestCase):
39    """Unittest for push_arc_image."""
40
41    def createMockHost(self, version, abi):
42        mock_host = Mock()
43        mock_host.get_arc_version.return_value = version
44        mock_host.get_arc_primary_abi.return_value = abi
45        mock_host.host_port = _TEST_HOST_PORT
46        return mock_host
47
48    def createMockDownloadFunc(self):
49        mock_download_func = Mock()
50        mock_download_func.side_effect = ['arc-img.zip', 'sepolicy.zip']
51        return mock_download_func
52
53    def createMockInstallBundleFunc(self):
54        mock_install_bundle_func = Mock()
55        mock_install_bundle_func.return_value = 'some/extracted/dir'
56        return mock_install_bundle_func
57
58    def test_push_userdebug_image_bertha_arm64(self):
59        mock_host = self.createMockHost(_TEST_DEFAULT_ARC_VERSION, 'arm64-v8a')
60        mock_download_func = self.createMockDownloadFunc()
61        mock_install_bundle_func = self.createMockInstallBundleFunc()
62        mock_run_func = Mock()
63
64        in_sequence = Mock()
65        in_sequence.attach_mock(mock_run_func, 'run')
66        in_sequence.attach_mock(mock_host.run, 'host_run')
67
68        self.assertTrue(
69                push_arc_image.push_userdebug_image(mock_host, 'rvc-arc',
70                                                    'bertha',
71                                                    mock_download_func,
72                                                    mock_install_bundle_func,
73                                                    mock_run_func))
74
75        mock_host.get_arc_version.assert_called_once()
76        mock_host.get_arc_primary_abi.assert_called_once()
77        mock_download_func.assert_any_call(
78                'gs://chromeos-arc-images/builds/'
79                'git_rvc-arc-*linux-bertha_arm64-userdebug/'
80                '7750398/bertha_arm64-img-7750398.zip')
81
82        mock_download_func.assert_any_call(
83                'gs://chromeos-arc-images/builds/'
84                'git_rvc-arc-*linux-bertha_arm64-userdebug/'
85                '7750398/sepolicy.zip')
86
87        mock_install_bundle_func.assert_any_call(
88                'gs://chromeos-arc-images/builds/'
89                'git_rvc-arc-*linux-bertha_arm64-userdebug/'
90                '7750398/push_to_device.zip')
91
92        expected_calls = [
93                call.host_run(_MARK_DIRTY_PROVISION_COMMAND),
94                call.run(
95                        _DEFAULT_EXPECTED_PTD_PATH,
96                        args=_DEFAULT_EXPECTED_RUN_ARGS,
97                        ignore_status=ANY,
98                        verbose=ANY,
99                        nickname=ANY,
100                ),
101        ]
102        self.assertEqual(in_sequence.mock_calls, expected_calls)
103
104    def test_push_userdebug_image_bertha_x86_64(self):
105        mock_host = self.createMockHost(_TEST_DEFAULT_ARC_VERSION, 'x86_64')
106        mock_download_func = self.createMockDownloadFunc()
107        mock_install_bundle_func = self.createMockInstallBundleFunc()
108        mock_run_func = Mock()
109
110        in_sequence = Mock()
111        in_sequence.attach_mock(mock_run_func, 'run')
112        in_sequence.attach_mock(mock_host.run, 'host_run')
113
114        self.assertTrue(
115                push_arc_image.push_userdebug_image(mock_host, 'rvc-arc',
116                                                    'bertha',
117                                                    mock_download_func,
118                                                    mock_install_bundle_func,
119                                                    mock_run_func))
120
121        mock_host.get_arc_version.assert_called_once()
122        mock_host.get_arc_primary_abi.assert_called_once()
123        mock_download_func.assert_any_call(
124                'gs://chromeos-arc-images/builds/'
125                'git_rvc-arc-*linux-bertha_x86_64-userdebug/'
126                '7750398/bertha_x86_64-img-7750398.zip')
127
128        mock_download_func.assert_any_call(
129                'gs://chromeos-arc-images/builds/'
130                'git_rvc-arc-*linux-bertha_x86_64-userdebug/'
131                '7750398/sepolicy.zip')
132
133        mock_install_bundle_func.assert_any_call(
134                'gs://chromeos-arc-images/builds/'
135                'git_rvc-arc-*linux-bertha_x86_64-userdebug/'
136                '7750398/push_to_device.zip')
137
138        expected_calls = [
139                call.host_run(_MARK_DIRTY_PROVISION_COMMAND),
140                call.run(
141                        _DEFAULT_EXPECTED_PTD_PATH,
142                        args=_DEFAULT_EXPECTED_RUN_ARGS,
143                        ignore_status=ANY,
144                        verbose=ANY,
145                        nickname=ANY,
146                ),
147        ]
148        self.assertEqual(in_sequence.mock_calls, expected_calls)
149
150    def test_push_userdebug_image_cheets_arm(self):
151        mock_host = self.createMockHost(_TEST_DEFAULT_ARC_VERSION,
152                                        'armeabi-v7a')
153        mock_download_func = self.createMockDownloadFunc()
154        mock_install_bundle_func = self.createMockInstallBundleFunc()
155        mock_run_func = Mock()
156
157        in_sequence = Mock()
158        in_sequence.attach_mock(mock_run_func, 'run')
159        in_sequence.attach_mock(mock_host.run, 'host_run')
160
161        self.assertTrue(
162                push_arc_image.push_userdebug_image(mock_host, 'pi-arc',
163                                                    'cheets',
164                                                    mock_download_func,
165                                                    mock_install_bundle_func,
166                                                    mock_run_func))
167
168        mock_host.get_arc_version.assert_called_once()
169        mock_host.get_arc_primary_abi.assert_called_once()
170        mock_download_func.assert_any_call(
171                'gs://chromeos-arc-images/builds/'
172                'git_pi-arc-*linux-cheets_arm-userdebug/'
173                '7750398/cheets_arm-img-7750398.zip')
174
175        mock_download_func.assert_any_call(
176                'gs://chromeos-arc-images/builds/'
177                'git_pi-arc-*linux-cheets_arm-userdebug/'
178                '7750398/sepolicy.zip')
179
180        mock_install_bundle_func.assert_any_call(
181                'gs://chromeos-arc-images/builds/'
182                'git_pi-arc-*linux-cheets_arm-userdebug/'
183                '7750398/push_to_device.zip')
184
185        expected_calls = [
186                call.host_run(_MARK_DIRTY_PROVISION_COMMAND),
187                call.run(
188                        _DEFAULT_EXPECTED_PTD_PATH,
189                        args=_DEFAULT_EXPECTED_RUN_ARGS,
190                        ignore_status=ANY,
191                        verbose=ANY,
192                        nickname=ANY,
193                ),
194        ]
195        self.assertEqual(in_sequence.mock_calls, expected_calls)
196
197    def test_push_userdebug_image_cheets_arm64(self):
198        mock_host = self.createMockHost(_TEST_DEFAULT_ARC_VERSION, 'arm64-v8a')
199        mock_download_func = self.createMockDownloadFunc()
200        mock_install_bundle_func = self.createMockInstallBundleFunc()
201        mock_run_func = Mock()
202
203        in_sequence = Mock()
204        in_sequence.attach_mock(mock_run_func, 'run')
205        in_sequence.attach_mock(mock_host.run, 'host_run')
206
207        self.assertTrue(
208                push_arc_image.push_userdebug_image(mock_host, 'pi-arc',
209                                                    'cheets',
210                                                    mock_download_func,
211                                                    mock_install_bundle_func,
212                                                    mock_run_func))
213
214        mock_host.get_arc_version.assert_called_once()
215        mock_host.get_arc_primary_abi.assert_called_once()
216        mock_download_func.assert_any_call(
217                'gs://chromeos-arc-images/builds/'
218                'git_pi-arc-*linux-cheets_arm64-userdebug/'
219                '7750398/cheets_arm64-img-7750398.zip')
220
221        mock_download_func.assert_any_call(
222                'gs://chromeos-arc-images/builds/'
223                'git_pi-arc-*linux-cheets_arm64-userdebug/'
224                '7750398/sepolicy.zip')
225
226        mock_install_bundle_func.assert_any_call(
227                'gs://chromeos-arc-images/builds/'
228                'git_pi-arc-*linux-cheets_arm64-userdebug/'
229                '7750398/push_to_device.zip')
230
231        expected_calls = [
232                call.host_run(_MARK_DIRTY_PROVISION_COMMAND),
233                call.run(
234                        _DEFAULT_EXPECTED_PTD_PATH,
235                        args=_DEFAULT_EXPECTED_RUN_ARGS,
236                        ignore_status=ANY,
237                        verbose=ANY,
238                        nickname=ANY,
239                ),
240        ]
241        self.assertEqual(in_sequence.mock_calls, expected_calls)
242
243    def test_push_userdebug_image_cheets_x86(self):
244        mock_host = self.createMockHost(_TEST_DEFAULT_ARC_VERSION, 'x86')
245        mock_download_func = self.createMockDownloadFunc()
246        mock_install_bundle_func = self.createMockInstallBundleFunc()
247        mock_run_func = Mock()
248
249        in_sequence = Mock()
250        in_sequence.attach_mock(mock_run_func, 'run')
251        in_sequence.attach_mock(mock_host.run, 'host_run')
252
253        self.assertTrue(
254                push_arc_image.push_userdebug_image(mock_host, 'pi-arc',
255                                                    'cheets',
256                                                    mock_download_func,
257                                                    mock_install_bundle_func,
258                                                    mock_run_func))
259
260        mock_host.get_arc_version.assert_called_once()
261        mock_host.get_arc_primary_abi.assert_called_once()
262        mock_download_func.assert_any_call(
263                'gs://chromeos-arc-images/builds/'
264                'git_pi-arc-*linux-cheets_x86-userdebug/'
265                '7750398/cheets_x86-img-7750398.zip')
266
267        mock_download_func.assert_any_call(
268                'gs://chromeos-arc-images/builds/'
269                'git_pi-arc-*linux-cheets_x86-userdebug/'
270                '7750398/sepolicy.zip')
271
272        mock_install_bundle_func.assert_any_call(
273                'gs://chromeos-arc-images/builds/'
274                'git_pi-arc-*linux-cheets_x86-userdebug/'
275                '7750398/push_to_device.zip')
276
277        expected_calls = [
278                call.host_run(_MARK_DIRTY_PROVISION_COMMAND),
279                call.run(
280                        _DEFAULT_EXPECTED_PTD_PATH,
281                        args=_DEFAULT_EXPECTED_RUN_ARGS,
282                        ignore_status=ANY,
283                        verbose=ANY,
284                        nickname=ANY,
285                ),
286        ]
287        self.assertEqual(in_sequence.mock_calls, expected_calls)
288
289    def test_push_userdebug_image_cheets_x86_64(self):
290        mock_host = self.createMockHost(_TEST_DEFAULT_ARC_VERSION, 'x86_64')
291        mock_download_func = self.createMockDownloadFunc()
292        mock_install_bundle_func = self.createMockInstallBundleFunc()
293        mock_run_func = Mock()
294
295        in_sequence = Mock()
296        in_sequence.attach_mock(mock_run_func, 'run')
297        in_sequence.attach_mock(mock_host.run, 'host_run')
298
299        self.assertTrue(
300                push_arc_image.push_userdebug_image(mock_host, 'pi-arc',
301                                                    'cheets',
302                                                    mock_download_func,
303                                                    mock_install_bundle_func,
304                                                    mock_run_func))
305
306        mock_host.get_arc_version.assert_called_once()
307        mock_host.get_arc_primary_abi.assert_called_once()
308        mock_download_func.assert_any_call(
309                'gs://chromeos-arc-images/builds/'
310                'git_pi-arc-*linux-cheets_x86_64-userdebug/'
311                '7750398/cheets_x86_64-img-7750398.zip')
312
313        mock_download_func.assert_any_call(
314                'gs://chromeos-arc-images/builds/'
315                'git_pi-arc-*linux-cheets_x86_64-userdebug/'
316                '7750398/sepolicy.zip')
317
318        mock_install_bundle_func.assert_any_call(
319                'gs://chromeos-arc-images/builds/'
320                'git_pi-arc-*linux-cheets_x86_64-userdebug/'
321                '7750398/push_to_device.zip')
322
323        expected_calls = [
324                call.host_run(_MARK_DIRTY_PROVISION_COMMAND),
325                call.run(
326                        _DEFAULT_EXPECTED_PTD_PATH,
327                        args=_DEFAULT_EXPECTED_RUN_ARGS,
328                        ignore_status=ANY,
329                        verbose=ANY,
330                        nickname=ANY,
331                ),
332        ]
333        self.assertEqual(in_sequence.mock_calls, expected_calls)
334
335    # Only newer push to device has support for HOST:PORT format.
336    # Verify that the if the build ID on the device is old, it
337    # downloads a newer ptd.py that has the necessary features.
338    def test_push_userdebug_image_old_image_bertha(self):
339        mock_host = self.createMockHost('5985921', 'x86_64')
340        mock_download_func = self.createMockDownloadFunc()
341        mock_install_bundle_func = self.createMockInstallBundleFunc()
342        mock_run_func = Mock()
343
344        self.assertTrue(
345                push_arc_image.push_userdebug_image(mock_host, 'rvc-arc',
346                                                    'bertha',
347                                                    mock_download_func,
348                                                    mock_install_bundle_func,
349                                                    mock_run_func))
350
351        mock_host.get_arc_version.assert_called_once()
352        mock_host.get_arc_primary_abi.assert_called_once()
353
354        mock_install_bundle_func.assert_any_call(
355                'gs://chromeos-arc-images/builds/'
356                'git_rvc-arc-*linux-bertha_x86_64-userdebug/'
357                '7741959/push_to_device.zip')
358
359    # Cheets has a different "minimum" version compared to bertha.
360    def test_push_userdebug_image_old_image_cheets(self):
361        mock_host = self.createMockHost('5985921', 'x86_64')
362        mock_download_func = self.createMockDownloadFunc()
363        mock_install_bundle_func = self.createMockInstallBundleFunc()
364        mock_run_func = Mock()
365
366        self.assertTrue(
367                push_arc_image.push_userdebug_image(mock_host, 'pi-arc',
368                                                    'cheets',
369                                                    mock_download_func,
370                                                    mock_install_bundle_func,
371                                                    mock_run_func))
372
373        mock_host.get_arc_version.assert_called_once()
374        mock_host.get_arc_primary_abi.assert_called_once()
375
376        mock_install_bundle_func.assert_any_call(
377                'gs://chromeos-arc-images/builds/'
378                'git_pi-arc-*linux-cheets_x86_64-userdebug/'
379                '7740639/push_to_device.zip')
380
381    # Even if the branch prefix is unknown, it should still try to get PTD tool.
382    def test_push_userdebug_image_unknown_branch_prefix(self):
383        mock_host = self.createMockHost('123456789', 'x86_64')
384        mock_download_func = self.createMockDownloadFunc()
385        mock_install_bundle_func = self.createMockInstallBundleFunc()
386        mock_run_func = Mock()
387        self.assertTrue(
388                push_arc_image.push_userdebug_image(mock_host,
389                                                    'myspecialbranch',
390                                                    'bertha',
391                                                    mock_download_func,
392                                                    mock_install_bundle_func,
393                                                    mock_run_func))
394
395        mock_host.get_arc_version.assert_called_once()
396        mock_host.get_arc_primary_abi.assert_called_once()
397
398        mock_install_bundle_func.assert_any_call(
399                'gs://chromeos-arc-images/builds/'
400                'git_myspecialbranch-*linux-bertha_x86_64-userdebug/'
401                '123456789/push_to_device.zip')
402
403    # ARC version returned by the host could be None. Verify the function
404    # returns False.
405    def test_push_userdebug_image_failed_to_get_arc_version(self):
406        mock_host = self.createMockHost(None, 'x86_64')
407        mock_download_func = self.createMockDownloadFunc()
408        mock_install_bundle_func = self.createMockInstallBundleFunc()
409        mock_run_func = Mock()
410
411        self.assertFalse(
412                push_arc_image.push_userdebug_image(mock_host, 'rvc-arc',
413                                                    'bertha',
414                                                    mock_download_func,
415                                                    mock_install_bundle_func,
416                                                    mock_run_func))
417