Add and enforce MinorVersion in Payload Manifest.
The MinorVersion is also set to 0 for Full payloads, and to 1 for
DeltaPayloads (for now). If the field is not set, it defaults to 0.
The default is important, since Full payloads will be generated without this
value set in production because older payload generators will be used for
Full payloads for some time to come.
If an unexpected MinorVersion is received, we will refuse to process it, and
send an kErrorCodeUnsupportedMinorPayloadVersion error result.
Add unittests to delta_performer_unittests to unittest the ValidateManifest
method (never individually tested before).
BUG=chromium:322564
TEST=Unittests
Change-Id: Icbd2ebeb739431905497e79edb4b99629c8d6f7f
Reviewed-on: https://chromium-review.googlesource.com/177823
Reviewed-by: Don Garrett <dgarrett@chromium.org>
Commit-Queue: Don Garrett <dgarrett@chromium.org>
Tested-by: Don Garrett <dgarrett@chromium.org>
diff --git a/delta_performer_unittest.cc b/delta_performer_unittest.cc
index 80aa064..f02d1b7 100644
--- a/delta_performer_unittest.cc
+++ b/delta_performer_unittest.cc
@@ -630,6 +630,8 @@
InstallPlan install_plan;
install_plan.hash_checks_mandatory = hash_checks_mandatory;
install_plan.metadata_size = state->metadata_size;
+ install_plan.is_full_update = full_kernel && full_rootfs;
+
LOG(INFO) << "Setting payload metadata size in Omaha = "
<< state->metadata_size;
ASSERT_TRUE(PayloadSigner::GetMetadataSignature(
@@ -950,7 +952,28 @@
&state, hash_checks_mandatory, op_hash_test, &performer);
}
-class DeltaPerformerTest : public ::testing::Test { };
+
+class DeltaPerformerTest : public ::testing::Test {
+
+ public:
+ // Test helper placed where it can easily be friended from DeltaPerformer.
+ static void RunManifestValidation(DeltaArchiveManifest& manifest,
+ bool full_payload,
+ ErrorCode expected) {
+ PrefsMock prefs;
+ InstallPlan install_plan;
+ MockSystemState mock_system_state;
+ DeltaPerformer performer(&prefs, &mock_system_state, &install_plan);
+
+ // The install plan is for Full or Delta.
+ install_plan.is_full_update = full_payload;
+
+ // The Manifest we are validating.
+ performer.manifest_.CopyFrom(manifest);
+
+ EXPECT_EQ(expected, performer.ValidateManifest());
+ }
+};
TEST(DeltaPerformerTest, ExtentsToByteStringTest) {
uint64_t test[] = {1, 1, 4, 2, kSparseHole, 1, 0, 1};
@@ -974,6 +997,83 @@
EXPECT_EQ(expected_output, actual_output);
}
+TEST(DeltaPerformerTest, ValidateManifestFullGoodTest) {
+ // The Manifest we are validating.
+ DeltaArchiveManifest manifest;
+ manifest.mutable_new_kernel_info();
+ manifest.mutable_new_rootfs_info();
+ manifest.set_minor_version(DeltaPerformer::kFullPayloadMinorVersion);
+
+ DeltaPerformerTest::RunManifestValidation(manifest, true, kErrorCodeSuccess);
+}
+
+TEST(DeltaPerformerTest, ValidateManifestDeltaGoodTest) {
+ // The Manifest we are validating.
+ DeltaArchiveManifest manifest;
+ manifest.mutable_old_kernel_info();
+ manifest.mutable_old_rootfs_info();
+ manifest.mutable_new_kernel_info();
+ manifest.mutable_new_rootfs_info();
+ manifest.set_minor_version(DeltaPerformer::kSupportedMinorPayloadVersion);
+
+ DeltaPerformerTest::RunManifestValidation(manifest, false, kErrorCodeSuccess);
+}
+
+TEST(DeltaPerformerTest, ValidateManifestFullUnsetMinorVersion) {
+ // The Manifest we are validating.
+ DeltaArchiveManifest manifest;
+
+ DeltaPerformerTest::RunManifestValidation(manifest, true, kErrorCodeSuccess);
+}
+
+TEST(DeltaPerformerTest, ValidateManifestDeltaUnsetMinorVersion) {
+ // The Manifest we are validating.
+ DeltaArchiveManifest manifest;
+
+ DeltaPerformerTest::RunManifestValidation(
+ manifest, false,
+ kErrorCodeUnsupportedMinorPayloadVersion);
+}
+
+TEST(DeltaPerformerTest, ValidateManifestFullOldKernelTest) {
+ // The Manifest we are validating.
+ DeltaArchiveManifest manifest;
+ manifest.mutable_old_kernel_info();
+ manifest.mutable_new_kernel_info();
+ manifest.mutable_new_rootfs_info();
+ manifest.set_minor_version(DeltaPerformer::kSupportedMinorPayloadVersion);
+
+ DeltaPerformerTest::RunManifestValidation(
+ manifest, true,
+ kErrorCodePayloadMismatchedType);
+}
+
+TEST(DeltaPerformerTest, ValidateManifestFullOldRootfsTest) {
+ // The Manifest we are validating.
+ DeltaArchiveManifest manifest;
+ manifest.mutable_old_rootfs_info();
+ manifest.mutable_new_kernel_info();
+ manifest.mutable_new_rootfs_info();
+ manifest.set_minor_version(DeltaPerformer::kSupportedMinorPayloadVersion);
+
+ DeltaPerformerTest::RunManifestValidation(
+ manifest, true,
+ kErrorCodePayloadMismatchedType);
+}
+
+TEST(DeltaPerformerTest, ValidateManifestBadMinorVersion) {
+ // The Manifest we are validating.
+ DeltaArchiveManifest manifest;
+
+ // Generate a bad version number.
+ manifest.set_minor_version(DeltaPerformer::kSupportedMinorPayloadVersion +
+ 10000);
+
+ DeltaPerformerTest::RunManifestValidation(
+ manifest, false,
+ kErrorCodeUnsupportedMinorPayloadVersion);
+}
+
TEST(DeltaPerformerTest, RunAsRootSmallImageTest) {
DoSmallImageTest(false, false, false, -1, kSignatureGenerator,
false);