# Copyright 2017 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 import time from autotest_lib.client.common_lib import error from autotest_lib.client.common_lib import utils from autotest_lib.server import autotest from autotest_lib.server.cros.faft.firmware_test import FirmwareTest class firmware_ConsecutiveLidSwitch(FirmwareTest): """ Servo based consecutive lid switch test. This test is intended to be run with many iterations to ensure that closing DUT lid triggers suspend and opening lid wakes it up. The iteration should be specified by the parameter -a "faft_iterations=10". Checking the boot_id ensures DUT won't reboot unexpectedly. """ version = 1 def initialize(self, host, cmdline_args): # Parse arguments from command line dict_args = utils.args_to_dict(cmdline_args) self.faft_iterations = int(dict_args.get('faft_iterations', 1)) super(firmware_ConsecutiveLidSwitch, self).initialize(host, cmdline_args) self.setup_usbkey(usbkey=False) def cleanup(self): # Restore the lid_open switch in case the test failed in the middle. try: self.servo.set('lid_open', 'yes') except Exception as e: logging.error("Caught exception: %s", str(e)) super(firmware_ConsecutiveLidSwitch, self).cleanup() def run_once(self, host): """Runs a single iteration of the test.""" # Login as a normal user and stay there. Closing lid at the login # screen may shut the machine down, that also verifies the lid switch # but take more time. Once logged in, closing lid triggers suspend. autotest_client = autotest.Autotest(host) autotest_client.run_test("desktopui_SimpleLogin", exit_without_logout=True) original_boot_id = host.get_boot_id() for i in range(self.faft_iterations): logging.info('======== Running FAFT ITERATION %d/%d ========', i + 1, self.faft_iterations) logging.info("Close lid to suspend.") self.servo.set('lid_open', 'no') logging.info("Expected going to suspend. Waiting DUT offline...") self.switcher.wait_for_client_offline() time.sleep(self.LID_DELAY) logging.info("Wake DUT by lid switch.") self.servo.set('lid_open', 'yes') logging.info("Expected going to resume. Waiting DUT online...") self.switcher.wait_for_client() time.sleep(self.LID_DELAY) boot_id = host.get_boot_id() if boot_id != original_boot_id: raise error.TestFail('Different boot_id. Unexpected reboot.')