| # 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 |
| |
| 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.local_tarball = None |
| self.build = None |
| # find if "local_tarball" was given in the command line arguments. |
| for arg in cmdline_args: |
| match = re.search(r'^local_tarball=(.+)', arg) |
| if match: |
| self.local_tarball = match.group(1) |
| logging.info('Use local tarball %s', self.local_tarball) |
| break |
| else: |
| # Get the latest firmware release from the server. |
| # Even this test uses a fake EC image, it needs to download |
| # the release to get some subsidiary binary (like npcx_monitor.bin). |
| platform = self.faft_config.platform |
| |
| # Get the parent (a.k.a. reference board or baseboard), and hand it |
| # to get_latest_release_version so that it can use it in search as |
| # secondary candidate. For example, bob doesn't have its own release |
| # directory, but its parent, gru does. |
| parent = getattr(self.faft_config, 'parent', None) |
| |
| self.build = host.get_latest_release_version(platform, parent) |
| |
| if not self.build: |
| raise error.TestError( |
| 'Cannot locate the latest release for %s' % platform) |
| logging.info('Will use the build %s', self.build) |
| 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. |
| """ |
| |
| try: |
| host.firmware_install(build=self.build, |
| dest=self.resultsdir, |
| local_tarball=self.local_tarball, |
| install_ec=True, |
| install_bios=False, |
| corrupt_ec=True) |
| 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) |