blob: 7790e8c2c8577a32a2ef70713c594f8dde540fe0 [file] [log] [blame]
# 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)