1# Copyright (c) 2011 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 5import logging 6 7from autotest_lib.client.common_lib import error 8from autotest_lib.server.cros import vboot_constants as vboot 9from autotest_lib.server.cros.faft.firmware_test import ConnectionError 10from autotest_lib.server.cros.faft.firmware_test import FirmwareTest 11 12 13class firmware_InvalidUSB(FirmwareTest): 14 """ 15 Servo based booting an invalid USB image test. 16 17 This test requires a USB disk plugged-in, which contains a Chrome OS test 18 image (built by "build_image --test"). On runtime, this test corrupts the 19 USB image and tries to boot into it. A failure is expected. It then 20 restores the USB image and boots into it again. 21 """ 22 version = 1 23 24 def restore_usb(self): 25 """Restore the USB image. USB plugs/unplugs happen in this method.""" 26 self.servo.switch_usbkey('host') 27 usb_dev = self.servo.probe_host_usb_dev() 28 self.restore_usb_kernel(usb_dev) 29 30 def initialize(self, host, cmdline_args): 31 """Initialize the test""" 32 super(firmware_InvalidUSB, self).initialize(host, cmdline_args) 33 self.servo.switch_usbkey('host') 34 usb_dev = self.servo.probe_host_usb_dev() 35 self.assert_test_image_in_usb_disk(usb_dev) 36 self.corrupt_usb_kernel(usb_dev) 37 self.switcher.setup_mode('normal') 38 self.servo.switch_usbkey('dut') 39 40 def cleanup(self): 41 """Cleanup the test""" 42 try: 43 self.restore_usb() 44 except Exception as e: 45 logging.error("Caught exception: %s", str(e)) 46 super(firmware_InvalidUSB, self).cleanup() 47 48 def run_once(self): 49 """Main test logic""" 50 logging.info("Turn on the recovery boot. Remove and insert the" 51 "corrupted USB stick, a boot failure is expected." 52 "Restore the USB image and boot it again.") 53 self.check_state((self.checkers.crossystem_checker, { 54 'devsw_boot': '0', 55 'mainfw_type': 'normal', 56 })) 57 58 # Switch servo v4 (if present) as a SNK. Make sure USB key is bootable. 59 self.set_servo_v4_role_to_snk() 60 61 self.switcher.reboot_to_mode(to_mode='rec', wait_for_dut_up=False) 62 logging.info('Wait to ensure the USB image is unable to boot...') 63 try: 64 self.switcher.wait_for_client( 65 timeout=self.faft_config.usb_image_boot_timeout) 66 raise error.TestFail('Should not boot from the invalid USB image.') 67 except ConnectionError: 68 logging.info( 69 'The USB image is surely unable to boot. Restore it and try...') 70 71 self.restore_usb() 72 self.servo.switch_usbkey('dut') 73 self.switcher.wait_for_client() 74 75 logging.info("Expected to boot the restored USB image and reboot.") 76 self.check_state((self.checkers.crossystem_checker, { 77 'mainfw_type': 'recovery', 78 'recovery_reason': vboot.RECOVERY_REASON['RO_MANUAL'], 79 })) 80 self.switcher.mode_aware_reboot() 81 82 logging.info("Expected to normal boot and done.") 83 self.check_state((self.checkers.crossystem_checker, { 84 'devsw_boot': '0', 85 'mainfw_type': 'normal', 86 })) 87