# 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, time
from autotest_lib.server.cros.faftsequence import FAFTSequence
from autotest_lib.client.common_lib import error


class firmware_UpdateKernelVersion(FAFTSequence):
    """
    This is a servod based kernel update test which should run in developer
    mode. On runtime, this test modifies the kernel version of kernel b and
    modifies cgpt to reboot with kernel b. Check kernel version after reboot,
    and then recover kernel b version to original version. Here also tries to
    reboot with kernel b after recovery. If sccuess, reboot with kernel a.
    """
    version = 1

    def check_kernel_version(self, expected_ver):
        actual_ver = self.faft_client.retrieve_kernel_version('b')
        if actual_ver != expected_ver:
            raise error.TestFail(
                'Kernel Version should be %s, but got %s.'
                % (expected_ver, actual_ver))
        else:
            logging.info(
                'Update success, now version is %s'
                % actual_ver)


    def modify_kernel_b_and_set_cgpt_priority(self, delta, target_dev):
        if delta == 1:
            self.faft_client.move_kernel_forward('b')
        elif delta == -1:
            self.check_kernel_version(self._update_version)
            self.faft_client.move_kernel_backward('b')

        if target_dev == 'a':
            self.reset_and_prioritize_kernel('a')
        else:
            self.reset_and_prioritize_kernel('b')


    def setup(self, dev_mode=True):
        super(firmware_UpdateKernelVersion, self).setup()

        self.setup_dev_mode(dev_mode)

        actual_ver = self.faft_client.retrieve_kernel_version('b')
        logging.info('Original Kernel Version of KERN-B is %s' % actual_ver)

        self._update_version = actual_ver + 1
        logging.info('KERN-B will update to version %s' % self._update_version)

        self.setup_kernel('a')


    def cleanup(self):
        super(firmware_UpdateKernelVersion, self).cleanup()


    def run_once(self, host=None):
        self.register_faft_sequence((
            {   # Step 1, Update Kernel Version.
                'state_checker': (self.check_root_part_on_non_recovery, 'a'),
                'userspace_action': (
                     self.modify_kernel_b_and_set_cgpt_priority, (1, 'b')),
                'reboot_action': self.full_power_off_and_on,
            },
            {   # Step 2, Check kernel version and rollback.
                'state_checker': (self.check_root_part_on_non_recovery, 'b'),
                'userspace_action': (
                    self.modify_kernel_b_and_set_cgpt_priority, (-1, 'b')),
                'reboot_action': self.full_power_off_and_on,
            },
            {   # Step 3, Boot with rollback kernel and change boot priority.
                'state_checker': (self.check_root_part_on_non_recovery, 'b'),
                'userspace_action':(
                    self.modify_kernel_b_and_set_cgpt_priority, (0, 'a')),
                'reboot_action': self.full_power_off_and_on,
            },
            {   # Step 4, Check rollback version.
                'state_checker': (self.check_root_part_on_non_recovery, 'a'),
                'userspace_action': (self.check_kernel_version,
                                     self._update_version - 1)
            }
        ))

        self.run_faft_sequence()
