# Copyright 2020 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. """The autotest performing FW update, both EC and AP in CCD mode.""" import logging import re from autotest_lib.client.common_lib import error from autotest_lib.server.cros.faft.firmware_test import FirmwareTest class firmware_ECRestoreFW(FirmwareTest): """A test that restores a machine from an incrrect FW to backup.""" version = 1 # A set of fake board candidates per ec type. FAKE_BOARD_DICT = {'npcx':['coral', 'reef'], 'stm32':['samus', 'nami'], 'it83':['dragonegg', 'waddledee']} def initialize(self, host, cmdline_args, full_args): """Initialize the test and pick a fake board to use for corruption. """ super(firmware_ECRestoreFW, self).initialize(host, cmdline_args, full_args) # Don't bother if there is no Chrome EC. if not self.check_ec_capability(): raise error.TestNAError('Nothing needs to be tested on this device') self.board_as = None # find if "board_as" was given in the command line arguments. for arg in cmdline_args: match = re.search(r'^board_as=(.+)', arg) if match: self.board_as = match.group(1) break else: # if "board_as" was not given, then pick one from FAKE_BOARD_DICT. ec_chip = self.servo.get('ec_chip') if 'stm32' in ec_chip: ec_type = 'stm32' elif 'it83' in ec_chip: ec_type = 'it83' else: ec_type = 'npcx' for board in self.FAKE_BOARD_DICT[ec_type]: if board not in self.faft_config.platform: self.board_as = board break if not self.board_as: raise error.TestError('fake board is not selected.') logging.info('A fake board to use for corruption: %s', self.board_as) self.backup_firmware() def cleanup(self): """The method called by the control file to start the test. Raises: TestFail: if the firmware restoration fails. """ try: if self.is_firmware_saved(): self.restore_firmware() except Exception as e: raise error.TestFail('FW Restoration failed: %s' % str(e)) finally: super(firmware_ECRestoreFW, self).cleanup() def run_once(self, host): """The method called by the control file to start the test. Args: host: a CrosHost object of the machine to update. """ logging.info('Downloading a firmware of %s', self.board_as) value = host.get_latest_release_version(self.board_as) if not value: raise error.TestError('Cannot locate the latest release for %s' % self.board_as) try: host.firmware_install(build=value, dest=self.resultsdir, install_ec=True, install_bios=False, board_as=self.board_as) except error.TestError as e: # It failed before the test attempts to install firmware. # It could be either devserver timeout or servo device error. # Let this test fail in those cases. raise e except Exception as e: # Nothing can be guaranteed with the firmware corruption with wrong # firmware. Let's not this test fail for that. logging.info('Caught an exception: %s', e)