# Copyright (c) 2013 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 from autotest_lib.client.common_lib import error from autotest_lib.server.cros import vboot_constants as vboot from autotest_lib.server.cros.faft.firmware_test import ConnectionError from autotest_lib.server.cros.faft.firmware_test import FirmwareTest class firmware_LegacyRecovery(FirmwareTest): """ Servo based test to Verify recovery request at Remove Screen. This test requires a USB disk plugged-in, which contains a ChromeOS test image (built by "build_image --test"). It recovery boots to the USB image and sets recovery_request=1 and do a reboot. A failure is expected. """ version = 1 NEEDS_SERVO_USB = True def initialize(self, host, cmdline_args): super(firmware_LegacyRecovery, self).initialize(host, cmdline_args) self.setup_usbkey(usbkey=True, host=False) self.switcher.setup_mode('normal') def cleanup(self): super(firmware_LegacyRecovery, self).cleanup() def run_once(self): """Runs a single iteration of the test.""" logging.info("Turn on the recovery boot. Enable recovery request " "and perform a reboot.") self.check_state((self.checkers.crossystem_checker, { 'devsw_boot': '0', 'mainfw_type': 'normal', })) self.faft_client.system.request_recovery_boot() self.switcher.simple_reboot() self.switcher.bypass_rec_mode() try: self.switcher.wait_for_client() except ConnectionError: raise error.TestError('Failed to boot the USB image.') self.faft_client.system.run_shell_command( 'crossystem recovery_request=1') logging.info("Wait to ensure no recovery boot at remove screen " "and a boot failure is expected. " "Unplug and plug USB, try to boot it again.") self.check_state((self.checkers.crossystem_checker, { 'mainfw_type': 'recovery', })) self.switcher.mode_aware_reboot(wait_for_dut_up=False) logging.info('Wait to ensure DUT doesnt Boot on USB at Remove screen.') try: self.switcher.wait_for_client(timeout=self.faft_config.usb_image_boot_timeout) raise error.TestFail('Unexpected USB boot at Remove Screen.') except ConnectionError: logging.info('Done, Waited till timeout and no USB boot occured.') self.switcher.bypass_rec_mode() self.switcher.wait_for_client() logging.info("Expected to boot the restored USB image and reboot.") self.check_state((self.checkers.crossystem_checker, { 'mainfw_type': 'recovery', 'recovery_reason': vboot.RECOVERY_REASON['LEGACY'], })) self.switcher.mode_aware_reboot() logging.info("Expected to normal boot and done.") self.check_state((self.checkers.crossystem_checker, { 'devsw_boot': '0', 'mainfw_type': 'normal', }))