• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import logging
6import os
7
8from autotest_lib.server import utils
9from autotest_lib.server.cros.faft.firmware_test import FirmwareTest
10from autotest_lib.client.common_lib import error
11
12
13class firmware_UpdateKernelSubkeyVersion(FirmwareTest):
14    """
15    This test requires firmware id matches fwid of shellball
16    chromeos-firmwareupdate. On runtime, this test modifies shellball and runs
17    autoupdate. Check kernel subkey version after boot with firmware B, and
18    then recover firmware A and B to original shellball.
19
20    """
21    version = 1
22
23    def resign_kernel_subkey_version(self, host):
24        """Resigns the kernel subkey version."""
25        host.send_file(os.path.join(self.bindir,
26                                    'files/common.sh'),
27                       os.path.join(self.faft_client.updater.get_temp_path(),
28                                     'common.sh'))
29        host.send_file(os.path.join(self.bindir,
30                                    'files/make_keys.sh'),
31                       os.path.join(self.faft_client.updater.get_temp_path(),
32                                    'make_keys.sh'))
33
34        self.faft_client.system.run_shell_command('/bin/bash %s %s' % (
35            os.path.join(self.faft_client.updater.get_temp_path(),
36                         'make_keys.sh'),
37            self._update_version))
38
39    def check_kernel_subkey_version(self, expected_ver):
40        """Checks the kernel subkey version."""
41        actual_ver = self.faft_client.bios.get_kernel_subkey_version(
42                'b' if self.fw_vboot2 else 'a')
43        if actual_ver != expected_ver:
44            raise error.TestFail(
45                    'Kernel subkey version should be %s, but got %s.' %
46                    (expected_ver, actual_ver))
47        else:
48            logging.info(
49                'Update success, now subkey version is %s',
50                actual_ver)
51
52
53    def initialize(self, host, cmdline_args, dev_mode=True):
54        """Initialize the test"""
55        dict_args = utils.args_to_dict(cmdline_args)
56        shellball_path = dict_args.get('shellball', None)
57        super(firmware_UpdateKernelSubkeyVersion, self).initialize(
58            host, cmdline_args)
59        self.backup_firmware()
60        self.switcher.setup_mode('dev' if dev_mode else 'normal')
61        self.setup_firmwareupdate_shellball(shellball_path)
62
63        # Update firmware if needed
64        if shellball_path:
65            self.set_hardware_write_protect(enable=False)
66            self.faft_client.updater.run_factory_install()
67            self.switcher.mode_aware_reboot()
68
69        self._fwid = self.faft_client.updater.get_section_fwid()
70
71        ver = self.faft_client.bios.get_kernel_subkey_version('a')
72        logging.info('Origin version is %s', ver)
73        self._update_version = ver + 1
74        logging.info('Kernel subkey version will update to version %s',
75                     self._update_version)
76
77        self.resign_kernel_subkey_version(host)
78        self.faft_client.updater.resign_firmware(1)
79        self.faft_client.updater.repack_shellball('test')
80
81    def cleanup(self):
82        """Cleanup after the test"""
83        try:
84            self.restore_firmware()
85            self.invalidate_firmware_setup()
86        except Exception as e:
87            logging.error("Caught exception: %s", str(e))
88        super(firmware_UpdateKernelSubkeyVersion, self).cleanup()
89
90    def run_once(self):
91        """Runs a single iteration of the test."""
92        logging.info("Update firmware with new kernel subkey version.")
93        self.check_state((self.checkers.crossystem_checker, {
94                          'fwid': self._fwid
95                          }))
96        self.check_state((self.checkers.fw_tries_checker, 'A'))
97        self.faft_client.updater.run_autoupdate('test')
98        self.switcher.mode_aware_reboot()
99
100        logging.info("Check firmware data key version and Rollback.")
101        self.faft_client.updater.run_bootok('test')
102        self.check_state((self.checkers.fw_tries_checker, 'B'))
103        self.check_kernel_subkey_version(self._update_version)
104        self.faft_client.updater.run_recovery()
105        self.switcher.mode_aware_reboot()
106
107        logging.info("Check Rollback version.")
108        self.check_state((self.checkers.crossystem_checker, {
109                          'fwid': self._fwid
110                          }))
111        self.check_state((self.checkers.fw_tries_checker,
112                          'B' if self.fw_vboot2 else 'A'))
113        self.check_kernel_subkey_version(self._update_version - 1)
114