# 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 os
from autotest_lib.server.cros.faft.firmware_test import FirmwareTest
from autotest_lib.client.common_lib import error
class firmware_UpdateKernelDataKeyVersion(FirmwareTest):
"""
This test should run in developer mode. On runtime, this test modifies the
kernel data key version of kernel b and modifies cgpt to reboot with kernel
b. Check kernel data key version after reboot, and then recover kernel b's
data key 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_datakey_version(self, expected_ver):
actual_ver = self.faft_client.kernel.get_datakey_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 resign_kernel_datakey_version(self, host):
host.send_file(os.path.join(self.bindir,
'files/common.sh'),
os.path.join(self.faft_client.updater.get_temp_path(),
'common.sh'))
host.send_file(os.path.join(self.bindir,
'files/make_keys.sh'),
os.path.join(self.faft_client.updater.get_temp_path(),
'make_keys.sh'))
self.faft_client.system.run_shell_command('/bin/bash %s %s' % (
os.path.join(self.faft_client.updater.get_temp_path(),
'make_keys.sh'),
self._update_version))
def modify_kernel_b_and_set_cgpt_priority(self, delta, target_dev):
if delta == 1:
self.faft_client.kernel.resign_with_keys(
'b', self.faft_client.updater.get_keys_path())
elif delta == -1:
self.check_kernel_datakey_version(self._update_version)
self.faft_client.kernel.resign_with_keys('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):
super(firmware_UpdateKernelDataKeyVersion, self).initialize(host,
cmdline_args)
self.switcher.setup_mode('dev' if dev_mode else 'normal')
actual_ver = self.faft_client.kernel.get_datakey_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')
self.resign_kernel_datakey_version(host)
def cleanup(self):
try:
self.faft_client.updater.cleanup()
except Exception as e:
logging.error("Caught exception: %s", str(e))
super(firmware_UpdateKernelDataKeyVersion, self).cleanup()
def run_once(self):
logging.info("Update Kernel Data Key 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 data key 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_datakey_version(self._update_version - 1)