# Copyright 2014 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.

from autotest_lib.server.cros.faft.firmware_test import FirmwareTest


class firmware_FWtries(FirmwareTest):
    """
    Boot with firmware B until fwb_tries/fw_try_count counts down to
    0.  vboot1 only needs to set fwb_tries in order to boot into FWB,
    but vboot2 needs to set two fields: fw_try_next and fw_try_count
    in order to do so.

    Setup Steps:
    1. Make the device in normal/dev mode.

    Test Steps:
    2. Set # of tries to 2 (through try_fwb)
      a.  For vboot1:
        set fwb_tries=2
        [fwb_tries can be > 0 and <= 15. Value will be auto reset to 15 If
        the value is < 0 or > 15
      b.  For vboot2:
        set fw_try_next=B fw_try_count=2
    3. Reboot 1
    4. Reboot 2
    5. Reboot 3

    Verification Steps:
    1. After reboot 1, fw_tries_checker checks that
    mainfw_act = B
    fwb_tries/fw_try_count = 1

    2. After reboot 2, fw_tries_checker checks that
    mainfw_act = B
    fwb_tries/fw_try_count = 0

    3. After reboot 3, fw_tries_checker
    mainfw_act = A
    fwb_tries/fw_try_count = 0
    """

    version = 1

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

    def run_once(self, host):
        """Runs a single iteration of the test."""
        self.check_state((self.checkers.fw_tries_checker, ('A', True, 0)))

        self.try_fwb(2);

        self.check_state((self.checkers.fw_tries_checker, ('A', True, 2)))
        self.switcher.mode_aware_reboot()

        # ChromeOS: Blocks init file on bootup from setting try_count to 0
        # Thus, each reboot is never successful, thus when try_count
        # decrements to 0, will reboot into FW A due to failure
        self.check_state((self.checkers.fw_tries_checker, ('B', True, 1)))
        self.switcher.mode_aware_reboot()
        self.check_state((self.checkers.fw_tries_checker, ('B', True, 0)))
        self.switcher.mode_aware_reboot()
        self.check_state((self.checkers.fw_tries_checker, ('A', True, 0)))
