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