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


class firmware_TryFwB(FirmwareTest):
    """
    Servo based RW firmware B boot test.
    """
    version = 1

    def initialize(self, host, cmdline_args, dev_mode=False, ec_wp=None):
        super(firmware_TryFwB, self).initialize(host, cmdline_args, ec_wp=ec_wp)
        self.setup_dev_mode(dev_mode)
        self.setup_usbkey(usbkey=False)
        if not self.fw_vboot2:
            self.setup_tried_fwb(tried_fwb=False)

    def cleanup(self):
        self.setup_tried_fwb(tried_fwb=False)
        super(firmware_TryFwB, self).cleanup()

    def run_once(self):
        logging.info("Set fwb_tries flag")
        self.check_state((self.checkers.fw_tries_checker, 'A'))
        self.try_fwb()
        self.reboot_warm()

        logging.info("Expected firmware B boot, reboot")
        self.check_state((self.checkers.fw_tries_checker, 'B'))
        self.reboot_warm()

        expected_slot = 'B' if self.fw_vboot2 else 'A'
        logging.info("Expected firmware " + expected_slot + " boot, done.")
        self.check_state((self.checkers.fw_tries_checker, expected_slot))
