| # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import logging |
| from threading import Timer |
| |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.server.cros.faft.firmware_test import FirmwareTest |
| |
| |
| class firmware_FAFTSetup(FirmwareTest): |
| """This test checks the following FAFT hardware requirement: |
| - Warm reset |
| - Cold reset |
| - Recovery boot with USB stick |
| - USB stick is plugged into Servo board, not DUT |
| - Keyboard simulation |
| - No terminal opened on EC console |
| """ |
| version = 1 |
| |
| # Delay to ensure client is ready to read the key press. |
| KEY_PRESS_DELAY = 2 |
| |
| |
| def console_checker(self): |
| """Verify EC console is available if using Chrome EC.""" |
| if not self.check_ec_capability(suppress_warning=True): |
| # Not Chrome EC. Nothing to check. |
| return True |
| try: |
| self.ec.send_command("chan 0") |
| expected_output = ["Chip:\s+[^\r\n]*\r\n", |
| "RO:\s+[^\r\n]*\r\n", |
| "RW_?[AB]?:\s+[^\r\n]*\r\n", |
| "Build:\s+[^\r\n]*\r\n"] |
| self.ec.send_command_get_output("version", |
| expected_output) |
| self.ec.send_command("chan 0xffffffff") |
| return True |
| except: # pylint: disable=W0702 |
| logging.error("Cannot talk to EC console.") |
| logging.error( |
| "Please check there is no terminal opened on EC console.") |
| raise error.TestFail("Failed EC console check.") |
| |
| def base_keyboard_checker(self, press_action): |
| """Press key and check from DUT. |
| |
| Args: |
| press_action: A callable that would press the keys when called. |
| """ |
| result = True |
| # Stop UI so that key presses don't go to Chrome. |
| self.faft_client.system.run_shell_command("stop ui") |
| |
| # Press the keys |
| Timer(self.KEY_PRESS_DELAY, press_action).start() |
| |
| # Invoke client side script to monitor keystrokes |
| if not self.faft_client.system.check_keys([28, 29, 32]): |
| result = False |
| |
| # Turn UI back on |
| self.faft_client.system.run_shell_command("start ui") |
| return result |
| |
| def keyboard_checker(self): |
| """Press 'd', Ctrl, ENTER by servo and check from DUT.""" |
| |
| def keypress(): |
| self.servo.ctrl_d() |
| self.servo.enter_key() |
| |
| return self.base_keyboard_checker(keypress) |
| |
| def run_once(self): |
| logging.info("Check EC console is available and test warm reboot") |
| self.console_checker() |
| self.switcher.mode_aware_reboot() |
| |
| logging.info("Check test image is on USB stick and run recovery boot") |
| self.assert_test_image_in_usb_disk() |
| self.switcher.reboot_to_mode(to_mode='rec') |
| |
| self.check_state((self.checkers.crossystem_checker, |
| {'mainfw_type': 'recovery'})) |
| |
| logging.info("Check cold boot") |
| self.switcher.mode_aware_reboot(reboot_type='cold') |
| |
| if self.faft_config.fw_bypasser_type != 'ctrl_d_bypasser': |
| logging.info("Check keyboard simulation") |
| self.check_state(self.keyboard_checker) |
| else: |
| logging.info("Skip keyboard simulation on an embedded device") |