# Copyright (c) 2020 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 common
from autotest_lib.server.cros.faft.firmware_test import FirmwareTest


class firmware_FAFTModeTransitions(FirmwareTest):
    """This test checks FAFT mode transitions work."""
    version = 1
    NEEDS_SERVO_USB = True

    def _checked_reboot(self, to_mode):
        """Reboots DUT to mode and checks that it has done so.

        @param to_mode: mode_switcher mode to reboot into
        @type to_mode: string

        @see: autotest_lib.server.cros.faft.utils.mode_switcher
        """
        self.switcher.reboot_to_mode(to_mode)
        self.check_state((self.checkers.mode_checker, to_mode))

    def run_once(self, mode_seq=[]):
        """Main test logic.

        @param mode_seq: A list of mode_switcher modes to transition through
        @type mode_seq: list of strings

        @see: autotest_lib.server.cros.faft.utils.mode_switcher
        """

        if len(mode_seq) < 2:
            raise ValueError("Not enough transitions to test: %s" % mode_seq)

        logging.info("Testing transition sequence: %s",  " -> ".join(mode_seq))

        if 'rec' in mode_seq:
            logging.info("Mode sequence contains 'rec', setup USB stick with"
                         " image.")
            self.setup_usbkey(usbkey=True)

        m1 = mode_seq[0]

        logging.info("Start in %s mode.", m1)
        self.switcher.setup_mode(m1)

        for m2 in mode_seq[1:]:
            logging.info("Checking mode transition: %s -> %s.", m1, m2)
            self._checked_reboot(m2)
            m1 = m2
