blob: 79a9ff4077e3a0da78e8ccffcfb630bdf49b8165 [file] [log] [blame]
# Copyright 2019 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Artifacts service tests."""
import json
import os
import shutil
from unittest import mock
from chromite.lib import autotest_util
from chromite.lib import autotest_util_unittest
from chromite.lib import build_target_lib
from chromite.lib import chroot_lib
from chromite.lib import constants
from chromite.lib import cros_build_lib
from chromite.lib import cros_test_lib
from chromite.lib import osutils
from chromite.lib import parallel
from chromite.lib import portage_util
from chromite.lib import sysroot_lib
from chromite.lib.paygen import paygen_payload_lib
from chromite.lib.paygen import paygen_provision_payload
from chromite.lib.paygen import paygen_stateful_payload_lib
from chromite.service import artifacts
class BundleAutotestFilesTest(cros_test_lib.MockTempDirTestCase):
"""Test the Bundle Autotest Files function."""
def setUp(self) -> None:
self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=False)
self.output_dir = os.path.join(self.tempdir, "output_dir")
self.archive_dir = os.path.join(self.tempdir, "archive_base_dir")
self.chroot = chroot_lib.Chroot(
self.tempdir / "chroot_dir", out_path=self.tempdir / "out_dir"
)
sysroot_path = self.chroot.full_path("sysroot")
self.sysroot = sysroot_lib.Sysroot("sysroot")
self.sysroot_dne = sysroot_lib.Sysroot("sysroot_DNE")
# Make sure we have the valid paths.
osutils.SafeMakedirs(self.output_dir)
osutils.SafeMakedirs(sysroot_path)
osutils.SafeMakedirs(self.chroot.tmp)
def testInvalidOutputDirectory(self) -> None:
"""Test invalid output directory."""
with self.assertRaises(AssertionError):
artifacts.BundleAutotestFiles(self.chroot, self.sysroot, None)
def testInvalidSysroot(self) -> None:
"""Test sysroot that does not exist."""
with self.assertRaises(AssertionError):
artifacts.BundleAutotestFiles(
self.chroot, self.sysroot_dne, self.output_dir
)
def testArchiveDirectoryDoesNotExist(self) -> None:
"""Test archive directory that does not exist causes error."""
self.assertEqual(
artifacts.BundleAutotestFiles(
self.chroot, self.sysroot, self.output_dir
),
{},
)
def testSuccess(self) -> None:
"""Test a successful call handling."""
ab_path = self.chroot.full_path(
self.sysroot.path, constants.AUTOTEST_BUILD_PATH
)
osutils.SafeMakedirs(ab_path)
# Makes all the individual calls to build out each of the tarballs work
# nicely with a single patch.
self.PatchObject(
autotest_util.AutotestTarballBuilder,
"_BuildTarball",
side_effect=lambda _, path, **kwargs: osutils.Touch(path),
)
autotest_util_unittest.create_tast_layout(self.chroot, self.sysroot)
result = artifacts.BundleAutotestFiles(
self.chroot, self.sysroot, self.output_dir
)
for archive in result.values():
self.assertStartsWith(archive, self.output_dir)
self.assertExists(archive)
class ArchiveChromeEbuildEnvTest(cros_test_lib.MockTempDirTestCase):
"""ArchiveChromeEbuildEnv tests."""
def setUp(self) -> None:
self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=False)
# Create the chroot and sysroot instances.
self.chroot_path = self.tempdir / "chroot_dir"
self.out_path = self.tempdir / "out_dir"
self.chroot = chroot_lib.Chroot(
path=self.chroot_path, out_path=self.out_path
)
# NB: sysroot_lib.Sysroot is a bit ambiguous on whether these are full
# host paths, or chroot-relative paths. But ArchiveChromeEbuildEnv()
# definitely treas these as full host paths.
self.sysroot_path = self.chroot.full_path("sysroot_dir")
self.sysroot = sysroot_lib.Sysroot(self.sysroot_path)
# Create the output directory.
self.output_dir = os.path.join(self.tempdir, "output_dir")
osutils.SafeMakedirs(self.output_dir)
# The sysroot's /var/db/pkg prefix for the chrome package directories.
var_db_pkg = os.path.join(self.sysroot_path, portage_util.VDB_PATH)
# Create the var/db/pkg dir so we have that much for no-chrome tests.
osutils.SafeMakedirs(var_db_pkg)
# Two versions of chrome to test the multiple version checks/handling.
chrome_v1 = "%s-1.0.0-r1" % constants.CHROME_PN
chrome_v2 = "%s-2.0.0-r1" % constants.CHROME_PN
# Build the two chrome version paths.
chrome_cat_dir = os.path.join(var_db_pkg, constants.CHROME_CN)
self.chrome_v1_dir = os.path.join(chrome_cat_dir, chrome_v1)
self.chrome_v2_dir = os.path.join(chrome_cat_dir, chrome_v2)
# Directory tuple for verifying the result archive contents.
self.expected_archive_contents = cros_test_lib.Directory(
"./", "environment"
)
# Create a environment.bz2 file to put into folders.
env_file = os.path.join(self.tempdir, "environment")
osutils.Touch(env_file)
cros_build_lib.run(["bzip2", env_file])
self.env_bz2 = "%s.bz2" % env_file
def _CreateChromeDir(self, path: str, populate: bool = True) -> None:
"""Setup a chrome package directory.
Args:
path: The full chrome package path.
populate: Whether to include the environment bz2.
"""
osutils.SafeMakedirs(path)
if populate:
shutil.copy(self.env_bz2, path)
def testSingleChromeVersion(self) -> None:
"""Test a successful single-version run."""
self._CreateChromeDir(self.chrome_v1_dir)
created = artifacts.ArchiveChromeEbuildEnv(
self.sysroot, self.output_dir
)
self.assertStartsWith(created, self.output_dir)
cros_test_lib.VerifyTarball(created, self.expected_archive_contents)
def testMultipleChromeVersions(self) -> None:
"""Test a successful multiple version run."""
# Create both directories, but don't populate the v1 dir so it'll hit an
# error if the wrong one is used.
self._CreateChromeDir(self.chrome_v1_dir, populate=False)
self._CreateChromeDir(self.chrome_v2_dir)
created = artifacts.ArchiveChromeEbuildEnv(
self.sysroot, self.output_dir
)
self.assertStartsWith(created, self.output_dir)
cros_test_lib.VerifyTarball(created, self.expected_archive_contents)
def testNoChrome(self) -> None:
"""Test no version of chrome present."""
with self.assertRaises(artifacts.NoFilesError):
artifacts.ArchiveChromeEbuildEnv(self.sysroot, self.output_dir)
class ArchiveImagesTest(cros_test_lib.TempDirTestCase):
"""ArchiveImages tests."""
def setUp(self) -> None:
self.image_dir = os.path.join(self.tempdir, "images")
osutils.SafeMakedirs(self.image_dir)
self.output_dir = os.path.join(self.tempdir, "output")
osutils.SafeMakedirs(self.output_dir)
chroot_path = os.path.join(self.tempdir, "chroot")
self.chroot = chroot_lib.Chroot(
path=chroot_path, out_path=self.output_dir
)
osutils.SafeMakedirs(chroot_path)
sysroot_path = os.path.join(self.tempdir, "build/board")
self.sysroot = sysroot_lib.Sysroot(sysroot_path)
osutils.SafeMakedirs(sysroot_path)
self.images = []
for img in artifacts.IMAGE_TARS.keys():
full_path = os.path.join(self.image_dir, img)
self.images.append(full_path)
osutils.Touch(full_path)
if img in artifacts.IMAGE_ADDITIONAL_SYSROOT_FILES:
for file in artifacts.IMAGE_ADDITIONAL_SYSROOT_FILES[img]:
osutils.Touch(
os.path.join(sysroot_path, file), makedirs=True
)
osutils.Touch(os.path.join(self.image_dir, "irrelevant_image.bin"))
osutils.Touch(os.path.join(self.image_dir, "foo.txt"))
osutils.Touch(os.path.join(self.image_dir, "bar"))
def testNoImages(self) -> None:
"""Test an empty directory handling."""
artifacts.ArchiveImages(
self.chroot, self.sysroot, self.tempdir, self.output_dir
)
self.assertFalse(os.listdir(self.output_dir))
def testAllImages(self) -> None:
"""Test each image gets picked up."""
created = artifacts.ArchiveImages(
self.chroot, self.sysroot, self.image_dir, self.output_dir
)
self.assertCountEqual(list(artifacts.IMAGE_TARS.values()), created)
class CreateChromeRootTest(cros_test_lib.RunCommandTempDirTestCase):
"""CreateChromeRoot tests."""
def setUp(self) -> None:
self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=False)
# Create the build target.
self.build_target = build_target_lib.BuildTarget("board")
# Create the chroot.
self.chroot_dir = self.tempdir / "chroot"
self.out_dir = self.tempdir / "out"
self.chroot = chroot_lib.Chroot(
path=self.chroot_dir, out_path=self.out_dir
)
self.chroot_tmp = self.chroot.tmp
osutils.SafeMakedirs(self.chroot_tmp)
# Create the output directory.
self.output_dir = os.path.join(self.tempdir, "output_dir")
osutils.SafeMakedirs(self.output_dir)
def testRunCommandError(self) -> None:
"""Test handling when the run command call is not successful."""
self.rc.SetDefaultCmdResult(
side_effect=cros_build_lib.RunCommandError("Error")
)
with self.assertRaises(artifacts.CrosGenerateSysrootError):
artifacts.CreateChromeRoot(
self.chroot, self.build_target, self.output_dir
)
def testSuccess(self) -> None:
"""Test success case."""
# Separate tempdir for the method itself.
call_tempdir = os.path.join(self.chroot_tmp, "cgs_call_tempdir")
osutils.SafeMakedirs(call_tempdir)
self.PatchObject(
osutils.TempDir, "__enter__", return_value=call_tempdir
)
# Set up files in the tempdir since the command isn't being called to
# generate anything for it to handle.
files = ["file1", "file2", "file3"]
expected_files = [os.path.join(self.output_dir, f) for f in files]
for f in files:
osutils.Touch(os.path.join(call_tempdir, f))
created = artifacts.CreateChromeRoot(
self.chroot, self.build_target, self.output_dir
)
# Just test the command itself and the parameter-based args.
self.assertCommandContains(
["cros_generate_sysroot", "--board", self.build_target.name]
)
# Make sure we
self.assertCountEqual(expected_files, created)
for f in created:
self.assertExists(f)
class BundleEBuildLogsTarballTest(cros_test_lib.TempDirTestCase):
"""BundleEBuildLogsTarball tests."""
@mock.patch(
"chromite.lib.cros_build_lib.IsInsideChroot", return_value=False
)
def testBundleEBuildLogsTarball(self, _) -> None:
"""Verifies that the correct EBuild tar files are bundled."""
board = "samus"
# Create chroot object and sysroot object
chroot_path = self.tempdir / "chroot"
out_path = self.tempdir / "out"
chroot = chroot_lib.Chroot(path=chroot_path, out_path=out_path)
sysroot_path = os.path.join("build", board)
sysroot = sysroot_lib.Sysroot(sysroot_path)
# Create parent dir for logs
log_parent_dir = chroot.full_path("build")
# Names of log files typically found in a build directory.
log_files = (
"",
"x11-libs:libdrm-2.4.81-r24:20170816-175008.log",
"x11-libs:libpciaccess-0.12.902-r2:20170816-174849.log",
"x11-libs:libva-1.7.1-r2:20170816-175019.log",
"x11-libs:libva-intel-driver-1.7.1-r4:20170816-175029.log",
"x11-libs:libxkbcommon-0.4.3-r2:20170816-174908.log",
"x11-libs:pango-1.32.5-r1:20170816-174954.log",
"x11-libs:pixman-0.32.4:20170816-174832.log",
"x11-misc:xkeyboard-config-2.15-r3:20170816-174908.log",
"x11-proto:kbproto-1.0.5:20170816-174849.log",
"x11-proto:xproto-7.0.31:20170816-174849.log",
)
tarred_files = [os.path.join("logs", x) for x in log_files]
log_files_root = os.path.join(
log_parent_dir, "%s/tmp/portage/logs" % board
)
# Generate a representative set of log files produced by a typical
# build.
cros_test_lib.CreateOnDiskHierarchy(log_files_root, log_files)
archive_dir = self.tempdir
tarball = artifacts.BundleEBuildLogsTarball(
chroot, sysroot, archive_dir
)
self.assertEqual("ebuild_logs.tar.xz", tarball)
# Verify the tarball contents.
tarball_fullpath = os.path.join(self.tempdir, tarball)
cros_test_lib.VerifyTarball(tarball_fullpath, tarred_files)
class BundleChromeOSConfigTest(cros_test_lib.MockTempDirTestCase):
"""BundleChromeOSConfig tests."""
def setUp(self) -> None:
self.board = "samus"
self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=False)
# Create chroot object and sysroot object
chroot_path = self.tempdir / "chroot"
out_path = self.tempdir / "out"
self.chroot = chroot_lib.Chroot(path=chroot_path, out_path=out_path)
sysroot_path = os.path.join("build", self.board)
self.sysroot = sysroot_lib.Sysroot(sysroot_path)
self.archive_dir = self.tempdir
def testBundleChromeOSConfig(self) -> None:
"""Verifies that the correct ChromeOS config file is bundled."""
# Create parent dir for ChromeOS Config output.
config_parent_dir = self.chroot.full_path("build")
# Names of ChromeOS Config files typically found in a build directory.
config_files = (
"config.json",
cros_test_lib.Directory(
"yaml",
[
"config.c",
"config.yaml",
"ec_config.c",
"ec_config.h",
"model.yaml",
"private-model.yaml",
],
),
)
config_files_root = os.path.join(
config_parent_dir, "%s/usr/share/chromeos-config" % self.board
)
# Generate a representative set of config files produced by a typical
# build.
cros_test_lib.CreateOnDiskHierarchy(config_files_root, config_files)
# Write a payload to the config.yaml file.
test_config_payload = {
"chromeos": {"configs": [{"identity": {"platform-name": "Samus"}}]}
}
with open(
os.path.join(config_files_root, "yaml", "config.yaml"),
"w",
encoding="utf-8",
) as f:
json.dump(test_config_payload, f)
config_filename = artifacts.BundleChromeOSConfig(
self.chroot, self.sysroot, self.archive_dir
)
self.assertEqual("config.yaml", config_filename)
with open(
os.path.join(self.archive_dir, config_filename),
"r",
encoding="utf-8",
) as f:
self.assertEqual(test_config_payload, json.load(f))
def testNoChromeOSConfigFound(self) -> None:
"""Verifies None is returned when no ChromeOS config file is found."""
self.assertIsNone(
artifacts.BundleChromeOSConfig(
self.chroot, self.sysroot, self.archive_dir
)
)
class BundleVmFilesTest(cros_test_lib.TempDirTestCase):
"""BundleVmFiles tests."""
def testBundleVmFiles(self) -> None:
"""Verifies that the correct files are bundled"""
# Create the chroot instance.
chroot_path = self.tempdir / "chroot"
out_path = self.tempdir / "out"
chroot = chroot_lib.Chroot(path=chroot_path, out_path=out_path)
# Create the test_results_dir
test_results_dir = "test/results"
# Create a set of files where some should get bundled up as VM files.
# Add a suffix (123) to one of the files matching the VM pattern prefix.
vm_files = ("file1.txt", "file2.txt")
target_test_dir = os.path.join(chroot_path, test_results_dir)
cros_test_lib.CreateOnDiskHierarchy(target_test_dir, vm_files)
# Create the output directory.
output_dir = self.tempdir / "output_dir"
osutils.SafeMakedirs(output_dir)
archives = artifacts.BundleVmFiles(chroot, test_results_dir, output_dir)
expected_archive_files = []
self.assertCountEqual(archives, expected_archive_files)
class BuildFirmwareArchiveTest(cros_test_lib.MockTempDirTestCase):
"""BuildFirmwareArchive tests."""
def testBuildFirmwareArchive(self) -> None:
"""Verifies that firmware archiver includes proper files"""
self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=False)
# Assorted set of file names, some of which are supposed to be included
# in the archive.
fw_files = (
"dts/emeraldlake2.dts",
"image-link.rw.bin",
"nv_image-link.bin",
"pci8086,0166.rom",
"seabios.cbfs",
"u-boot.elf",
"u-boot_netboot.bin",
"updater-link.rw.sh",
"x86-memtest",
)
board = "link"
# Create the chroot and sysroot instances.
fw_test_root = self.tempdir
chroot_path = fw_test_root / "chroot"
out_path = fw_test_root / "out"
chroot = chroot_lib.Chroot(path=chroot_path, out_path=out_path)
sysroot = sysroot_lib.Sysroot("/build/link")
fw_files_root = chroot.full_path("/build/%s/firmware" % board)
# Generate a representative set of files produced by a typical build.
cros_test_lib.CreateOnDiskHierarchy(fw_files_root, fw_files)
# Create an archive from the simulated firmware directory
tarball = os.path.join(
fw_test_root,
artifacts.BuildFirmwareArchive(chroot, sysroot, fw_test_root),
)
# Verify the tarball contents.
cros_test_lib.VerifyTarball(tarball, fw_files)
class BundleFpmcuUnittestsTest(cros_test_lib.MockTempDirTestCase):
"""BundleFpmcuUnittests tests."""
def testBundleFpmcuUnittests(self) -> None:
"""Verifies that the resulting tarball includes proper files"""
self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=False)
unittest_files = (
"bloonchipper/test_rsa.bin",
"dartmonkey/test_utils.bin",
)
board = "hatch"
chroot_path = self.tempdir / "chroot"
out_path = self.tempdir / "out"
chroot = chroot_lib.Chroot(path=chroot_path, out_path=out_path)
sysroot = sysroot_lib.Sysroot("/build/%s" % board)
unittest_files_root = chroot.full_path(
"/build/%s/firmware/chromeos-fpmcu-unittests" % board
)
cros_test_lib.CreateOnDiskHierarchy(unittest_files_root, unittest_files)
tarball = os.path.join(
self.tempdir,
artifacts.BundleFpmcuUnittests(chroot, sysroot, self.tempdir),
)
cros_test_lib.VerifyTarball(
tarball, unittest_files + ("bloonchipper/", "dartmonkey/")
)
class GeneratePayloadsTest(cros_test_lib.MockTempDirTestCase):
"""Test cases for the payload generation functions."""
def setUp(self) -> None:
self.target_image = os.path.join(
self.tempdir,
"link/R37-5952.0.2014_06_12_2302-a1/chromiumos_test_image.bin",
)
osutils.Touch(self.target_image, makedirs=True)
self.sample_dlc_image = os.path.join(
self.tempdir,
"link/R37-5952.0.2014_06_12_2302-a1/dlc/sample-dlc/package/dlc.img",
)
osutils.Touch(self.sample_dlc_image, makedirs=True)
self.PatchObject(
parallel, "RunParallelSteps", lambda x, **kwargs: [a() for a in x]
)
self.chroot = chroot_lib.Chroot(
self.tempdir / "chroot", out_path=self.tempdir / "out"
)
def testExtendBuildPaths(self) -> None:
"""Verifies that ExtendBuildPaths adds the correct elements."""
self.assertEqual(
["a.bin", "a.bin.json", "a.bin.log"],
artifacts.ExtendBinPaths("a.bin"),
)
def testGenerateFullTestPayloads(self) -> None:
"""Verifies correctly generating full payloads."""
cros_payload_path = os.path.join(
self.tempdir,
"chromeos_R37-5952.0.2014_06_12_2302-a1_link_full_dev.bin",
)
minios_payload_path = os.path.join(
self.tempdir,
"minios_R37-5952.0.2014_06_12_2302-a1_link_full_dev.bin",
)
paygen_mock = self.PatchObject(
paygen_payload_lib,
"GenerateUpdatePayload",
side_effect=[
[cros_payload_path], # Generate CrOS
[minios_payload_path], # Generate MiniOS
],
)
generated = artifacts.GenerateTestPayloads(
self.chroot, self.target_image, self.tempdir, full=True
)
self.assertEqual(
generated,
artifacts.ExtendBinPaths(cros_payload_path)
+ artifacts.ExtendBinPaths(minios_payload_path),
)
paygen_mock.assert_has_calls(
[
mock.call(self.chroot, self.target_image, cros_payload_path),
mock.call(
self.chroot,
self.target_image,
minios_payload_path,
minios=True,
),
]
)
def testGenerateFullTestPayloadsPartial(self) -> None:
"""Verifies partially generating full payloads."""
cros_payload_path = os.path.join(
self.tempdir,
"chromeos_R37-5952.0.2014_06_12_2302-a1_link_full_dev.bin",
)
minios_payload_path = os.path.join(
self.tempdir,
"minios_R37-5952.0.2014_06_12_2302-a1_link_full_dev.bin",
)
paygen_mock = self.PatchObject(
paygen_payload_lib,
"GenerateUpdatePayload",
side_effect=[
[cros_payload_path], # Generate CrOS
[], # Skip MiniOS
],
)
generated = artifacts.GenerateTestPayloads(
self.chroot, self.target_image, self.tempdir, full=True
)
self.assertEqual(generated, artifacts.ExtendBinPaths(cros_payload_path))
paygen_mock.assert_has_calls(
[
mock.call(self.chroot, self.target_image, cros_payload_path),
mock.call(
self.chroot,
self.target_image,
minios_payload_path,
minios=True,
),
]
)
def testGenerateFullTestPayloadsSkipped(self) -> None:
"""Verifies skipping generating full payloads."""
cros_payload_path = os.path.join(
self.tempdir,
"chromeos_R37-5952.0.2014_06_12_2302-a1_link_full_dev.bin",
)
minios_payload_path = os.path.join(
self.tempdir,
"minios_R37-5952.0.2014_06_12_2302-a1_link_full_dev.bin",
)
paygen_mock = self.PatchObject(
paygen_payload_lib,
"GenerateUpdatePayload",
side_effect=[
[], # Skip CrOS
[], # Skip MiniOS
],
)
generated = artifacts.GenerateTestPayloads(
self.chroot, self.target_image, self.tempdir, full=True
)
self.assertEqual(generated, [])
paygen_mock.assert_has_calls(
[
mock.call(self.chroot, self.target_image, cros_payload_path),
mock.call(
self.chroot,
self.target_image,
minios_payload_path,
minios=True,
),
]
)
def testGenerateDeltaTestPayloads(self) -> None:
"""Verifies correctly generating delta payloads."""
cros_payload_path = os.path.join(
self.tempdir,
"chromeos_R37-5952.0.2014_06_12_2302-a1_R37-"
"5952.0.2014_06_12_2302-a1_link_delta_dev.bin",
)
minios_payload_path = os.path.join(
self.tempdir,
"minios_R37-5952.0.2014_06_12_2302-a1_R37-"
"5952.0.2014_06_12_2302-a1_link_delta_dev.bin",
)
paygen_mock = self.PatchObject(
paygen_payload_lib,
"GenerateUpdatePayload",
side_effect=[
[cros_payload_path], # Generate CrOS
[minios_payload_path], # Generate MiniOS
],
)
generated = artifacts.GenerateTestPayloads(
self.chroot, self.target_image, self.tempdir, delta=True
)
self.assertEqual(
generated,
artifacts.ExtendBinPaths(cros_payload_path)
+ artifacts.ExtendBinPaths(minios_payload_path),
)
paygen_mock.assert_has_calls(
[
mock.call(
self.chroot,
self.target_image,
cros_payload_path,
src_image=self.target_image,
),
mock.call(
self.chroot,
self.target_image,
minios_payload_path,
src_image=self.target_image,
minios=True,
),
]
)
def testGenerateDeltaTestPayloadsPartial(self) -> None:
"""Verifies partially generating delta payloads."""
cros_payload_path = os.path.join(
self.tempdir,
"chromeos_R37-5952.0.2014_06_12_2302-a1_R37-"
"5952.0.2014_06_12_2302-a1_link_delta_dev.bin",
)
minios_payload_path = os.path.join(
self.tempdir,
"minios_R37-5952.0.2014_06_12_2302-a1_R37-"
"5952.0.2014_06_12_2302-a1_link_delta_dev.bin",
)
paygen_mock = self.PatchObject(
paygen_payload_lib,
"GenerateUpdatePayload",
side_effect=[
[cros_payload_path], # Generate CrOS
[], # Skip MiniOS
],
)
generated = artifacts.GenerateTestPayloads(
self.chroot, self.target_image, self.tempdir, delta=True
)
self.assertEqual(generated, artifacts.ExtendBinPaths(cros_payload_path))
paygen_mock.assert_has_calls(
[
mock.call(
self.chroot,
self.target_image,
cros_payload_path,
src_image=self.target_image,
),
mock.call(
self.chroot,
self.target_image,
minios_payload_path,
src_image=self.target_image,
minios=True,
),
]
)
def testGenerateDeltaTestPayloadsSkipped(self) -> None:
"""Verifies skipping generating delta payloads."""
cros_payload_path = os.path.join(
self.tempdir,
"chromeos_R37-5952.0.2014_06_12_2302-a1_R37-"
"5952.0.2014_06_12_2302-a1_link_delta_dev.bin",
)
minios_payload_path = os.path.join(
self.tempdir,
"minios_R37-5952.0.2014_06_12_2302-a1_R37-"
"5952.0.2014_06_12_2302-a1_link_delta_dev.bin",
)
paygen_mock = self.PatchObject(
paygen_payload_lib,
"GenerateUpdatePayload",
side_effect=[
[], # Skip CrOS
[], # Skip MiniOS
],
)
generated = artifacts.GenerateTestPayloads(
self.chroot, self.target_image, self.tempdir, delta=True
)
self.assertEqual(generated, [])
paygen_mock.assert_has_calls(
[
mock.call(
self.chroot,
self.target_image,
cros_payload_path,
src_image=self.target_image,
),
mock.call(
self.chroot,
self.target_image,
minios_payload_path,
src_image=self.target_image,
minios=True,
),
]
)
def testGenerateFullStubDlcTestPayloads(self) -> None:
"""Verifies correctly generating full payloads for sample-dlc."""
self.PatchObject(portage_util, "GetBoardUseFlags", return_value=["dlc"])
cros_payload = os.path.join(
self.tempdir,
"chromeos_R37-5952.0.2014_06_12_2302-a1_link_full_dev.bin",
)
minios_payload = os.path.join(
self.tempdir,
"minios_R37-5952.0.2014_06_12_2302-a1_link_full_dev.bin",
)
dlc_payload = os.path.join(
self.tempdir,
(
"dlc_sample-dlc_package_R37-"
"5952.0.2014_06_12_2302-a1_link_full_dev.bin"
),
)
paygen_mock = self.PatchObject(
paygen_payload_lib,
"GenerateUpdatePayload",
side_effect=[
[cros_payload], # Generate CrOS
[minios_payload], # Generate MiniOS
[dlc_payload], # Generate DLC
],
)
generated = artifacts.GenerateTestPayloads(
self.chroot, self.target_image, self.tempdir, full=True, dlc=True
)
self.assertEqual(
generated,
artifacts.ExtendBinPaths(cros_payload)
+ artifacts.ExtendBinPaths(minios_payload)
+ artifacts.ExtendBinPaths(dlc_payload),
)
paygen_mock.assert_has_calls(
[
mock.call(self.chroot, self.target_image, cros_payload),
mock.call(
self.chroot, self.target_image, minios_payload, minios=True
),
mock.call(self.chroot, self.sample_dlc_image, dlc_payload),
]
)
def testGenerateFullStubDlcTestPayloadsSkipped(self) -> None:
"""Verifies skipping generating full payloads for sample-dlc."""
self.PatchObject(portage_util, "GetBoardUseFlags", return_value=["dlc"])
cros_payload = os.path.join(
self.tempdir,
"chromeos_R37-5952.0.2014_06_12_2302-a1_link_full_dev.bin",
)
minios_payload = os.path.join(
self.tempdir,
"minios_R37-5952.0.2014_06_12_2302-a1_link_full_dev.bin",
)
dlc_payload = os.path.join(
self.tempdir,
(
"dlc_sample-dlc_package_R37-"
"5952.0.2014_06_12_2302-a1_link_full_dev.bin"
),
)
# Omitting dlc_payload.
paygen_mock = self.PatchObject(
paygen_payload_lib,
"GenerateUpdatePayload",
side_effect=[
[cros_payload], # Generate CrOS
[minios_payload], # Generate MiniOS
[], # Skip DLC
],
)
generated = artifacts.GenerateTestPayloads(
self.chroot, self.target_image, self.tempdir, full=True, dlc=True
)
self.assertEqual(
generated,
artifacts.ExtendBinPaths(cros_payload)
+ artifacts.ExtendBinPaths(minios_payload),
)
paygen_mock.assert_has_calls(
[
mock.call(self.chroot, self.target_image, cros_payload),
mock.call(
self.chroot, self.target_image, minios_payload, minios=True
),
mock.call(self.chroot, self.sample_dlc_image, dlc_payload),
]
)
def testGenerateDeltaStubDlcTestPayloads(self) -> None:
"""Verifies correctly generating delta payloads for sample-dlc."""
self.PatchObject(portage_util, "GetBoardUseFlags", return_value=["dlc"])
cros_payload = os.path.join(
self.tempdir,
(
"chromeos_R37-5952.0.2014_06_12_2302-a1_R37-"
"5952.0.2014_06_12_2302-a1_link_delta_dev.bin"
),
)
minios_payload = os.path.join(
self.tempdir,
(
"minios_R37-5952.0.2014_06_12_2302-a1_R37-"
"5952.0.2014_06_12_2302-a1_link_delta_dev.bin"
),
)
dlc_payload = os.path.join(
self.tempdir,
(
"dlc_sample-dlc_package_R37-5952.0.2014_06_12_2302-a1_R37-"
"5952.0.2014_06_12_2302-a1_link_delta_dev.bin"
),
)
paygen_mock = self.PatchObject(
paygen_payload_lib,
"GenerateUpdatePayload",
side_effect=[
[cros_payload], # Generate CrOS
[minios_payload], # Generate MiniOS
[dlc_payload], # Generate DLC
],
)
generated = artifacts.GenerateTestPayloads(
self.chroot, self.target_image, self.tempdir, delta=True, dlc=True
)
self.assertEqual(
generated,
artifacts.ExtendBinPaths(cros_payload)
+ artifacts.ExtendBinPaths(minios_payload)
+ artifacts.ExtendBinPaths(dlc_payload),
)
paygen_mock.assert_has_calls(
[
mock.call(
self.chroot,
self.target_image,
cros_payload,
src_image=self.target_image,
),
mock.call(
self.chroot,
self.target_image,
minios_payload,
src_image=self.target_image,
minios=True,
),
mock.call(
self.chroot,
self.sample_dlc_image,
dlc_payload,
src_image=self.sample_dlc_image,
),
]
)
def testGenerateDeltaStubDlcTestPayloadsSkipped(self) -> None:
"""Verifies skipping generating delta payloads for sample-dlc."""
self.PatchObject(portage_util, "GetBoardUseFlags", return_value=["dlc"])
cros_payload = os.path.join(
self.tempdir,
(
"chromeos_R37-5952.0.2014_06_12_2302-a1_R37-"
"5952.0.2014_06_12_2302-a1_link_delta_dev.bin"
),
)
minios_payload = os.path.join(
self.tempdir,
(
"minios_R37-5952.0.2014_06_12_2302-a1_R37-"
"5952.0.2014_06_12_2302-a1_link_delta_dev.bin"
),
)
dlc_payload = os.path.join(
self.tempdir,
(
"dlc_sample-dlc_package_R37-5952.0.2014_06_12_2302-a1_R37-"
"5952.0.2014_06_12_2302-a1_link_delta_dev.bin"
),
)
paygen_mock = self.PatchObject(
paygen_payload_lib,
"GenerateUpdatePayload",
side_effect=[
[cros_payload], # Generate CrOS
[minios_payload], # Generate MiniOS
[], # Skip DLC
],
)
generated = artifacts.GenerateTestPayloads(
self.chroot, self.target_image, self.tempdir, delta=True, dlc=True
)
self.assertEqual(
generated,
artifacts.ExtendBinPaths(cros_payload)
+ artifacts.ExtendBinPaths(minios_payload),
)
paygen_mock.assert_has_calls(
[
mock.call(
self.chroot,
self.target_image,
cros_payload,
src_image=self.target_image,
),
mock.call(
self.chroot,
self.target_image,
minios_payload,
src_image=self.target_image,
minios=True,
),
mock.call(
self.chroot,
self.sample_dlc_image,
dlc_payload,
src_image=self.sample_dlc_image,
),
]
)
def testGenerateStatefulTestPayloads(self) -> None:
"""Verifies correctly generating stateful payloads."""
paygen_mock = self.PatchObject(
paygen_stateful_payload_lib, "GenerateStatefulPayload"
)
paygen_mock2 = self.PatchObject(
paygen_stateful_payload_lib, "GenerateZstdStatefulPayload"
)
artifacts.GenerateTestPayloads(
self.chroot, self.target_image, self.tempdir, stateful=True
)
paygen_mock.assert_called_once_with(self.target_image, self.tempdir)
paygen_mock2.assert_called_once_with(self.target_image, self.tempdir)
class BundleTastFilesTest(cros_test_lib.MockTempDirTestCase):
"""BundleTastFiles tests."""
def setUp(self) -> None:
self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=False)
self.chroot = chroot_lib.Chroot(
path=self.tempdir / "chroot",
out_path=self.tempdir / "out",
)
self.sysroot = sysroot_lib.Sysroot("/build/board")
self.output_dir = self.tempdir / "output_dir"
osutils.SafeMakedirs(self.output_dir)
def testSuccess(self) -> None:
"""Successfully create a tast tarball.
/build/board/build/{libexec/tast,share/tast}/* ->
libexec/tast/undles/local/crosint
share/tast/metadata/local/crosint.pb
share/tast/data/go.chromium.org/tast-tests-private/*
"""
sysroot_files = (
"libexec/tast/bundles/local/crosint",
"share/tast/metadata/local/crosint.pb",
cros_test_lib.Directory(
"share/tast/data/go.chromium.org/tast-tests-private", ("baz",)
),
)
cros_test_lib.CreateOnDiskHierarchy(
self.chroot.full_path(self.sysroot.JoinPath("build")),
sysroot_files,
)
tarball = artifacts.BundleTastFiles(
self.chroot, self.sysroot, self.output_dir
)
# Verify location and content of the tarball.
self.assertEqual(
tarball, str(self.output_dir / artifacts.TAST_BUNDLE_NAME)
)
cros_test_lib.VerifyTarball(tarball, sysroot_files)
class BundleTastIntelFilesTest(cros_test_lib.MockTempDirTestCase):
"""BundleTastIntelFiles tests."""
def setUp(self):
self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=False)
self.chroot = chroot_lib.Chroot(
path=self.tempdir / "chroot",
out_path=self.tempdir / "out",
)
self.sysroot = sysroot_lib.Sysroot("/build/board")
self.output_dir = self.tempdir / "output_dir"
osutils.SafeMakedirs(self.output_dir)
def testSuccess(self):
"""Successfully create a tast tarball.
/build/board/build/{libexec/tast,share/tast}/* ->
libexec/tast/undles/local/crosint_intel
share/tast/metadata/local/crosint_intel.pb
share/tast/data/go.chromium.org/partner-intel-private/*
"""
sysroot_files = (
"libexec/tast/bundles/local/crosint_intel",
"share/tast/metadata/local/crosint_intel.pb",
cros_test_lib.Directory(
"share/tast/data/go.chromium.org/partner-intel-private",
("baz",),
),
)
cros_test_lib.CreateOnDiskHierarchy(
self.chroot.full_path(self.sysroot.JoinPath("build")),
sysroot_files,
)
tarball = artifacts.BundleTastIntelFiles(
self.chroot, self.sysroot, self.output_dir
)
# Verify location and content of the tarball.
self.assertEqual(
tarball, str(self.output_dir / artifacts.TAST_INTEL_BUNDLE_NAME)
)
cros_test_lib.VerifyTarball(tarball, sysroot_files)
class BundleGceTarballTest(cros_test_lib.MockTempDirTestCase):
"""BundleGceTarball tests."""
def setUp(self) -> None:
self.output_dir = os.path.join(self.tempdir, "output_dir")
self.image_dir = os.path.join(self.tempdir, "image_dir")
osutils.SafeMakedirs(self.output_dir)
osutils.SafeMakedirs(self.image_dir)
self.image_file = os.path.join(self.image_dir, constants.TEST_IMAGE_BIN)
osutils.Touch(self.image_file)
def testSuccess(self) -> None:
# Prepare tempdir for use by the function as tarball root.
call_tempdir = os.path.join(self.tempdir, "call_tempdir")
osutils.SafeMakedirs(call_tempdir)
self.PatchObject(
osutils.TempDir, "__enter__", return_value=call_tempdir
)
tarball = artifacts.BundleGceTarball(self.output_dir, self.image_dir)
# Verify location and content of the tarball.
self.assertEqual(
tarball, os.path.join(self.output_dir, constants.TEST_IMAGE_GCE_TAR)
)
cros_test_lib.VerifyTarball(tarball, ("disk.raw",))
# Verify the symlink points the the test image.
disk_raw = os.path.join(call_tempdir, "disk.raw")
self.assertEqual(os.readlink(disk_raw), self.image_file)
class BundleTestUpdatePayloadsTest(cros_test_lib.MockTempDirTestCase):
"""BundleTestUpdatePayloads tests."""
def setUp(self) -> None:
# Drop str() wrapping, once functions/methods can handle Paths.
self.target_image = str(
self.tempdir
/ "link"
/ "R37-5952.0.2014_06_12_2302-a1"
/ "chromiumos_test_image.bin"
)
osutils.Touch(self.target_image, makedirs=True)
# Drop str() wrapping, once functions/methods can handle Paths.
self.sample_dlc_image = str(
self.tempdir
/ "link"
/ "R37-5952.0.2014_06_12_2302-a1"
/ "dlc"
/ "sample-dlc"
/ "package"
/ "dlc.img"
)
osutils.Touch(self.sample_dlc_image, makedirs=True)
self.PatchObject(
parallel, "RunParallelSteps", lambda x, **kwargs: [a() for a in x]
)
self.PatchObject(portage_util, "GetBoardUseFlags", return_value=["dlc"])
self.chroot = chroot_lib.Chroot(
self.tempdir / "chroot", out_path=self.tempdir / "out"
)
def testBundledGeneration(self) -> None:
"""Test BundleTestUpdatePayloads produces correct values."""
cros_payload_full = (
self.tempdir
/ "chromeos_R37-5952.0.2014_06_12_2302-a1_link_full_dev.bin"
)
minios_payload_full = (
self.tempdir
/ "minios_R37-5952.0.2014_06_12_2302-a1_link_full_dev.bin"
)
dlc_payload_full = self.tempdir / (
"dlc_sample-dlc_package_R37-"
"5952.0.2014_06_12_2302-a1_link_full_dev.bin"
)
cros_payload_delta = self.tempdir / (
"chromeos_R37-5952.0.2014_06_12_2302-a1_R37-"
"5952.0.2014_06_12_2302-a1_link_delta_dev.bin"
)
minios_payload_delta = self.tempdir / (
"minios_R37-5952.0.2014_06_12_2302-a1_R37-"
"5952.0.2014_06_12_2302-a1_link_delta_dev.bin"
)
dlc_payload_delta = self.tempdir / (
"dlc_sample-dlc_package_R37-5952.0.2014_06_12_2302-a1_R37-"
"5952.0.2014_06_12_2302-a1_link_delta_dev.bin"
)
paygen_mock = self.PatchObject(
paygen_payload_lib,
"GenerateUpdatePayload",
side_effect=[
[str(cros_payload_full)], # Generate CrOS Full
[str(minios_payload_full)], # Generate MiniOS Full
[str(cros_payload_delta)], # Generate CrOS Delta
[str(minios_payload_delta)], # Generate MiniOS Delta
[str(dlc_payload_full)], # Generate DLC Full
[str(dlc_payload_delta)], # Generate DLC Delta
],
)
stateful_payload = self.tempdir / "stateful.tgz"
paygen_mock_stateful_1 = self.PatchObject(
paygen_stateful_payload_lib,
"GenerateStatefulPayload",
side_effect=[str(stateful_payload)],
)
stateful_zst_payload = self.tempdir / "stateful.zst"
paygen_mock_stateful_2 = self.PatchObject(
paygen_stateful_payload_lib,
"GenerateZstdStatefulPayload",
side_effect=[str(stateful_zst_payload)],
)
kern_provision_payload = self.tempdir / constants.FULL_PAYLOAD_KERN
root_provision_payload = self.tempdir / constants.FULL_PAYLOAD_ROOT
stateful_provision_payload = self.tempdir / constants.STATEFUL_PAYLOAD
gen_provision_payload_ret = [
str(kern_provision_payload),
str(root_provision_payload),
str(stateful_provision_payload),
]
paygen_provision_mock = self.PatchObject(
paygen_provision_payload,
"GenerateProvisionPayloads",
side_effect=[
gen_provision_payload_ret,
],
)
gen = artifacts.BundleTestUpdatePayloads(
self.chroot,
self.target_image,
str(self.tempdir),
)
expected_gen = (
artifacts.ExtendBinPaths(str(cros_payload_full))
+ artifacts.ExtendBinPaths(str(minios_payload_full))
+ artifacts.ExtendBinPaths(str(cros_payload_delta))
+ artifacts.ExtendBinPaths(str(minios_payload_delta))
+ artifacts.ExtendBinPaths(str(dlc_payload_full))
+ artifacts.ExtendBinPaths(str(dlc_payload_delta))
+ [str(stateful_payload), str(stateful_zst_payload)]
+ gen_provision_payload_ret
)
self.assertEqual(
gen,
expected_gen,
)
paygen_mock.assert_has_calls(
[
mock.call(
self.chroot,
self.target_image,
str(cros_payload_full),
),
mock.call(
self.chroot,
self.target_image,
str(minios_payload_full),
minios=True,
),
mock.call(
self.chroot,
self.target_image,
str(cros_payload_delta),
src_image=self.target_image,
),
mock.call(
self.chroot,
self.target_image,
str(minios_payload_delta),
src_image=self.target_image,
minios=True,
),
mock.call(
self.chroot,
self.sample_dlc_image,
str(dlc_payload_full),
),
mock.call(
self.chroot,
self.sample_dlc_image,
str(dlc_payload_delta),
src_image=self.sample_dlc_image,
),
]
)
paygen_mock_stateful_1.assert_called_once_with(
self.target_image,
str(self.tempdir),
)
paygen_mock_stateful_2.assert_called_once_with(
self.target_image,
str(self.tempdir),
)
paygen_provision_mock.assert_called_once_with(
self.target_image,
str(self.tempdir),
)