aboutsummaryrefslogtreecommitdiff
path: root/server/site_tests/firmware_UpdateKernelVersion/firmware_UpdateKernelVersion.py
blob: 0c50372b9543c8e72d620d4550bc4020dce3449c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# 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
from autotest_lib.server.cros.faft.firmware_test import FirmwareTest
from autotest_lib.client.common_lib import error


class firmware_UpdateKernelVersion(FirmwareTest):
    """
    This is a server 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 success, reboot with kernel a.
    """
    version = 1

    def check_kernel_version(self, expected_ver):
        """Checks the kernel version."""
        actual_ver = self.faft_client.kernel.get_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):
        """Modifies kernel B and sets CGPT priority."""
        if delta == 1:
            self.faft_client.kernel.move_version_forward('b')
        elif delta == -1:
            self.check_kernel_version(self._update_version)
            self.faft_client.kernel.move_version_backward('b')

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

    def initialize(self, host, cmdline_args, dev_mode=True):
        """Initialize the test"""
        super(firmware_UpdateKernelVersion, self).initialize(host, cmdline_args)

        self.switcher.setup_mode('dev' if dev_mode else 'normal')

        actual_ver = self.faft_client.kernel.get_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):
        """Cleanup after the test"""
        super(firmware_UpdateKernelVersion, self).cleanup()

    def run_once(self):
        """Runs a single iteration of the test."""
        logging.info("Update Kernel Version.")
        self.check_state((self.check_root_part_on_non_recovery, 'a'))
        self.modify_kernel_b_and_set_cgpt_priority(1, 'b')
        self.switcher.mode_aware_reboot()

        logging.info("Check kernel version and rollback.")
        self.check_state((self.check_root_part_on_non_recovery, 'b'))
        self.modify_kernel_b_and_set_cgpt_priority(-1, 'b')
        self.switcher.mode_aware_reboot()

        logging.info("Boot with rollback kernel and change boot priority.")
        self.check_state((self.check_root_part_on_non_recovery, 'b'))
        self.modify_kernel_b_and_set_cgpt_priority(0, 'a')
        self.switcher.mode_aware_reboot()

        logging.info("Check rollback version.")
        self.check_state((self.check_root_part_on_non_recovery, 'a'))
        self.check_kernel_version(self._update_version - 1)