blob: 05c4043344a96532de321233caed9c9855294ef2 [file] [log] [blame]
# Lint as: python3
# Copyright 2022 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.client.common_lib import error
from autotest_lib.client.common_lib.cros import kernel_utils
from autotest_lib.server.cros.minios import minios_test
class autoupdate_MiniOS(minios_test.MiniOsTest):
"""Tests MiniOS update. """
version = 1
_EXCLUSION_PREFS_DIR = "exclusion"
_MINIOS_PREFS_DIR = "minios"
def initialize(self, host=None):
"""
Clear test related prefs on the DUT before starting the test.
"""
super(autoupdate_MiniOS, self).initialize(host=host)
self._remove_minios_update_prefs()
def cleanup(self):
super(autoupdate_MiniOS, self).cleanup()
self._save_extra_update_engine_logs(number_of_logs=2)
self._remove_minios_update_prefs()
def _remove_minios_update_prefs(self):
for pref in ((self._EXCLUSION_PREFS_DIR, True),
(self._MINIOS_PREFS_DIR, True)):
self._remove_update_engine_pref(pref=pref[0], is_dir=pref[1])
def _setup_minios_update(self, has_update, with_exclusion=False):
# Get payload URL for the MiniOS update.
# We'll always need a full payload for MiniOS update.
payload_url = self.get_payload_for_nebraska(
job_repo_url=self._job_repo_url,
full_payload=True,
payload_type=self._PAYLOAD_TYPE.MINIOS,
public_bucket=self._running_at_desk)
self._payload_urls.append(payload_url)
# Test that MiniOS payload can be excluded by creating a pref file.
# This simulates that the update engine tries to exclude MiniOS payload
# after getting certain types of MiniOS update failure.
if with_exclusion:
self._create_update_engine_pref(
pref_name=self._get_exclusion_name(payload_url),
sub_dir=self._EXCLUSION_PREFS_DIR)
# MiniOS booting to be verified.
if has_update:
self._verifications.append(self._boot_minios)
def _setup_cros_update(self, has_update):
if has_update:
# Get payload URL for the platform (OS) update.
self._payload_urls.append(
self.get_payload_for_nebraska(
job_repo_url=self._job_repo_url,
full_payload=self._full_payload,
public_bucket=self._running_at_desk))
# Platform (OS) update to be verified.
self._verifications.append(lambda: self._verify_cros_update(
updated=has_update))
def _setup_dlc_update(self):
# Payload URLs for sample-dlc, a test DLC package.
# We'll always need a full payload for DLC installation,
# and optionally a delta payload if required by the test.
self._payload_urls.append(
self.get_payload_for_nebraska(
job_repo_url=self._job_repo_url,
full_payload=True,
payload_type=self._PAYLOAD_TYPE.DLC,
public_bucket=self._running_at_desk))
if not self._full_payload:
self._payload_urls.append(
self.get_payload_for_nebraska(
job_repo_url=self._job_repo_url,
full_payload=False,
payload_type=self._PAYLOAD_TYPE.DLC,
public_bucket=self._running_at_desk))
# DLC update to be verified.
self._verifications.append(self._verify_dlc_update)
def _verify_cros_update(self, updated):
if updated:
# Verify the platform (OS) update completed successfully.
kernel_utils.verify_boot_expectations(self._inactive_cros,
host=self._host)
rootfs_hostlog, _ = self._create_hostlog_files()
self.verify_update_events(self._FORCED_UPDATE, rootfs_hostlog)
else:
# Verify the Platform (OS) boot expectation unchanged.
kernel_utils.verify_boot_expectations(self._active_cros,
host=self._host)
def _verify_dlc_update(self):
# Verify the DLC update completed successfully.
dlc_rootfs_hostlog, _ = self._create_dlc_hostlog_files()
logging.info('Checking DLC update events')
self.verify_update_events(
self._FORCED_UPDATE,
dlc_rootfs_hostlog[self._dlc_util._SAMPLE_DLC_ID])
# Verify the DLC was successfully installed.
self._dlc_util.remove_preloaded(self._dlc_util._SAMPLE_DLC_ID)
self._dlc_util.install(self._dlc_util._SAMPLE_DLC_ID,
omaha_url='fake_url')
if not self._dlc_util.is_installed(self._dlc_util._SAMPLE_DLC_ID):
raise error.TestFail('Test DLC was not installed.')
def run_once(self,
full_payload=True,
job_repo_url=None,
with_os=False,
with_dlc=False,
with_exclusion=False,
running_at_desk=False):
"""
Tests that we can successfully update MiniOS along with the OS.
@param full_payload: True for full OS and DLC payloads. False for delta.
@param job_repo_url: This is used to figure out the current build and
the devserver to use. The test will read this
from a host argument when run in the lab.
@param with_os: True for MiniOS update along with Platform (OS)
update. False for MiniOS only update.
@param with_dlc: True for MiniOS update with Platform (OS) and DLC.
False for turning off DLC update.
@param with_exclusion: True for excluding MiniOS payload.
@param running_at_desk: Indicates test is run locally from a
workstation.
"""
self._full_payload = full_payload
self._job_repo_url = job_repo_url
self._running_at_desk = running_at_desk
if not with_os and with_dlc:
logging.info("DLC only updates with the platform (OS), "
"automatically set with_os to True.")
with_os = True
# Record DUT state before the update.
self._active_cros, self._inactive_cros \
= kernel_utils.get_kernel_state(self._host)
active_minios, inactive_minios \
= kernel_utils.get_minios_priority(self._host)
minios_update = with_os and not with_exclusion
# MiniOS update to be verified.
self._verifications = [
lambda: kernel_utils.verify_minios_priority_after_update(
self._host,
expected=inactive_minios
if minios_update else active_minios)
]
# Get payload URLs and setup tests.
self._payload_urls = []
self._setup_cros_update(has_update=with_os)
if with_dlc:
self._setup_dlc_update()
self._setup_minios_update(has_update=minios_update,
with_exclusion=with_exclusion)
# Update MiniOS.
if with_dlc:
self._run_client_test_and_check_result(
'autoupdate_InstallAndUpdateDLC',
payload_urls=self._payload_urls,
allow_failure=not with_os)
else:
self._run_client_test_and_check_result(
'autoupdate_CannedOmahaUpdate',
payload_url=self._payload_urls,
allow_failure=not with_os)
if with_os:
self._host.reboot()
# Verify updates.
for verify in self._verifications:
verify()