# Copyright (c) 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_FastbootReboot(FirmwareTest):
    """
    Reboot testing through Fastboot.
    Testing:
      fastboot reboot
      fastboot reboot-bootloader

    This needs to be only enabled for Android tests.
    """
    version = 1

    def initialize(self, host, cmdline_args, dev_mode=False):
        super(firmware_FastbootReboot, self).initialize(host, cmdline_args)
        self.switcher.setup_mode('dev' if dev_mode else 'normal')

    def in_fastboot_mode(self):
        """Makes sure that we're in fastboot mode."""
        result = self.faft_client.Host.RunShellCommandGetOutput(
            'fastboot devices')
        if not result:
            return False
        else:
            return True

    def run_once(self, dev_mode=False):
        """Runs a single iteration of the test."""
        if not self.faft_client.System.HasHost():
            raise error.TestNAError('DUT is not Android device.  Skipping test')

        self.faft_client.Host.RunShellCommand('adb reboot bootloader')
        # make sure that DUT goes offline first
        self.switcher.wait_for_client_offline()
        self.switcher.wait_for_client_fastboot()

        if not self.in_fastboot_mode():
            raise error.TestFail("DUT not in fastboot mode!")

        # try rebooting into OS
        logging.info("Testing fastboot reboot")
        self.faft_client.Host.RunShellCommand('fastboot reboot')
        # make sure that DUT goes offline first
        self.switcher.wait_for_client_offline()
        self.switcher.wait_for_client()

        # now reboot into fastboot again
        self.faft_client.Host.RunShellCommand('adb reboot bootloader')
        # make sure that DUT goes offline first
        self.switcher.wait_for_client_offline()
        self.switcher.wait_for_client_fastboot()
        if not self.in_fastboot_mode():
            raise error.TestFail("DUT not in fastboot mode!")

        logging.info("Testing fastboot reboot-bootloader")
        self.faft_client.Host.RunShellCommand('fastboot reboot-bootloader')
        # make sure that DUT goes offline first
        self.switcher.wait_for_client_offline()
        self.switcher.wait_for_client_fastboot()
        if not self.in_fastboot_mode():
            raise error.TestFail("DUT not in fastboot mode!")

        self.faft_client.Host.RunShellCommand('fastboot continue')
        self.switcher.wait_for_client()
