| # Copyright (c) 2012 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 logging |
| import time |
| |
| from autotest_lib.server.cros.faft.faft_classes import FAFTSequence |
| |
| |
| class firmware_SoftwareSync(FAFTSequence): |
| """ |
| Servo based EC software sync test. |
| """ |
| version = 1 |
| |
| |
| def initialize(self, host, cmdline_args, dev_mode=False): |
| # This test tries to corrupt EC firmware. Should disable EC WP. |
| super(firmware_SoftwareSync, self).initialize(host, cmdline_args, |
| ec_wp=False) |
| self.backup_firmware() |
| self.setup_dev_mode(dev_mode) |
| self.setup_usbkey(usbkey=False) |
| self.setup_rw_boot() |
| self.dev_mode = dev_mode |
| |
| |
| def cleanup(self): |
| self.restore_firmware() |
| super(firmware_SoftwareSync, self).cleanup() |
| |
| |
| def record_hash_and_corrupt(self): |
| """Record current EC hash and corrupt EC firmware.""" |
| self._ec_hash = self.faft_client.ec.get_firmware_sha() |
| logging.info("Stored EC hash: %s", self._ec_hash) |
| self.faft_client.ec.corrupt_body('rw') |
| |
| |
| def software_sync_checker(self): |
| """Check EC firmware is restored by software sync.""" |
| ec_hash = self.faft_client.ec.get_firmware_sha() |
| logging.info("Current EC hash: %s", self._ec_hash) |
| if self._ec_hash != ec_hash: |
| return False |
| return self.checkers.ec_act_copy_checker('RW') |
| |
| |
| def wait_software_sync_and_boot(self): |
| """Wait for software sync to update EC.""" |
| if self.dev_mode: |
| time.sleep(self.faft_config.software_sync_update + |
| self.faft_config.dev_screen) |
| self.press_ctrl_d() |
| else: |
| time.sleep(self.faft_config.software_sync_update) |
| |
| |
| def run_once(self): |
| self.register_faft_sequence(( |
| { # Step 1, Corrupt EC firmware RW body |
| 'state_checker': (self.checkers.ec_act_copy_checker, 'RW'), |
| 'userspace_action': self.record_hash_and_corrupt, |
| 'firmware_action': self.wait_software_sync_and_boot, |
| 'reboot_action': self.sync_and_ec_reboot, |
| }, |
| { # Step 2, expect EC in RW and RW is restored |
| 'state_checker': self.software_sync_checker, |
| 'firmware_action': self.wait_software_sync_and_boot, |
| }, |
| )) |
| self.run_faft_sequence() |