# Copyright (c) 2012 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
import time
from autotest_lib.server.cros.faftsequence import FAFTSequence
from autotest_lib.client.common_lib import error


class firmware_UpdateFirmwareVersion(FAFTSequence):
    """
    Servo based firmware update test which checks the firmware version.

    This test requires the firmware id of the current running firmware
    matches the system shellball's. On runtime, this test modifies the firmware
    version of the shellball and runs autoupdate. Check firmware version after
    boot with firmware B, and then recover firmware A and B to original
    shellball.
    """
    version = 1

    def check_firmware_version(self, expected_ver):
        actual_ver = self.faft_client.retrieve_firmware_version('a')
        if actual_ver != expected_ver:
            raise error.TestFail(
                'Firmware version should be %s, but got %s.'
                % (expected_ver, actual_ver))
        else:
            logging.info(
                'Update success, now version is %s'
                % actual_ver)

    def run_bootok_and_recovery(self):
        self.faft_client.run_firmware_bootok('test')
        self.check_firmware_version(self._update_version)
        self.faft_client.run_firmware_recovery()

    def setup(self):
        super(firmware_UpdateFirmwareVersion, self).setup()

        self.faft_client.setup_firmwareupdate_temp_dir()
        self._fwid = self.faft_client.retrieve_shellball_fwid()

        actual_ver = self.faft_client.retrieve_firmware_version('a')
        logging.info('Origin version is %s' % actual_ver)
        self._update_version = actual_ver + 1
        logging.info('Firmware version will update to version %s'
            % self._update_version)

        self.faft_client.resign_firmware(self._update_version)
        self.faft_client.repack_firmwareupdate_shellball('test')

    def cleanup(self):
        self.faft_client.cleanup_firmwareupdate_temp_dir()
        super(firmware_UpdateFirmwareVersion, self).cleanup()


    def run_once(self, host=None):
        self.register_faft_sequence((
            {   # Step 1, Update firmware with new version.
                'state_checker': (self.crossystem_checker, {
                    'mainfw_act': 'A',
                    'mainfw_type': 'developer',
                    'tried_fwb': '0',
                    'fwid': self._fwid
                }),
                'userspace_action': (
                     self.faft_client.run_firmware_autoupdate,
                     'test'
                ),
                'firmware_action': (self.wait_fw_screen_and_ctrl_d)
            },
            {   # Step2, Check firmware Version and Rollback.
                'state_checker': (self.crossystem_checker, {
                    'mainfw_act': 'B',
                    'tried_fwb': '1'
                }),
                'userspace_action': (self.run_bootok_and_recovery),
                'firmware_action': (self.wait_fw_screen_and_ctrl_d)
            },
            {   # Step3, Check Rollback version
                'state_checker': (self.crossystem_checker, {
                    'mainfw_act': 'A',
                    'tried_fwb': '0',
                    'fwid': self._fwid
                }),
                'userspace_action':(self.check_firmware_version,
                                    self._update_version - 1)

            }
        ))

        self.run_faft_sequence()
