# Copyright 2015 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 autotest_lib.client.common_lib import error
from autotest_lib.server.cros.faft.firmware_test import FirmwareTest


class firmware_ECKeyboardReboot(FirmwareTest):
    """
    Test the dut-control ec_uart_cmd:reboot command.
    This simulate the Power+refresh reboot but not exactly.  The F3 + power EC
    reset is triggered by the Silego IC, and it taps directly into the KB row
    column lines to check the trigger (requires physical presence).

    see test case: 1.3.8 Power+refresh; System reboots
    https://testtracker.googleplex.com/efforts/testcase/detail/721602
    """
    version = 1

    # Delay between commands
    CMD_DELAY = 1

    def initialize(self, host, cmdline_args):
        super(firmware_ECKeyboardReboot, self).initialize(host, cmdline_args)
        # Only run in normal mode
        self.switcher.setup_mode('normal')
        self.host = host

    def confirm_dut_off(self):
        """Confirms the DUT is off."""
        if not self.host.ping_wait_down(timeout=10):
          raise error.TestFail('DUT is on, expected off')
        logging.info('DUT is off as expected')

    def confirm_dut_on(self):
        """Confirms the DUT is on."""
        if not self.host.wait_up(timeout=60):
          raise error.TestFail('DUT is off, expected on')
        logging.info('DUT is on as expected')

    def run_once(self):
        """Runs a single iteration of the test."""
        if not self.check_ec_capability(['keyboard']):
          raise error.TestNAError("Nothing needs to be tested on this device")
        logging.info("Test dut-control ec_uart_cmd:reboot command.")

        self.ec.reboot()
        self.confirm_dut_off()
        self.confirm_dut_on()

        self.ec.reboot('hard')
        self.confirm_dut_off()
        self.confirm_dut_on()

        self.ec.reboot('ap-off')
        self.confirm_dut_off()
        self.ec.reboot()
        self.confirm_dut_on()
