def testRebootAndVerifyWithRootfsAndReboot(self): """Test RebootAndVerify if rootfs update and reboot are enabled.""" with remote_access.ChromiumOSDeviceHandler('1.1.1.1') as device: CrOS_AU = auto_updater.ChromiumOSFlashUpdater( device, self.payload_dir) CrOS_AU.RunUpdate() self.assertTrue( self.base_updater_mock.patched['RebootAndVerify'].called)
def testRebootAndVerifyWithoutReboot(self): """Test RebootAndVerify doesn't run if reboot is unenabled.""" with remote_access.ChromiumOSDeviceHandler('1.1.1.1') as device: CrOS_AU = auto_updater.ChromiumOSFlashUpdater(device, self.payload_dir, reboot=False) CrOS_AU.RunUpdate() self.assertFalse( self.base_updater_mock.patched['RebootAndVerify'].called)
def testNoPomptWithYes(self): """Test prompts won't be called if yes is set as True.""" with remote_access.ChromiumOSDeviceHandler('1.1.1.1') as device: CrOS_AU = auto_updater.ChromiumOSFlashUpdater(device, self.payload_dir, yes=True) self.PatchObject(cros_build_lib, 'BooleanPrompt') CrOS_AU.RunUpdate() self.assertFalse(cros_build_lib.BooleanPrompt.called)
def testCheckRestoreStateful(self): """Test whether CheckRestoreStateful is called in update process.""" precheck_mock = self.StartPatcher(ChromiumOSPreCheckMock()) with remote_access.ChromiumOSDeviceHandler('1.1.1.1') as device: CrOS_AU = auto_updater.ChromiumOSFlashUpdater( device, self.payload_dir) CrOS_AU.RunUpdate() self.assertTrue( precheck_mock.patched['CheckRestoreStateful'].called)
def testRestoreStateful(self): """Test RestoreStateful is called when it's required.""" with remote_access.ChromiumOSDeviceHandler('1.1.1.1') as device: CrOS_AU = auto_updater.ChromiumOSFlashUpdater( device, self.payload_dir) self.PatchObject(auto_updater.ChromiumOSFlashUpdater, 'CheckRestoreStateful', return_value=True) CrOS_AU.RunUpdate() self.assertTrue( self.base_updater_mock.patched['RestoreStateful'].called)
def testSetupRootfsUpdateError(self): """Test ChromiumOSFlashUpdater.SetupRootfsUpdate with raising exception. RootfsUpdateError is raised if it cannot get status from GetUpdateStatus. """ with remote_access.ChromiumOSDeviceHandler('1.1.1.1') as device: CrOS_AU = auto_updater.ChromiumOSFlashUpdater( device, self.payload_dir) self.PatchObject(auto_updater.ChromiumOSFlashUpdater, 'GetUpdateStatus', return_value=('cannot_update', )) self.assertRaises(auto_updater.RootfsUpdateError, CrOS_AU.RunUpdate)
def testCopyPythonFilesToTemp(self): """Test copy python files to temp directory.""" with mock.patch('shutil.copytree'), \ mock.patch('shutil.ignore_patterns') as m, \ remote_access.ChromiumOSDeviceHandler('1.1.1.1') as device: CrOS_AU = auto_updater.ChromiumOSFlashUpdater( device, self.payload_dir, do_rootfs_update=False) # pylint: disable=protected-access CrOS_AU._CopyPythonFilesToTemp('dir_src', 'dir_temp', extra_ignore_patterns=['bad_thing']) m.assert_called_with('*.pyc', 'tmp*', '.*', 'static', '*~', 'bad_thing')
def testCheckRestoreStatefulError(self): """Test CheckRestoreStateful fails with raising ChromiumOSUpdateError.""" with remote_access.ChromiumOSDeviceHandler('1.1.1.1') as device: CrOS_AU = auto_updater.ChromiumOSFlashUpdater( device, self.payload_dir) self.PatchObject(cros_build_lib, 'BooleanPrompt', return_value=False) self.PatchObject(auto_updater.ChromiumOSFlashUpdater, '_CanRunDevserver', return_value=False) self.assertRaises(auto_updater.ChromiumOSUpdateError, CrOS_AU.RunUpdate)
def testVerifyErrorWithRootDevEqualsNone(self): """Test RebootAndVerify fails with raising AutoUpdateVerifyError.""" with remote_access.ChromiumOSDeviceHandler('1.1.1.1') as device: CrOS_AU = auto_updater.ChromiumOSFlashUpdater( device, self.payload_dir, do_stateful_update=False) self.PatchObject(auto_updater.ChromiumOSFlashUpdater, 'SetupRootfsUpdate') self.PatchObject(auto_updater.ChromiumOSFlashUpdater, 'UpdateRootfs') self.PatchObject(auto_updater.ChromiumOSFlashUpdater, 'GetRootDev', return_value=None) self.assertRaises(auto_updater.AutoUpdateVerifyError, CrOS_AU.RunUpdate)
def Run(self): """Perform remote device update. The update process includes: 1. initialize a device instance for the given remote device. 2. achieve payload_dir which contains the required payloads for updating. 3. initialize an auto-updater instance to do RunUpdate(). 4. After auto-update, all temp files and dir will be cleaned up. """ try: device_connected = False with remote_access.ChromiumOSDeviceHandler( self.ssh_hostname, port=self.ssh_port, base_dir=self.DEVICE_BASE_DIR, private_key=self.ssh_private_key, ping=self.ping) as device: device_connected = True # Get payload directory payload_dir = self.GetPayloadDir(device) # Do auto-update chromeos_AU = auto_updater.ChromiumOSFlashUpdater( device, payload_dir, self.tempdir, do_rootfs_update=self.do_rootfs_update, do_stateful_update=self.do_stateful_update, reboot=self.reboot, disable_verification=self.disable_verification, clobber_stateful=self.clobber_stateful, yes=self.yes) chromeos_AU.CheckPayloads() chromeos_AU.RunUpdate() except Exception: logging.error('Device update failed.') if device_connected and device.lsb_release: lsb_entries = sorted(device.lsb_release.items()) logging.info( 'Following are the LSB version details of the device:\n%s', '\n'.join('%s=%s' % (k, v) for k, v in lsb_entries)) raise else: logging.notice('Update performed successfully.') finally: self.Cleanup()
def testRunStateful(self): """Test the update functions are called correctly. Only UpdateStateful is called for stateful update. """ with remote_access.ChromiumOSDeviceHandler('1.1.1.1') as device: CrOS_AU = auto_updater.ChromiumOSFlashUpdater( device, self.payload_dir, do_rootfs_update=False) CrOS_AU.RunUpdate() self.assertFalse( self.base_updater_mock.patched['SetupRootfsUpdate'].called) self.assertFalse( self.base_updater_mock.patched['UpdateRootfs'].called) self.assertTrue( self.base_updater_mock.patched['UpdateStateful'].called)
def testTransferForRootfs(self): """Test transfer functions for rootfs update. When rootfs update is enabled, Devserver and rootfs update payload are transferred. Stateful update payload is not. """ with remote_access.ChromiumOSDeviceHandler('1.1.1.1') as device: CrOS_AU = auto_updater.ChromiumOSFlashUpdater( device, self.payload_dir, do_stateful_update=False) CrOS_AU.RunUpdate() self.assertTrue( self.transfer_mock.patched['TransferDevServerPackage'].called) self.assertTrue( self.transfer_mock.patched['TransferRootfsUpdate'].called) self.assertFalse( self.transfer_mock.patched['TransferStatefulUpdate'].called)
def testNoVerifyError(self): """Test RebootAndVerify won't raise any error when unable do_rootfs_update. If do_rootfs_update is unabled, verify logic won't be touched, which means no AutoUpdateVerifyError will be thrown. """ with remote_access.ChromiumOSDeviceHandler('1.1.1.1') as device: CrOS_AU = auto_updater.ChromiumOSFlashUpdater( device, self.payload_dir, do_rootfs_update=False) self.PatchObject(remote_access.ChromiumOSDevice, 'RunCommand') self.PatchObject(auto_updater.ChromiumOSFlashUpdater, 'GetRootDev', return_value=None) try: CrOS_AU.RunUpdate() except auto_updater.AutoUpdateVerifyError: self.fail('RunUpdate raise AutoUpdateVerifyError.')
def testRootfsUpdateDevServerError(self): """Test ChromiumOSFlashUpdater.UpdateRootfs with raising exception. RootfsUpdateError is raised if devserver cannot start. """ with remote_access.ChromiumOSDeviceHandler('1.1.1.1') as device: CrOS_AU = auto_updater.ChromiumOSFlashUpdater( device, self.payload_dir) self.prepareRootfsUpdate() self.PatchObject( dev_server_wrapper.RemoteDevServerWrapper, 'Start', side_effect=dev_server_wrapper.DevServerException()) self.PatchObject(auto_updater.ChromiumOSFlashUpdater, 'RevertBootPartition') with mock.patch('os.path.join', return_value=''): self.assertRaises(auto_updater.RootfsUpdateError, CrOS_AU.RunUpdate)
def testStatefulUpdateCmdError(self): """Test ChromiumOSFlashUpdater.UpdateStateful with raising exception. StatefulUpdateError is raised if device fails to run stateful update command 'stateful_update ...'. """ with remote_access.ChromiumOSDeviceHandler('1.1.1.1') as device: CrOS_AU = auto_updater.ChromiumOSFlashUpdater( device, self.payload_dir, do_rootfs_update=False) self.PatchObject(remote_access.ChromiumOSDevice, 'RunCommand', side_effect=cros_build_lib.RunCommandError( 'fail', '')) self.PatchObject(auto_updater.ChromiumOSFlashUpdater, 'ResetStatefulPartition') with mock.patch('os.path.join', return_value=''): self.assertRaises(auto_updater.StatefulUpdateError, CrOS_AU.RunUpdate)
def testRestoreStatefulError(self): """Test ChromiumOSFlashUpdater.RestoreStateful with raising exception. Devserver still cannot run after restoring stateful partition will lead to ChromiumOSUpdateError. """ with remote_access.ChromiumOSDeviceHandler('1.1.1.1') as device: CrOS_AU = auto_updater.ChromiumOSFlashUpdater( device, self.payload_dir) self.PatchObject(auto_updater.ChromiumOSFlashUpdater, 'RunUpdateStateful') self.PatchObject(auto_updater.ChromiumOSFlashUpdater, 'CheckRestoreStateful', return_value=True) self.PatchObject(auto_updater.ChromiumOSFlashUpdater, '_CanRunDevserver', return_value=False) self.assertRaises(auto_updater.ChromiumOSUpdateError, CrOS_AU.RunUpdate)
def testRootfsUpdateTrackError(self): """Test ChromiumOSFlashUpdater.UpdateRootfs with raising exception. RootfsUpdateError is raised if it fails to track device's status by GetUpdateStatus. """ with remote_access.ChromiumOSDeviceHandler('1.1.1.1') as device: CrOS_AU = auto_updater.ChromiumOSFlashUpdater( device, self.payload_dir) self.prepareRootfsUpdate() self.PatchObject(dev_server_wrapper.DevServerWrapper, 'Start') self.PatchObject(dev_server_wrapper.DevServerWrapper, 'GetDevServerURL') self.PatchObject(remote_access.ChromiumOSDevice, 'RunCommand') self.PatchObject( auto_updater.ChromiumOSFlashUpdater, 'GetUpdateStatus', side_effect=ValueError('Cannot get update status')) with mock.patch('os.path.join', return_value=''): self.assertRaises(auto_updater.RootfsUpdateError, CrOS_AU.RunUpdate)
def testRootfsUpdateCmdError(self): """Test ChromiumOSFlashUpdater.UpdateRootfs with raising exception. RootfsUpdateError is raised if device fails to run rootfs update command 'update_engine_client ...'. """ with remote_access.ChromiumOSDeviceHandler('1.1.1.1') as device: CrOS_AU = auto_updater.ChromiumOSFlashUpdater( device, self.payload_dir) self.prepareRootfsUpdate() self.PatchObject(dev_server_wrapper.DevServerWrapper, 'Start') self.PatchObject(dev_server_wrapper.DevServerWrapper, 'GetDevServerURL') self.PatchObject(remote_access.ChromiumOSDevice, 'RunCommand', side_effect=cros_build_lib.RunCommandError( 'fail', '')) self.PatchObject(auto_updater.ChromiumOSFlashUpdater, 'RevertBootPartition') with mock.patch('os.path.join', return_value=''): self.assertRaises(auto_updater.RootfsUpdateError, CrOS_AU.RunUpdate)