1394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam# Copyright (c) 2011 The Chromium OS Authors. All rights reserved. 2394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam# Use of this source code is governed by a BSD-style license that can be 3394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam# found in the LICENSE file. 4394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam 5394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tamimport logging 6394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam 7892e2f55ceaf7c7486a6f0e4db37aecb6bf81374Tom Wai-Hong Tamfrom autotest_lib.client.common_lib import error 86ec46e3ef11a31c23917e1c1b8a661bb39949cefTom Wai-Hong Tamfrom autotest_lib.server.cros import vboot_constants as vboot 9a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinallyfrom autotest_lib.server.cros.faft.firmware_test import ConnectionError 10a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinallyfrom autotest_lib.server.cros.faft.firmware_test import FirmwareTest 11394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam 12394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam 13a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinallyclass firmware_InvalidUSB(FirmwareTest): 14394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam """ 15394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam Servo based booting an invalid USB image test. 16394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam 17394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam This test requires a USB disk plugged-in, which contains a Chrome OS test 18394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam image (built by "build_image --test"). On runtime, this test corrupts the 19394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam USB image and tries to boot into it. A failure is expected. It then 20394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam restores the USB image and boots into it again. 21394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam """ 22394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam version = 1 23394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam 24394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam def restore_usb(self): 25394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam """Restore the USB image. USB plugs/unplugs happen in this method.""" 26e7bd9369b76e2bbdc230c3c1aeb9afc6e6ec60baVadim Bendebury self.servo.switch_usbkey('host') 27394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam usb_dev = self.servo.probe_host_usb_dev() 28394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam self.restore_usb_kernel(usb_dev) 29394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam 301f115ae9ee3c043e9577e7ce9872dc99323fdcb3Yusuf Mohsinally def initialize(self, host, cmdline_args): 311f115ae9ee3c043e9577e7ce9872dc99323fdcb3Yusuf Mohsinally super(firmware_InvalidUSB, self).initialize(host, cmdline_args) 32e7bd9369b76e2bbdc230c3c1aeb9afc6e6ec60baVadim Bendebury self.servo.switch_usbkey('host') 3391f49826afdd60e2c7bbbd356f5455fd78511674Tom Wai-Hong Tam usb_dev = self.servo.probe_host_usb_dev() 3491f49826afdd60e2c7bbbd356f5455fd78511674Tom Wai-Hong Tam self.assert_test_image_in_usb_disk(usb_dev) 3591f49826afdd60e2c7bbbd356f5455fd78511674Tom Wai-Hong Tam self.corrupt_usb_kernel(usb_dev) 360cc9a4fe28f221cfc73bb35c30fa79338c4b43f1Tom Wai-Hong Tam self.switcher.setup_mode('normal') 37e7bd9369b76e2bbdc230c3c1aeb9afc6e6ec60baVadim Bendebury self.servo.switch_usbkey('dut') 38394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam 39394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam def cleanup(self): 40394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam self.restore_usb() 41394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam super(firmware_InvalidUSB, self).cleanup() 42394965ab46b1ade5de781c0036fa9d9570a88824Tom Wai-Hong Tam 43b09a04183cf7017eb4b30ad28f5f81f1204c36b3Vic Yang def run_once(self): 44a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally logging.info("Turn on the recovery boot. Remove and insert the" 45a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally "corrupted USB stick, a boot failure is expected." 46a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally "Restore the USB image and boot it again.") 47a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally self.check_state((self.checkers.crossystem_checker, { 48a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally 'devsw_boot': '0', 49a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally 'mainfw_type': 'normal', 50a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally })) 5150e8be3f0a555aaba9cde13a2412d2560fdbd354Tom Wai-Hong Tam self.switcher.reboot_to_mode(to_mode='rec', wait_for_dut_up=False) 52a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally logging.info('Wait to ensure the USB image is unable to boot...') 53a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally try: 5419bfb6ea468c34e1b44842033eb784c2ef3eed42Tom Wai-Hong Tam self.switcher.wait_for_client() 55a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally raise error.TestFail('Should not boot from the invalid USB image.') 56a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally except ConnectionError: 57a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally logging.info( 58a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally 'The USB image is surely unable to boot. Restore it and try...') 59a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally 60a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally self.restore_usb() 61a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally self.servo.switch_usbkey('dut') 6219bfb6ea468c34e1b44842033eb784c2ef3eed42Tom Wai-Hong Tam self.switcher.wait_for_client() 63a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally 64a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally logging.info("Expected to boot the restored USB image and reboot.") 65a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally self.check_state((self.checkers.crossystem_checker, { 66a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally 'mainfw_type': 'recovery', 6750e8be3f0a555aaba9cde13a2412d2560fdbd354Tom Wai-Hong Tam 'recovery_reason': vboot.RECOVERY_REASON['RO_MANUAL'], 68a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally })) 694777624b69b3b223a5d3c3abe86000783f6c0e96Tom Wai-Hong Tam self.switcher.mode_aware_reboot() 70a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally 71a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally logging.info("Expected to normal boot and done.") 72a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally self.check_state((self.checkers.crossystem_checker, { 73a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally 'devsw_boot': '0', 74a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally 'mainfw_type': 'normal', 75a7da6ce6053769e1e25d3f0c25c861cded6964f3Yusuf Mohsinally })) 76