blob: 6ef73b3702ad2987f85950284e75c22217d8d416 [file] [log] [blame]
# 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.
from autotest_lib.server.cros import vboot_constants as vboot
from autotest_lib.server.cros.faftsequence import FAFTSequence
class firmware_RollbackFirmware(FAFTSequence):
"""
Servo based firmware rollback test.
This test requires a USB disk plugged-in, which contains a Chrome OS test
image (built by "build_image --test"). On runtime, this test rollbacks
firmware A and results firmware B boot. It then rollbacks firmware B and
results recovery boot.
"""
version = 1
def setup(self, dev_mode=False):
super(firmware_RollbackFirmware, self).setup()
self.backup_firmware()
self.setup_dev_mode(dev_mode)
self.setup_usbkey(usbkey=True, host=False)
def cleanup(self):
self.restore_firmware()
super(firmware_RollbackFirmware, self).cleanup()
def run_once(self, dev_mode=False):
# Recovery reason RW_FW_ROLLBACK available after Alex/ZGB.
if self.faft_client.system.get_platform_name() in (
'Mario', 'Alex', 'ZGB'):
recovery_reason = vboot.RECOVERY_REASON['RO_INVALID_RW']
else:
recovery_reason = vboot.RECOVERY_REASON['RW_FW_ROLLBACK']
self.register_faft_sequence((
{ # Step 1, rollbacks firmware A.
'state_checker': (self.checkers.crossystem_checker, {
'mainfw_act': 'A',
'mainfw_type': 'developer' if dev_mode else 'normal',
'tried_fwb': '0',
}),
'userspace_action':
(self.faft_client.bios.move_version_backward, 'a'),
},
{ # Step 2, expected firmware B boot and rollbacks firmware B.
'state_checker': (self.checkers.crossystem_checker, {
'mainfw_act': 'B',
'mainfw_type': ('normal', 'developer'),
'tried_fwb': '0',
}),
'userspace_action':
(self.faft_client.bios.move_version_backward, 'b'),
'firmware_action': None if dev_mode else
self.wait_fw_screen_and_plug_usb,
'install_deps_after_boot': True,
},
{ # Step 3, expected recovery boot and restores firmware A and B.
'state_checker': (self.checkers.crossystem_checker, {
'mainfw_type': 'recovery',
'recovery_reason' : recovery_reason,
}),
'userspace_action': (
self.faft_client.bios.move_version_forward,
(('a', 'b'),)),
},
{ # Step 4, expected firmware A boot and done.
'state_checker': (self.checkers.crossystem_checker, {
'mainfw_act': 'A',
'mainfw_type': 'developer' if dev_mode else 'normal',
'tried_fwb': '0',
}),
},
))
self.run_faft_sequence()