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