# 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))