blob: b589a2574a8b1fc3aa1312e7e311282659821596 [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.
"""Payload service tests."""
from chromite.api.gen.chromite.api import payload_pb2
from chromite.api.gen.chromiumos import common_pb2
from chromite.lib import chroot_lib
from chromite.lib import cros_build_lib
from chromite.lib import cros_test_lib
from chromite.lib import osutils
from chromite.lib.paygen import gspaths
from chromite.lib.paygen import paygen_payload_lib
from chromite.service import payload
class PayloadServiceTest(cros_test_lib.MockTempDirTestCase):
"""Unsigned payload generation tests."""
def setUp(self) -> None:
"""Set up a payload test with the Run method mocked."""
self.PatchObject(
paygen_payload_lib.PaygenPayload,
"CreateUnsignedPayloads",
return_value={1: ("/foo/path.bin", "foo/path.json")},
)
self.PatchObject(
paygen_payload_lib.PaygenPayload,
"FinalizePayloads",
return_value={1: ("/foo/path", None)},
)
# Common build defs.
self.src_build = payload_pb2.Build(
version="1.0.0",
bucket="test",
channel="test-channel",
build_target=common_pb2.BuildTarget(name="cave"),
)
self.tgt_build = payload_pb2.Build(
version="2.0.0",
bucket="test",
channel="test-channel",
build_target=common_pb2.BuildTarget(name="cave"),
)
self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=False)
self.chroot = chroot_lib.Chroot(
path=self.tempdir / "chroot", out_path=self.tempdir / "out"
)
osutils.SafeMakedirs(self.chroot.tmp)
def testUnsigned(self) -> None:
"""Test the happy path on unsigned images."""
# Image defs.
src_image = payload_pb2.UnsignedImage(
build=self.src_build, image_type="IMAGE_TYPE_BASE", milestone="R79"
)
tgt_image = payload_pb2.UnsignedImage(
build=self.tgt_build, image_type="IMAGE_TYPE_BASE", milestone="R80"
)
payload_config = payload.PayloadConfig(
self.chroot,
tgt_image=tgt_image,
src_image=src_image,
dest_bucket="test",
verify=True,
upload=True,
)
unsigned_payloads = payload_config.GenerateUnsignedPayload()
payload_config.FinalizePayload(unsigned_payloads.values())
def testLocalSigning(self) -> None:
"""Test the local signing flow (using unsigned images)."""
# Image defs.
src_image = payload_pb2.UnsignedImage(
build=self.src_build, image_type="IMAGE_TYPE_BASE", milestone="R79"
)
tgt_image = payload_pb2.UnsignedImage(
build=self.tgt_build, image_type="IMAGE_TYPE_BASE", milestone="R80"
)
docker_image = "us-docker.pkg.dev/chromeos-bot/signing/signing:16963491"
payload_config = payload.PayloadConfig(
self.chroot,
tgt_image=tgt_image,
src_image=src_image,
dest_bucket="test",
verify=True,
upload=True,
use_local_signing=True,
signing_docker_image=docker_image,
keyset="DevPreMPKeys",
)
unsigned_payloads = payload_config.GenerateUnsignedPayload()
payload_config.FinalizePayload(unsigned_payloads.values())
def testLocalSigningFailsNoDockerImage(self) -> None:
"""Test that local signing fails when no docker image is specified."""
# Image defs.
src_image = payload_pb2.UnsignedImage(
build=self.src_build, image_type="IMAGE_TYPE_BASE", milestone="R79"
)
tgt_image = payload_pb2.UnsignedImage(
build=self.tgt_build, image_type="IMAGE_TYPE_BASE", milestone="R80"
)
with self.assertRaises(ValueError):
payload.PayloadConfig(
self.chroot,
tgt_image=tgt_image,
src_image=src_image,
dest_bucket="test",
verify=True,
upload=True,
use_local_signing=True,
)
def testLocalSigningFailsNoKeyset(self) -> None:
"""Test that local signing fails when no keyset is specified."""
# Image defs.
src_image = payload_pb2.UnsignedImage(
build=self.src_build, image_type="IMAGE_TYPE_BASE", milestone="R79"
)
tgt_image = payload_pb2.UnsignedImage(
build=self.tgt_build, image_type="IMAGE_TYPE_BASE", milestone="R80"
)
docker_image = "us-docker.pkg.dev/chromeos-bot/signing/signing:16963491"
with self.assertRaises(ValueError):
payload.PayloadConfig(
self.chroot,
tgt_image=tgt_image,
src_image=src_image,
dest_bucket="test",
verify=True,
upload=True,
use_local_signing=True,
signing_docker_image=docker_image,
)
def testSigned(self) -> None:
"""Test the happy path on signed images."""
# Image defs.
src_image = payload_pb2.SignedImage(
build=self.src_build, image_type="IMAGE_TYPE_BASE", key="cave-mp-v4"
)
tgt_image = payload_pb2.SignedImage(
build=self.tgt_build, image_type="IMAGE_TYPE_BASE", key="cave-mp-v4"
)
payload_config = payload.PayloadConfig(
self.chroot,
tgt_image=tgt_image,
src_image=src_image,
dest_bucket="test",
verify=True,
upload=True,
)
self.assertEqual("cave-mp-v4", payload_config.payload.tgt_image.key)
unsigned_payloads = payload_config.GenerateUnsignedPayload()
payload_config.FinalizePayload(unsigned_payloads.values())
def testFullUpdate(self) -> None:
"""Test the happy path on full updates."""
# Image def.
tgt_image = payload_pb2.UnsignedImage(
build=self.tgt_build, image_type="IMAGE_TYPE_BASE", milestone="R80"
)
payload_config = payload.PayloadConfig(
self.chroot,
tgt_image=tgt_image,
src_image=None,
dest_bucket="test",
verify=True,
upload=True,
)
unsigned_payloads = payload_config.GenerateUnsignedPayload()
payload_config.FinalizePayload(unsigned_payloads.values())
def testSignedMiniOS(self) -> None:
"""Test the happy path on signed minios images."""
# Image defs.
src_image = payload_pb2.SignedImage(
build=self.src_build, image_type="IMAGE_TYPE_BASE", key="cave-mp-v4"
)
tgt_image = payload_pb2.SignedImage(
build=self.tgt_build, image_type="IMAGE_TYPE_BASE", key="cave-mp-v4"
)
payload_config = payload.PayloadConfig(
self.chroot,
tgt_image=tgt_image,
src_image=src_image,
dest_bucket="test",
minios=True,
verify=True,
upload=True,
)
unsigned_payloads = payload_config.GenerateUnsignedPayload()
payload_config.FinalizePayload(unsigned_payloads.values())
self.assertTrue(gspaths.IsMiniOSImage(payload_config.payload.tgt_image))
def testUnsignedMiniOS(self) -> None:
"""Test the happy path on unsigned minios images."""
# Image defs.
src_image = payload_pb2.UnsignedImage(
build=self.src_build, image_type="IMAGE_TYPE_BASE", milestone="R79"
)
tgt_image = payload_pb2.UnsignedImage(
build=self.tgt_build, image_type="IMAGE_TYPE_BASE", milestone="R80"
)
payload_config = payload.PayloadConfig(
self.chroot,
tgt_image=tgt_image,
src_image=src_image,
dest_bucket="test",
minios=True,
verify=True,
upload=True,
)
unsigned_payloads = payload_config.GenerateUnsignedPayload()
payload_config.FinalizePayload(unsigned_payloads.values())
self.assertTrue(
gspaths.IsUnsignedMiniOSImageArchive(
payload_config.payload.tgt_image
)
)