Home | History | Annotate | Download | only in firmware_LegacyRecovery
      1 # Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import logging
      6 
      7 from autotest_lib.client.common_lib import error
      8 from autotest_lib.server.cros import vboot_constants as vboot
      9 from autotest_lib.server.cros.faft.firmware_test import ConnectionError
     10 from autotest_lib.server.cros.faft.firmware_test import FirmwareTest
     11 
     12 
     13 class firmware_LegacyRecovery(FirmwareTest):
     14     """
     15     Servo based test to Verify recovery request at Remove Screen.
     16 
     17     This test requires a USB disk plugged-in, which contains a Chrome OS test
     18     image (built by "build_image --test"). It recovery boots to the USB image
     19     and sets recovery_request=1 and do a reboot. A failure is expected.
     20     """
     21     version = 1
     22 
     23     def initialize(self, host, cmdline_args):
     24         super(firmware_LegacyRecovery, self).initialize(host, cmdline_args)
     25         self.setup_usbkey(usbkey=True, host=False)
     26         self.switcher.setup_mode('normal')
     27 
     28     def cleanup(self):
     29         super(firmware_LegacyRecovery, self).cleanup()
     30 
     31     def run_once(self):
     32         logging.info("Turn on the recovery boot. Enable recovery request "
     33                      "and perform a reboot.")
     34         self.check_state((self.checkers.crossystem_checker, {
     35                            'devsw_boot': '0',
     36                            'mainfw_type': 'normal',
     37                            }))
     38         self.faft_client.system.request_recovery_boot()
     39         self.switcher.mode_aware_reboot(wait_for_dut_up=False)
     40         self.switcher.bypass_rec_mode()
     41         try:
     42             self.switcher.wait_for_client()
     43         except ConnectionError:
     44             raise error.TestError('Failed to boot the USB image.')
     45         self.faft_client.system.run_shell_command(
     46                                    'crossystem recovery_request=1')
     47 
     48         logging.info("Wait to ensure no recovery boot at remove screen "
     49                      "and a boot failure is expected. "
     50                      "Unplug and plug USB, try to boot it again.")
     51         self.check_state((self.checkers.crossystem_checker, {
     52                            'mainfw_type': 'recovery',
     53                            }))
     54         self.switcher.mode_aware_reboot(wait_for_dut_up=False)
     55         logging.info('Wait to ensure DUT doesnt Boot on USB at Remove screen.')
     56         try:
     57             self.switcher.wait_for_client()
     58             raise error.TestFail('Unexpected USB boot at Remove Screen.')
     59         except ConnectionError:
     60             logging.info('Done, Waited till timeout and no USB boot occured.')
     61         self.switcher.bypass_rec_mode()
     62         self.switcher.wait_for_client()
     63 
     64         logging.info("Expected to boot the restored USB image and reboot.")
     65         self.check_state((self.checkers.crossystem_checker, {
     66                            'mainfw_type': 'recovery',
     67                            'recovery_reason': vboot.RECOVERY_REASON['LEGACY'],
     68                            }))
     69         self.switcher.mode_aware_reboot()
     70 
     71         logging.info("Expected to normal boot and done.")
     72         self.check_state((self.checkers.crossystem_checker, {
     73                            'devsw_boot': '0',
     74                            'mainfw_type': 'normal',
     75                            }))
     76