| # Copyright 2013 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 flash command.""" | |
| from chromite.cli import command_unittest | |
| from chromite.cli import flash | |
| from chromite.cli.cros import cros_flash | |
| from chromite.lib import commandline | |
| from chromite.lib import cros_test_lib | |
| from chromite.lib import remote_access | |
| pytestmark = cros_test_lib.pytestmark_inside_only | |
| class MockFlashCommand(command_unittest.MockCommand): | |
| """Mock out the flash command.""" | |
| TARGET = "chromite.cli.cros.cros_flash.FlashCommand" | |
| TARGET_CLASS = cros_flash.FlashCommand | |
| COMMAND = "flash" | |
| class CrosFlashTest( | |
| cros_test_lib.MockTempDirTestCase, cros_test_lib.OutputTestCase | |
| ): | |
| """Test calling `cros flash` with various arguments. | |
| These tests just check that arguments as specified on the command | |
| line are properly passed through to flash.Flash(). Testing the | |
| actual update flow is done in the flash.Flash() unit tests. | |
| """ | |
| IMAGE = "/path/to/image" | |
| DEVICE = remote_access.TEST_IP | |
| def SetupCommandMock(self, cmd_args): | |
| """Setup comand mock.""" | |
| self.cmd_mock = MockFlashCommand( | |
| cmd_args, base_args=["--cache-dir", str(self.tempdir)] | |
| ) | |
| self.StartPatcher(self.cmd_mock) | |
| def setUp(self): | |
| """Patches objects.""" | |
| self.cmd_mock = None | |
| self.flash_mock = self.PatchObject(flash, "Flash", autospec=True) | |
| def VerifyFlashParameters(self, device, image, **kwargs): | |
| """Verifies the arguments passed to flash.Flash(). | |
| This function helps verify that command line specifications are | |
| parsed properly and handed to flash.Flash() as expected. | |
| Args: | |
| device: expected device hostname; currently only SSH devices | |
| are supported. | |
| image: expected image parameter. | |
| **kwargs: keyword arguments expected in the call to flash.Flash(). | |
| Arguments unspecified here are checked against their default | |
| value for `cros flash`. | |
| """ | |
| flash_args, flash_kwargs = self.flash_mock.call_args | |
| self.assertEqual(device, flash_args[0].hostname) | |
| self.assertEqual(image, flash_args[1]) | |
| # `cros flash` default options. Must match the configuration in | |
| # AddParser(). | |
| expected_kwargs = { | |
| "board": None, | |
| "version": "latest", | |
| "no_minios_update": True, | |
| "no_rootfs_update": False, | |
| "no_stateful_update": False, | |
| "clobber_stateful": False, | |
| "clear_tpm_owner": False, | |
| "reboot": True, | |
| "ssh_private_key": None, | |
| "ping": True, | |
| "disable_rootfs_verification": False, | |
| "clear_cache": False, | |
| "yes": False, | |
| "force": False, | |
| "debug": False, | |
| "delta": False, | |
| "reboot_timeout": cros_flash.FlashCommand.DEFAULT_REBOOT_TIMEOUT, | |
| } | |
| # Overwrite defaults with any variations in this test. | |
| expected_kwargs.update(kwargs) | |
| self.assertDictEqual(expected_kwargs, flash_kwargs) | |
| def testDefaults(self): | |
| """Tests `cros flash` default values.""" | |
| self.SetupCommandMock([self.DEVICE, self.IMAGE]) | |
| self.cmd_mock.inst.Run() | |
| self.VerifyFlashParameters(self.DEVICE, self.IMAGE) | |
| def testDoesNotEnterChroot(self): | |
| """Test that cros flash doesn't enter the chroot.""" | |
| self.SetupCommandMock([self.DEVICE, self.IMAGE]) | |
| enter_chroot = self.PatchObject(commandline, "RunInsideChroot") | |
| self.cmd_mock.inst.Run() | |
| self.assertFalse(enter_chroot.called) | |
| def testFlashError(self): | |
| """Tests that FlashErrors are passed through.""" | |
| with self.OutputCapturer(): | |
| self.SetupCommandMock([self.DEVICE, self.IMAGE]) | |
| self.flash_mock.side_effect = flash.FlashError | |
| with self.assertRaises(flash.FlashError): | |
| self.cmd_mock.inst.Run() |