| # 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.firmware_test import FirmwareTest |
| from autotest_lib.server.cros import vboot_constants as vboot |
| |
| |
| class firmware_SoftwareSync(FirmwareTest): |
| """ |
| 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) |
| # In order to test software sync, it must be enabled. |
| self.clear_set_gbb_flags(vboot.GBB_FLAG_DISABLE_EC_SOFTWARE_SYNC, 0) |
| self.backup_firmware() |
| self.switcher.setup_mode('dev' if dev_mode else 'normal') |
| 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.firmware_screen) |
| self.servo.ctrl_d() |
| else: |
| time.sleep(self.faft_config.software_sync_update) |
| |
| def run_once(self): |
| logging.info("Corrupt EC firmware RW body.") |
| self.check_state((self.checkers.ec_act_copy_checker, 'RW')) |
| self.record_hash_and_corrupt() |
| self.sync_and_ec_reboot() |
| self.wait_software_sync_and_boot() |
| self.switcher.wait_for_client() |
| |
| logging.info("Expect EC in RW and RW is restored.") |
| self.check_state(self.software_sync_checker) |