Home | History | Annotate | Download | only in firmware_FAFTSetup
      1 # Copyright (c) 2012 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 from threading import Timer
      7 
      8 from autotest_lib.client.common_lib import error
      9 from autotest_lib.server.cros.faft.firmware_test import FirmwareTest
     10 
     11 
     12 class firmware_FAFTSetup(FirmwareTest):
     13     """This test checks the following FAFT hardware requirement:
     14       - Warm reset
     15       - Cold reset
     16       - Recovery boot with USB stick
     17       - USB stick is plugged into Servo board, not DUT
     18       - Keyboard simulation
     19       - No terminal opened on EC console
     20     """
     21     version = 1
     22 
     23     # Delay to ensure client is ready to read the key press.
     24     KEY_PRESS_DELAY = 2
     25 
     26 
     27     def console_checker(self):
     28         """Verify EC console is available if using Chrome EC."""
     29         if not self.check_ec_capability(suppress_warning=True):
     30             # Not Chrome EC. Nothing to check.
     31             return True
     32         try:
     33             self.ec.send_command("chan 0")
     34             expected_output = ["Chip:\s+[^\r\n]*\r\n",
     35                                "RO:\s+[^\r\n]*\r\n",
     36                                "RW:\s+[^\r\n]*\r\n",
     37                                "Build:\s+[^\r\n]*\r\n"]
     38             self.ec.send_command_get_output("version",
     39                                             expected_output)
     40             self.ec.send_command("chan 0xffffffff")
     41             return True
     42         except: # pylint: disable=W0702
     43             logging.error("Cannot talk to EC console.")
     44             logging.error(
     45                     "Please check there is no terminal opened on EC console.")
     46             raise error.TestFail("Failed EC console check.")
     47 
     48     def base_keyboard_checker(self, press_action):
     49         """Press key and check from DUT.
     50 
     51         Args:
     52             press_action: A callable that would press the keys when called.
     53         """
     54         result = True
     55         # Stop UI so that key presses don't go to Chrome.
     56         self.faft_client.system.run_shell_command("stop ui")
     57 
     58         # Press the keys
     59         Timer(self.KEY_PRESS_DELAY, press_action).start()
     60 
     61         # Invoke client side script to monitor keystrokes
     62         if not self.faft_client.system.check_keys([28, 29, 32]):
     63             result = False
     64 
     65         # Turn UI back on
     66         self.faft_client.system.run_shell_command("start ui")
     67         return result
     68 
     69     def keyboard_checker(self):
     70         """Press 'd', Ctrl, ENTER by servo and check from DUT."""
     71 
     72         def keypress():
     73             self.servo.ctrl_d()
     74             self.servo.enter_key()
     75 
     76         return self.base_keyboard_checker(keypress)
     77 
     78     def run_once(self):
     79         logging.info("Check EC console is available and test warm reboot")
     80         self.console_checker()
     81         self.switcher.mode_aware_reboot()
     82 
     83         logging.info("Check test image is on USB stick and run recovery boot")
     84         self.assert_test_image_in_usb_disk()
     85         self.switcher.reboot_to_mode(to_mode='rec')
     86 
     87         self.check_state((self.checkers.crossystem_checker,
     88                           {'mainfw_type': 'recovery'}))
     89 
     90         logging.info("Check cold boot")
     91         self.switcher.mode_aware_reboot(reboot_type='cold')
     92 
     93         if self.faft_config.fw_bypasser_type != 'ctrl_d_bypasser':
     94             logging.info("Check keyboard simulation")
     95             self.check_state(self.keyboard_checker)
     96         else:
     97             logging.info("Skip keyboard simulation on an embedded device")
     98