| # Copyright 2021 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import unittest |
| from unittest.mock import Mock, ANY, call |
| |
| from autotest_lib.server.cros.tradefed import push_arc_image |
| |
| # Use this version for tests if there isn't a special version that has to be |
| # tested. |
| _TEST_DEFAULT_ARC_VERSION = '7750398' |
| |
| # Use this host port combination if there isn't a special configuration that has |
| # to be tested. |
| _TEST_HOST_PORT = 'somehost:9384' |
| |
| # Expected command to be run on the host (device) to mark the device for |
| # reprovisioning. |
| _MARK_DIRTY_PROVISION_COMMAND = 'touch /mnt/stateful_partition/.force_provision' |
| |
| # The expected default values passed to run for mocks created with create*() |
| # methods, and they are unmodified. |
| _DEFAULT_EXPECTED_RUN_ARGS = [ |
| '--use-prebuilt-file', |
| 'arc-img.zip', |
| '--sepolicy-artifacts-path', |
| 'sepolicy.zip', |
| '--force', |
| 'somehost:9384', |
| ] |
| |
| # The expected default values passed to run as the script path for mocks created |
| # with create*() methods, and they are unmodified. |
| _DEFAULT_EXPECTED_PTD_PATH = 'some/extracted/dir/push_to_device.py' |
| |
| |
| class PushArcImageTest(unittest.TestCase): |
| """Unittest for push_arc_image.""" |
| |
| def createMockHost(self, version, abi): |
| mock_host = Mock() |
| mock_host.get_arc_version.return_value = version |
| mock_host.get_arc_primary_abi.return_value = abi |
| mock_host.host_port = _TEST_HOST_PORT |
| return mock_host |
| |
| def createMockDownloadFunc(self): |
| mock_download_func = Mock() |
| mock_download_func.side_effect = ['arc-img.zip', 'sepolicy.zip'] |
| return mock_download_func |
| |
| def createMockInstallBundleFunc(self): |
| mock_install_bundle_func = Mock() |
| mock_install_bundle_func.return_value = 'some/extracted/dir' |
| return mock_install_bundle_func |
| |
| def test_push_userdebug_image_bertha_arm64(self): |
| mock_host = self.createMockHost(_TEST_DEFAULT_ARC_VERSION, 'arm64-v8a') |
| mock_download_func = self.createMockDownloadFunc() |
| mock_install_bundle_func = self.createMockInstallBundleFunc() |
| mock_run_func = Mock() |
| |
| in_sequence = Mock() |
| in_sequence.attach_mock(mock_run_func, 'run') |
| in_sequence.attach_mock(mock_host.run, 'host_run') |
| |
| self.assertTrue( |
| push_arc_image.push_userdebug_image(mock_host, 'rvc-arc', |
| 'bertha', |
| mock_download_func, |
| mock_install_bundle_func, |
| mock_run_func)) |
| |
| mock_host.get_arc_version.assert_called_once() |
| mock_host.get_arc_primary_abi.assert_called_once() |
| mock_download_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_rvc-arc-*linux-bertha_arm64-userdebug/' |
| '7750398/bertha_arm64-img-7750398.zip') |
| |
| mock_download_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_rvc-arc-*linux-bertha_arm64-userdebug/' |
| '7750398/sepolicy.zip') |
| |
| mock_install_bundle_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_rvc-arc-*linux-bertha_arm64-userdebug/' |
| '7750398/push_to_device.zip') |
| |
| expected_calls = [ |
| call.host_run(_MARK_DIRTY_PROVISION_COMMAND), |
| call.run( |
| _DEFAULT_EXPECTED_PTD_PATH, |
| args=_DEFAULT_EXPECTED_RUN_ARGS, |
| ignore_status=ANY, |
| verbose=ANY, |
| nickname=ANY, |
| ), |
| ] |
| self.assertEqual(in_sequence.mock_calls, expected_calls) |
| |
| def test_push_userdebug_image_bertha_x86_64(self): |
| mock_host = self.createMockHost(_TEST_DEFAULT_ARC_VERSION, 'x86_64') |
| mock_download_func = self.createMockDownloadFunc() |
| mock_install_bundle_func = self.createMockInstallBundleFunc() |
| mock_run_func = Mock() |
| |
| in_sequence = Mock() |
| in_sequence.attach_mock(mock_run_func, 'run') |
| in_sequence.attach_mock(mock_host.run, 'host_run') |
| |
| self.assertTrue( |
| push_arc_image.push_userdebug_image(mock_host, 'rvc-arc', |
| 'bertha', |
| mock_download_func, |
| mock_install_bundle_func, |
| mock_run_func)) |
| |
| mock_host.get_arc_version.assert_called_once() |
| mock_host.get_arc_primary_abi.assert_called_once() |
| mock_download_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_rvc-arc-*linux-bertha_x86_64-userdebug/' |
| '7750398/bertha_x86_64-img-7750398.zip') |
| |
| mock_download_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_rvc-arc-*linux-bertha_x86_64-userdebug/' |
| '7750398/sepolicy.zip') |
| |
| mock_install_bundle_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_rvc-arc-*linux-bertha_x86_64-userdebug/' |
| '7750398/push_to_device.zip') |
| |
| expected_calls = [ |
| call.host_run(_MARK_DIRTY_PROVISION_COMMAND), |
| call.run( |
| _DEFAULT_EXPECTED_PTD_PATH, |
| args=_DEFAULT_EXPECTED_RUN_ARGS, |
| ignore_status=ANY, |
| verbose=ANY, |
| nickname=ANY, |
| ), |
| ] |
| self.assertEqual(in_sequence.mock_calls, expected_calls) |
| |
| def test_push_userdebug_image_cheets_arm(self): |
| mock_host = self.createMockHost(_TEST_DEFAULT_ARC_VERSION, |
| 'armeabi-v7a') |
| mock_download_func = self.createMockDownloadFunc() |
| mock_install_bundle_func = self.createMockInstallBundleFunc() |
| mock_run_func = Mock() |
| |
| in_sequence = Mock() |
| in_sequence.attach_mock(mock_run_func, 'run') |
| in_sequence.attach_mock(mock_host.run, 'host_run') |
| |
| self.assertTrue( |
| push_arc_image.push_userdebug_image(mock_host, 'pi-arc', |
| 'cheets', |
| mock_download_func, |
| mock_install_bundle_func, |
| mock_run_func)) |
| |
| mock_host.get_arc_version.assert_called_once() |
| mock_host.get_arc_primary_abi.assert_called_once() |
| mock_download_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_pi-arc-*linux-cheets_arm-userdebug/' |
| '7750398/cheets_arm-img-7750398.zip') |
| |
| mock_download_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_pi-arc-*linux-cheets_arm-userdebug/' |
| '7750398/sepolicy.zip') |
| |
| mock_install_bundle_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_pi-arc-*linux-cheets_arm-userdebug/' |
| '7750398/push_to_device.zip') |
| |
| expected_calls = [ |
| call.host_run(_MARK_DIRTY_PROVISION_COMMAND), |
| call.run( |
| _DEFAULT_EXPECTED_PTD_PATH, |
| args=_DEFAULT_EXPECTED_RUN_ARGS, |
| ignore_status=ANY, |
| verbose=ANY, |
| nickname=ANY, |
| ), |
| ] |
| self.assertEqual(in_sequence.mock_calls, expected_calls) |
| |
| def test_push_userdebug_image_cheets_arm64(self): |
| mock_host = self.createMockHost(_TEST_DEFAULT_ARC_VERSION, 'arm64-v8a') |
| mock_download_func = self.createMockDownloadFunc() |
| mock_install_bundle_func = self.createMockInstallBundleFunc() |
| mock_run_func = Mock() |
| |
| in_sequence = Mock() |
| in_sequence.attach_mock(mock_run_func, 'run') |
| in_sequence.attach_mock(mock_host.run, 'host_run') |
| |
| self.assertTrue( |
| push_arc_image.push_userdebug_image(mock_host, 'pi-arc', |
| 'cheets', |
| mock_download_func, |
| mock_install_bundle_func, |
| mock_run_func)) |
| |
| mock_host.get_arc_version.assert_called_once() |
| mock_host.get_arc_primary_abi.assert_called_once() |
| mock_download_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_pi-arc-*linux-cheets_arm64-userdebug/' |
| '7750398/cheets_arm64-img-7750398.zip') |
| |
| mock_download_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_pi-arc-*linux-cheets_arm64-userdebug/' |
| '7750398/sepolicy.zip') |
| |
| mock_install_bundle_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_pi-arc-*linux-cheets_arm64-userdebug/' |
| '7750398/push_to_device.zip') |
| |
| expected_calls = [ |
| call.host_run(_MARK_DIRTY_PROVISION_COMMAND), |
| call.run( |
| _DEFAULT_EXPECTED_PTD_PATH, |
| args=_DEFAULT_EXPECTED_RUN_ARGS, |
| ignore_status=ANY, |
| verbose=ANY, |
| nickname=ANY, |
| ), |
| ] |
| self.assertEqual(in_sequence.mock_calls, expected_calls) |
| |
| def test_push_userdebug_image_cheets_x86(self): |
| mock_host = self.createMockHost(_TEST_DEFAULT_ARC_VERSION, 'x86') |
| mock_download_func = self.createMockDownloadFunc() |
| mock_install_bundle_func = self.createMockInstallBundleFunc() |
| mock_run_func = Mock() |
| |
| in_sequence = Mock() |
| in_sequence.attach_mock(mock_run_func, 'run') |
| in_sequence.attach_mock(mock_host.run, 'host_run') |
| |
| self.assertTrue( |
| push_arc_image.push_userdebug_image(mock_host, 'pi-arc', |
| 'cheets', |
| mock_download_func, |
| mock_install_bundle_func, |
| mock_run_func)) |
| |
| mock_host.get_arc_version.assert_called_once() |
| mock_host.get_arc_primary_abi.assert_called_once() |
| mock_download_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_pi-arc-*linux-cheets_x86-userdebug/' |
| '7750398/cheets_x86-img-7750398.zip') |
| |
| mock_download_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_pi-arc-*linux-cheets_x86-userdebug/' |
| '7750398/sepolicy.zip') |
| |
| mock_install_bundle_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_pi-arc-*linux-cheets_x86-userdebug/' |
| '7750398/push_to_device.zip') |
| |
| expected_calls = [ |
| call.host_run(_MARK_DIRTY_PROVISION_COMMAND), |
| call.run( |
| _DEFAULT_EXPECTED_PTD_PATH, |
| args=_DEFAULT_EXPECTED_RUN_ARGS, |
| ignore_status=ANY, |
| verbose=ANY, |
| nickname=ANY, |
| ), |
| ] |
| self.assertEqual(in_sequence.mock_calls, expected_calls) |
| |
| def test_push_userdebug_image_cheets_x86_64(self): |
| mock_host = self.createMockHost(_TEST_DEFAULT_ARC_VERSION, 'x86_64') |
| mock_download_func = self.createMockDownloadFunc() |
| mock_install_bundle_func = self.createMockInstallBundleFunc() |
| mock_run_func = Mock() |
| |
| in_sequence = Mock() |
| in_sequence.attach_mock(mock_run_func, 'run') |
| in_sequence.attach_mock(mock_host.run, 'host_run') |
| |
| self.assertTrue( |
| push_arc_image.push_userdebug_image(mock_host, 'pi-arc', |
| 'cheets', |
| mock_download_func, |
| mock_install_bundle_func, |
| mock_run_func)) |
| |
| mock_host.get_arc_version.assert_called_once() |
| mock_host.get_arc_primary_abi.assert_called_once() |
| mock_download_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_pi-arc-*linux-cheets_x86_64-userdebug/' |
| '7750398/cheets_x86_64-img-7750398.zip') |
| |
| mock_download_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_pi-arc-*linux-cheets_x86_64-userdebug/' |
| '7750398/sepolicy.zip') |
| |
| mock_install_bundle_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_pi-arc-*linux-cheets_x86_64-userdebug/' |
| '7750398/push_to_device.zip') |
| |
| expected_calls = [ |
| call.host_run(_MARK_DIRTY_PROVISION_COMMAND), |
| call.run( |
| _DEFAULT_EXPECTED_PTD_PATH, |
| args=_DEFAULT_EXPECTED_RUN_ARGS, |
| ignore_status=ANY, |
| verbose=ANY, |
| nickname=ANY, |
| ), |
| ] |
| self.assertEqual(in_sequence.mock_calls, expected_calls) |
| |
| # Only newer push to device has support for HOST:PORT format. |
| # Verify that the if the build ID on the device is old, it |
| # downloads a newer ptd.py that has the necessary features. |
| def test_push_userdebug_image_old_image_bertha(self): |
| mock_host = self.createMockHost('5985921', 'x86_64') |
| mock_download_func = self.createMockDownloadFunc() |
| mock_install_bundle_func = self.createMockInstallBundleFunc() |
| mock_run_func = Mock() |
| |
| self.assertTrue( |
| push_arc_image.push_userdebug_image(mock_host, 'rvc-arc', |
| 'bertha', |
| mock_download_func, |
| mock_install_bundle_func, |
| mock_run_func)) |
| |
| mock_host.get_arc_version.assert_called_once() |
| mock_host.get_arc_primary_abi.assert_called_once() |
| |
| mock_install_bundle_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_rvc-arc-*linux-bertha_x86_64-userdebug/' |
| '7741959/push_to_device.zip') |
| |
| # Cheets has a different "minimum" version compared to bertha. |
| def test_push_userdebug_image_old_image_cheets(self): |
| mock_host = self.createMockHost('5985921', 'x86_64') |
| mock_download_func = self.createMockDownloadFunc() |
| mock_install_bundle_func = self.createMockInstallBundleFunc() |
| mock_run_func = Mock() |
| |
| self.assertTrue( |
| push_arc_image.push_userdebug_image(mock_host, 'pi-arc', |
| 'cheets', |
| mock_download_func, |
| mock_install_bundle_func, |
| mock_run_func)) |
| |
| mock_host.get_arc_version.assert_called_once() |
| mock_host.get_arc_primary_abi.assert_called_once() |
| |
| mock_install_bundle_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_pi-arc-*linux-cheets_x86_64-userdebug/' |
| '7740639/push_to_device.zip') |
| |
| # Even if the branch prefix is unknown, it should still try to get PTD tool. |
| def test_push_userdebug_image_unknown_branch_prefix(self): |
| mock_host = self.createMockHost('123456789', 'x86_64') |
| mock_download_func = self.createMockDownloadFunc() |
| mock_install_bundle_func = self.createMockInstallBundleFunc() |
| mock_run_func = Mock() |
| self.assertTrue( |
| push_arc_image.push_userdebug_image(mock_host, |
| 'myspecialbranch', |
| 'bertha', |
| mock_download_func, |
| mock_install_bundle_func, |
| mock_run_func)) |
| |
| mock_host.get_arc_version.assert_called_once() |
| mock_host.get_arc_primary_abi.assert_called_once() |
| |
| mock_install_bundle_func.assert_any_call( |
| 'gs://chromeos-arc-images/builds/' |
| 'git_myspecialbranch-*linux-bertha_x86_64-userdebug/' |
| '123456789/push_to_device.zip') |
| |
| # ARC version returned by the host could be None. Verify the function |
| # returns False. |
| def test_push_userdebug_image_failed_to_get_arc_version(self): |
| mock_host = self.createMockHost(None, 'x86_64') |
| mock_download_func = self.createMockDownloadFunc() |
| mock_install_bundle_func = self.createMockInstallBundleFunc() |
| mock_run_func = Mock() |
| |
| self.assertFalse( |
| push_arc_image.push_userdebug_image(mock_host, 'rvc-arc', |
| 'bertha', |
| mock_download_func, |
| mock_install_bundle_func, |
| mock_run_func)) |