blob: 74b328f421769da238adb899f1d703244b551f67 [file] [log] [blame]
# Copyright 2021 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tests the minios module."""
import os
from chromite.lib import cros_test_lib
from chromite.lib import image_lib
from chromite.lib import image_lib_unittest
from chromite.lib import kernel_builder
from chromite.lib import minios
from chromite.lib import osutils
class BuilderTest(cros_test_lib.RunCommandTempDirTestCase):
"""Tests Builder."""
FAKE_PARTITIONS = (
image_lib.PartitionInfo(9, 0, 512 * 4, "fs", "MINIOS-A"),
image_lib.PartitionInfo(10, 512 * 4, 512 * 8, "fs", "MINIOS-B"),
)
def setUp(self):
"""Sets up common objects for testing."""
self.image = image_lib_unittest.LoopbackPartitionsMock("foo-image")
self.PatchObject(
image_lib, "LoopbackPartitions", return_value=self.image
)
self.PatchObject(
self.image,
"GetPartitionDevName",
side_effect=["/foo/dev0", "/foo/dev1"],
)
self.PatchObject(
self.image, "GetPartitionInfo", side_effect=self.FAKE_PARTITIONS
)
os.environ["USE"] = ""
def testCreateMiniOsKernelImage(self):
"""Tests CreateMiniOsKernelImage()."""
bck_mock = self.PatchObject(
kernel_builder.Builder, "CreateCustomKernel"
)
bki_mock = self.PatchObject(kernel_builder.Builder, "CreateKernelImage")
minios.CreateMiniOsKernelImage(
"foo-board",
"0.0.0.0",
self.tempdir,
"foo-keys-dir",
"foo-public-key",
"foo-private-key",
"foo-keyblock",
"foo-tty",
16,
)
bck_mock.assert_called_once_with(
[
"minios",
"minios_ramfs",
"tpm",
"i2cdev",
"vfat",
"kernel_compress_xz",
"pcserial",
"-kernel_afdo",
],
[],
)
bki_mock.assert_called_once_with(
os.path.join(self.tempdir, minios.MINIOS_KERNEL_IMAGE),
boot_args=(
"noinitrd panic=60 cros_minios_version=0.0.0.0 cros_minios"
),
serial="foo-tty",
keys_dir="foo-keys-dir",
public_key="foo-public-key",
private_key="foo-private-key",
keyblock="foo-keyblock",
)
def testCreateMiniOsKernelImageOverrideUseFlags(self):
"""Tests CreateMiniOsKernelImage()."""
os.environ["USE"] = "other_ramfs foo bar"
bck_mock = self.PatchObject(
kernel_builder.Builder, "CreateCustomKernel"
)
bki_mock = self.PatchObject(kernel_builder.Builder, "CreateKernelImage")
minios.CreateMiniOsKernelImage(
"foo-board",
"0.0.0.0",
self.tempdir,
"foo-keys-dir",
"foo-public-key",
"foo-private-key",
"foo-keyblock",
"foo-tty",
16,
)
bck_mock.assert_called_once_with(
[
"minios",
"minios_ramfs",
"tpm",
"i2cdev",
"vfat",
"kernel_compress_xz",
"pcserial",
"-kernel_afdo",
],
["foo", "bar"],
)
bki_mock.assert_called_once_with(
os.path.join(self.tempdir, minios.MINIOS_KERNEL_IMAGE),
boot_args=(
"noinitrd panic=60 cros_minios_version=0.0.0.0 cros_minios"
),
serial="foo-tty",
keys_dir="foo-keys-dir",
public_key="foo-public-key",
private_key="foo-private-key",
keyblock="foo-keyblock",
)
def testCreateMiniOsKernelImageDeveloperMode(self):
"""Tests CreateMiniOsKernelImage() with developer mode enabled."""
bck_mock = self.PatchObject(
kernel_builder.Builder, "CreateCustomKernel"
)
bki_mock = self.PatchObject(kernel_builder.Builder, "CreateKernelImage")
minios.CreateMiniOsKernelImage(
"foo-board",
"0.0.0.0",
self.tempdir,
"foo-keys-dir",
"foo-public-key",
"foo-private-key",
"foo-keyblock",
"foo-tty",
16,
developer_mode=True,
)
bck_mock.assert_called_once_with(
[
"minios",
"minios_ramfs",
"tpm",
"i2cdev",
"vfat",
"kernel_compress_xz",
"pcserial",
"-kernel_afdo",
],
[],
)
bki_mock.assert_called_once_with(
os.path.join(self.tempdir, minios.MINIOS_KERNEL_IMAGE),
boot_args=(
"noinitrd panic=60 cros_minios_version=0.0.0.0 cros_minios "
"cros_debug"
),
serial="foo-tty",
keys_dir="foo-keys-dir",
public_key="foo-public-key",
private_key="foo-private-key",
keyblock="foo-keyblock",
)
def testCreateMiniOsKernelImageBuildDisabled(self):
"""Tests CreateMiniOsKernelImage() with kernel build disabled."""
bck_mock = self.PatchObject(
kernel_builder.Builder, "CreateCustomKernel"
)
bki_mock = self.PatchObject(kernel_builder.Builder, "CreateKernelImage")
minios.CreateMiniOsKernelImage(
"foo-board",
"0.0.0.0",
self.tempdir,
"foo-keys-dir",
"foo-public-key",
"foo-private-key",
"foo-keyblock",
"foo-tty",
16,
False,
True,
)
bck_mock.assert_not_called()
bki_mock.assert_called_once_with(
os.path.join(self.tempdir, minios.MINIOS_KERNEL_IMAGE),
boot_args=(
"noinitrd panic=60 cros_minios_version=0.0.0.0 cros_minios "
"cros_debug"
),
serial="foo-tty",
keys_dir="foo-keys-dir",
public_key="foo-public-key",
private_key="foo-private-key",
keyblock="foo-keyblock",
)
def testInsertMiniOsKernelImage(self):
"""Tests InsertMiniOsKernelImage()."""
kernel_path = os.path.join(self.tempdir, minios.MINIOS_KERNEL_IMAGE)
osutils.WriteFile(kernel_path, "helloworld")
minios.InsertMiniOsKernelImage("foo-image", kernel_path)
self.assertCommandCalled(
[
"sudo",
"--",
"dd",
"if=/dev/zero",
"of=/foo/dev0",
"bs=512",
"seek=0",
"count=4",
]
)
self.assertCommandCalled(
[
"sudo",
"--",
"dd",
"if=/dev/zero",
"of=/foo/dev1",
"bs=512",
"seek=0",
"count=8",
]
)
self.assertCommandCalled(
["sudo", "--", "dd", f"if={kernel_path}", "of=/foo/dev0", "bs=512"]
)
self.assertCommandCalled(
["sudo", "--", "dd", f"if={kernel_path}", "of=/foo/dev1", "bs=512"]
)
def testInsertMiniOsLargerKernelImage(self):
"""Tests InsertMiniOsKernelImage()."""
kernel_path = os.path.join(self.tempdir, minios.MINIOS_KERNEL_IMAGE)
osutils.WriteFile(kernel_path, "a" * (minios.BLOCK_SIZE + 1))
minios.InsertMiniOsKernelImage("foo-image", kernel_path)
self.assertCommandCalled(
[
"sudo",
"--",
"dd",
"if=/dev/zero",
"of=/foo/dev0",
"bs=512",
"seek=1",
"count=3",
]
)
self.assertCommandCalled(
[
"sudo",
"--",
"dd",
"if=/dev/zero",
"of=/foo/dev1",
"bs=512",
"seek=1",
"count=7",
]
)
self.assertCommandCalled(
["sudo", "--", "dd", f"if={kernel_path}", "of=/foo/dev0", "bs=512"]
)
self.assertCommandCalled(
["sudo", "--", "dd", f"if={kernel_path}", "of=/foo/dev1", "bs=512"]
)
def testLargeKernelFail(self):
"""Tests that larger than partition kernel image should fail."""
kernel_path = os.path.join(self.tempdir, minios.MINIOS_KERNEL_IMAGE)
osutils.WriteFile(kernel_path, "\0" * 512 * 5)
with self.assertRaisesRegex(minios.MiniOsError, "larger than"):
minios.InsertMiniOsKernelImage("foo-image", kernel_path)
def testNoMiniOsPartitionFail(self):
"""Tests fail if no MiniOS partition is found."""
self.PatchObject(
self.image, "GetPartitionInfo", side_effect=KeyError("foo")
)
with self.assertRaisesRegex(KeyError, "foo"):
minios.InsertMiniOsKernelImage("foo-image", "foo-path")