| # Copyright 2015 The ChromiumOS Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """This module tests the cros deploy command.""" |
| |
| from chromite.cli import command_unittest |
| from chromite.cli import deploy |
| from chromite.cli.cros import cros_deploy |
| from chromite.lib import commandline |
| from chromite.lib import cros_test_lib |
| from chromite.lib import remote_access |
| |
| |
| # pylint: disable=protected-access |
| |
| |
| class MockDeployCommand(command_unittest.MockCommand): |
| """Mock out the deploy command.""" |
| |
| TARGET = "chromite.cli.cros.cros_deploy.DeployCommand" |
| TARGET_CLASS = cros_deploy.DeployCommand |
| COMMAND = "deploy" |
| |
| |
| class CrosDeployTest( |
| cros_test_lib.MockTempDirTestCase, cros_test_lib.OutputTestCase |
| ): |
| """Test calling `cros deploy` with various arguments. |
| |
| These tests just check that arguments as specified on the command |
| line are properly passed through to deploy. Testing the |
| actual update flow should be done in the deploy unit tests. |
| """ |
| |
| DEVICE = remote_access.TEST_IP |
| PACKAGES = ["foo", "bar"] |
| |
| def SetupCommandMock(self, cmd_args) -> None: |
| """Setup comand mock.""" |
| self.cmd_mock = MockDeployCommand( |
| cmd_args, base_args=["--cache-dir", str(self.tempdir)] |
| ) |
| self.StartPatcher(self.cmd_mock) |
| |
| def setUp(self) -> None: |
| """Patches objects.""" |
| self.cmd_mock = None |
| self.deploy_mock = self.PatchObject(deploy, "Deploy", autospec=True) |
| self.run_inside_chroot_mock = self.PatchObject( |
| commandline, "RunInsideChroot", autospec=True |
| ) |
| |
| def VerifyDeployParameters(self, device, packages, **kwargs) -> None: |
| """Verifies the arguments passed to Deployer.Run(). |
| |
| This function helps verify that command line specifications are |
| parsed properly. |
| |
| Args: |
| device: expected device hostname. |
| packages: expected packages list. |
| **kwargs: keyword arguments expected in the call to Deployer.Run(). |
| Arguments unspecified here are checked against their default |
| value for `cros deploy`. |
| """ |
| deploy_args, deploy_kwargs = self.deploy_mock.call_args |
| self.assertEqual(device, deploy_args[0].hostname) |
| self.assertListEqual(packages, deploy_args[1]) |
| # `cros deploy` default options. Must match AddParser(). |
| expected_kwargs = { |
| "board": None, |
| "strip": True, |
| "emerge": True, |
| "root": "/", |
| "clean_binpkg": True, |
| "emerge_args": None, |
| "ssh_private_key": None, |
| "ping": True, |
| "dry_run": False, |
| "force": False, |
| "update": False, |
| "deep": False, |
| "deep_rev": False, |
| } |
| # Overwrite defaults with any variations in this test. |
| expected_kwargs.update(kwargs) |
| self.assertDictEqual(expected_kwargs, deploy_kwargs) |
| |
| def testDefaults(self) -> None: |
| """Tests `cros deploy` default values.""" |
| self.SetupCommandMock([self.DEVICE] + self.PACKAGES) |
| self.cmd_mock.inst.Run() |
| self.assertTrue(self.run_inside_chroot_mock.called) |
| self.VerifyDeployParameters(self.DEVICE, self.PACKAGES) |
| |
| def testDeployError(self) -> None: |
| """Tests that DeployErrors are passed through.""" |
| with self.OutputCapturer(): |
| self.SetupCommandMock([self.DEVICE] + self.PACKAGES) |
| self.deploy_mock.side_effect = deploy.DeployError |
| with self.assertRaises(deploy.DeployError): |
| self.cmd_mock.inst.Run() |