diff options
Diffstat (limited to 'pw_software_update/update_bundle_test.cc')
-rw-r--r-- | pw_software_update/update_bundle_test.cc | 71 |
1 files changed, 38 insertions, 33 deletions
diff --git a/pw_software_update/update_bundle_test.cc b/pw_software_update/update_bundle_test.cc index 927c0e6ed..e35987a38 100644 --- a/pw_software_update/update_bundle_test.cc +++ b/pw_software_update/update_bundle_test.cc @@ -15,8 +15,10 @@ #include <array> #include "gtest/gtest.h" +#include "pw_blob_store/blob_store.h" #include "pw_kvs/fake_flash_memory.h" #include "pw_kvs/test_key_value_store.h" +#include "pw_software_update/blob_store_openable_reader.h" #include "pw_software_update/bundled_update_backend.h" #include "pw_software_update/update_bundle_accessor.h" #include "pw_stream/memory_stream.h" @@ -67,9 +69,9 @@ class TestBundledUpdateBackend final : public BundledUpdateBackend { void SetManifestWriter(stream::Writer* writer) { manifest_writer_ = writer; } - virtual Result<stream::SeekableReader*> GetRootMetadataReader() override { + Result<stream::SeekableReader*> GetRootMetadataReader() override { return &trusted_root_reader_; - }; + } Status BeforeManifestRead() override { before_manifest_read_called_ = true; @@ -77,7 +79,7 @@ class TestBundledUpdateBackend final : public BundledUpdateBackend { return OkStatus(); } return Status::NotFound(); - }; + } bool BeforeManifestReadCalled() { return before_manifest_read_called_; } @@ -103,12 +105,12 @@ class TestBundledUpdateBackend final : public BundledUpdateBackend { return manifest_writer_; } - virtual Status SafelyPersistRootMetadata( + Status SafelyPersistRootMetadata( [[maybe_unused]] stream::IntervalReader root_metadata) override { new_root_persisted_ = true; trusted_root_reader_ = root_metadata; return OkStatus(); - }; + } bool IsNewRootPersisted() const { return new_root_persisted_; } @@ -120,7 +122,6 @@ class TestBundledUpdateBackend final : public BundledUpdateBackend { bool before_manifest_write_called_ = false; bool after_manifest_write_called_ = false; bool new_root_persisted_ = false; - size_t backend_verified_files_ = 0; // A memory reader for buffer passed by SetTrustedRoot(). This will be used // to back `trusted_root_reader_` @@ -136,12 +137,15 @@ class UpdateBundleTest : public testing::Test { blob_partition_, nullptr, kvs::TestKvs(), - kBufferSize) {} + kBufferSize), + blob_reader_(bundle_blob_) {} blob_store::BlobStoreBuffer<kBufferSize>& bundle_blob() { return bundle_blob_; } + BlobStoreOpenableReader& blob_reader() { return blob_reader_; } + TestBundledUpdateBackend& backend() { return backend_; } void StageTestBundle(ConstByteSpan bundle_data) { @@ -188,6 +192,7 @@ class UpdateBundleTest : public testing::Test { kvs::FakeFlashMemoryBuffer<kSectorSize, kSectorCount> blob_flash_; kvs::FlashPartition blob_partition_; blob_store::BlobStoreBuffer<kBufferSize> bundle_blob_; + BlobStoreOpenableReader blob_reader_; std::array<std::byte, kMetadataBufferSize> metadata_buffer_; TestBundledUpdateBackend backend_; }; @@ -197,7 +202,7 @@ class UpdateBundleTest : public testing::Test { TEST_F(UpdateBundleTest, GetTargetPayload) { backend().SetTrustedRoot(kDevSignedRoot); StageTestBundle(kTestDevBundle); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); ASSERT_OK(update_bundle.OpenAndVerify()); @@ -230,7 +235,7 @@ TEST_F(UpdateBundleTest, GetTargetPayload) { TEST_F(UpdateBundleTest, PersistManifest) { backend().SetTrustedRoot(kDevSignedRoot); StageTestBundle(kTestDevBundle); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); ASSERT_OK(update_bundle.OpenAndVerify()); @@ -251,7 +256,7 @@ TEST_F(UpdateBundleTest, PersistManifest) { TEST_F(UpdateBundleTest, PersistManifestFailIfNotVerified) { backend().SetTrustedRoot(kDevSignedRoot); StageTestBundle(kTestBadProdSignature); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); ASSERT_FAIL(update_bundle.OpenAndVerify()); @@ -268,7 +273,7 @@ TEST_F(UpdateBundleTest, PersistManifestFailIfNotVerified) { TEST_F(UpdateBundleTest, SelfVerificationWithIncomingRoot) { StageTestBundle(kTestDevBundleWithRoot); UpdateBundleAccessor update_bundle( - bundle_blob(), backend(), /* disable_verification = */ true); + blob_reader(), backend(), /* self_verification = */ true); ASSERT_OK(update_bundle.OpenAndVerify()); // Self verification must not persist anything. @@ -288,7 +293,7 @@ TEST_F(UpdateBundleTest, SelfVerificationWithIncomingRoot) { TEST_F(UpdateBundleTest, SelfVerificationWithoutIncomingRoot) { StageTestBundle(kTestDevBundle); UpdateBundleAccessor update_bundle( - bundle_blob(), backend(), /* disable_verification = */ true); + blob_reader(), backend(), /* self_verification = */ true); ASSERT_OK(update_bundle.OpenAndVerify()); } @@ -296,7 +301,7 @@ TEST_F(UpdateBundleTest, SelfVerificationWithoutIncomingRoot) { TEST_F(UpdateBundleTest, SelfVerificationWithMessedUpRoot) { StageTestBundle(kTestDevBundleWithProdRoot); UpdateBundleAccessor update_bundle( - bundle_blob(), backend(), /* disable_verification = */ true); + blob_reader(), backend(), /* self_verification = */ true); ASSERT_FAIL(update_bundle.OpenAndVerify()); } @@ -304,7 +309,7 @@ TEST_F(UpdateBundleTest, SelfVerificationWithMessedUpRoot) { TEST_F(UpdateBundleTest, SelfVerificationChecksMissingHashes) { StageTestBundle(kTestBundleMissingTargetHashFile0); UpdateBundleAccessor update_bundle( - bundle_blob(), backend(), /* disable_verification = */ true); + blob_reader(), backend(), /* self_verification = */ true); ASSERT_FAIL(update_bundle.OpenAndVerify()); } @@ -312,7 +317,7 @@ TEST_F(UpdateBundleTest, SelfVerificationChecksMissingHashes) { TEST_F(UpdateBundleTest, SelfVerificationChecksBadHashes) { StageTestBundle(kTestBundleMismatchedTargetHashFile0); UpdateBundleAccessor update_bundle( - bundle_blob(), backend(), /* disable_verification = */ true); + blob_reader(), backend(), /* self_verification = */ true); ASSERT_FAIL(update_bundle.OpenAndVerify()); } @@ -320,7 +325,7 @@ TEST_F(UpdateBundleTest, SelfVerificationChecksBadHashes) { TEST_F(UpdateBundleTest, SelfVerificationIgnoresUnsignedBundle) { StageTestBundle(kTestUnsignedBundleWithRoot); UpdateBundleAccessor update_bundle( - bundle_blob(), backend(), /* disable_verification = */ true); + blob_reader(), backend(), /* self_verification = */ true); ASSERT_OK(update_bundle.OpenAndVerify()); } @@ -329,7 +334,7 @@ TEST_F(UpdateBundleTest, OpenAndVerifySucceedsWithAllVerification) { backend().SetTrustedRoot(kDevSignedRoot); backend().SetCurrentManifest(kTestBundleManifest); StageTestBundle(kTestProdBundle); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); ASSERT_FALSE(backend().IsNewRootPersisted()); ASSERT_FALSE(backend().BeforeManifestReadCalled()); @@ -349,7 +354,7 @@ TEST_F(UpdateBundleTest, // pw_software_update/py/pw_software_update/generate_test_bundle.py for // detail of generation. StageTestBundle(kTestDevBundle); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); ASSERT_FALSE(backend().IsNewRootPersisted()); ASSERT_FALSE(backend().BeforeManifestReadCalled()); @@ -369,7 +374,7 @@ TEST_F(UpdateBundleTest, OpenAndVerifyFailsOnMismatchedRootKeyAndSignature) { // See pw_software_update/py/pw_software_update/generate_test_bundle.py for // detail of generation. StageTestBundle(kTestMismatchedRootKeyAndSignature); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); CheckOpenAndVerifyFail(update_bundle, false); } @@ -377,7 +382,7 @@ TEST_F(UpdateBundleTest, OpenAndVerifyFailsOnBadProdSignature) { backend().SetTrustedRoot(kDevSignedRoot); backend().SetCurrentManifest(kTestBundleManifest); StageTestBundle(kTestBadProdSignature); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); CheckOpenAndVerifyFail(update_bundle, false); } @@ -385,7 +390,7 @@ TEST_F(UpdateBundleTest, OpenAndVerifyFailsOnBadTargetsSignature) { backend().SetTrustedRoot(kDevSignedRoot); backend().SetCurrentManifest(kTestBundleManifest); StageTestBundle(kTestBadTargetsSignature); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); CheckOpenAndVerifyFail(update_bundle, true); } @@ -393,14 +398,14 @@ TEST_F(UpdateBundleTest, OpenAndVerifyFailsOnBadTargetsRollBack) { backend().SetTrustedRoot(kDevSignedRoot); backend().SetCurrentManifest(kTestBundleManifest); StageTestBundle(kTestTargetsRollback); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); CheckOpenAndVerifyFail(update_bundle, true); } TEST_F(UpdateBundleTest, OpenAndVerifySucceedsWithoutExistingManifest) { backend().SetTrustedRoot(kDevSignedRoot); StageTestBundle(kTestProdBundle); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); ASSERT_FALSE(backend().IsNewRootPersisted()); ASSERT_OK(update_bundle.OpenAndVerify()); @@ -411,7 +416,7 @@ TEST_F(UpdateBundleTest, OpenAndVerifyFailsOnRootRollback) { backend().SetTrustedRoot(kDevSignedRoot); backend().SetCurrentManifest(kTestBundleManifest); StageTestBundle(kTestRootRollback); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); CheckOpenAndVerifyFail(update_bundle, false); } @@ -422,7 +427,7 @@ TEST_F(UpdateBundleTest, OpenAndVerifyFailsOnMismatchedTargetHashFile0) { // pw_software_update/py/pw_software_update/generate_test_bundle.py. // The hash value for file 0 in the targets metadata is made incorrect. StageTestBundle(kTestBundleMismatchedTargetHashFile0); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); CheckOpenAndVerifyFail(update_bundle, true); } @@ -433,7 +438,7 @@ TEST_F(UpdateBundleTest, OpenAndVerifyFailsOnMismatchedTargetHashFile1) { // pw_software_update/py/pw_software_update/generate_test_bundle.py // The hash value for file 1 in the targets metadata is made incorrect. StageTestBundle(kTestBundleMismatchedTargetHashFile1); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); CheckOpenAndVerifyFail(update_bundle, true); } @@ -444,7 +449,7 @@ TEST_F(UpdateBundleTest, OpenAndVerifyFailsOnMissingTargetHashFile0) { // pw_software_update/py/pw_software_update/generate_test_bundle.py. // The hash value for file 0 is removed. StageTestBundle(kTestBundleMissingTargetHashFile0); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); CheckOpenAndVerifyFail(update_bundle, true); } @@ -455,7 +460,7 @@ TEST_F(UpdateBundleTest, OpenAndVerifyFailsOnMissingTargetHashFile1) { // pw_software_update/py/pw_software_update/generate_test_bundle.py // The hash value for file 1 is removed. StageTestBundle(kTestBundleMissingTargetHashFile1); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); CheckOpenAndVerifyFail(update_bundle, true); } @@ -466,7 +471,7 @@ TEST_F(UpdateBundleTest, OpenAndVerifyFailsOnMismatchedTargetLengthFile0) { // pw_software_update/py/pw_software_update/generate_test_bundle.py. // The length value for file 0 in the targets metadata is made incorrect (1). StageTestBundle(kTestBundleMismatchedTargetLengthFile0); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); CheckOpenAndVerifyFail(update_bundle, true); } @@ -477,7 +482,7 @@ TEST_F(UpdateBundleTest, OpenAndVerifyFailsOnMismatchedTargetLengthFile1) { // pw_software_update/py/pw_software_update/generate_test_bundle.py. // The length value for file 0 in the targets metadata is made incorrect (1). StageTestBundle(kTestBundleMismatchedTargetLengthFile1); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); CheckOpenAndVerifyFail(update_bundle, true); } @@ -489,7 +494,7 @@ TEST_F(UpdateBundleTest, OpenAndVerifySucceedsWithPersonalizedOutFile0) { // The payload for file 0 is removed from the bundle to emulate being // personalized out. StageTestBundle(kTestBundlePersonalizedOutFile0); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); ASSERT_OK(update_bundle.OpenAndVerify()); } @@ -502,7 +507,7 @@ TEST_F(UpdateBundleTest, OpenAndVerifySucceedsWithPersonalizedOutFile1) { // The payload for file 1 is removed from the bundle to emulate being // personalized out. StageTestBundle(kTestBundlePersonalizedOutFile1); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); ASSERT_OK(update_bundle.OpenAndVerify()); } @@ -515,7 +520,7 @@ TEST_F(UpdateBundleTest, // The payload for file 0 is removed from the bundle to emulate being // personalized out. StageTestBundle(kTestBundlePersonalizedOutFile0); - UpdateBundleAccessor update_bundle(bundle_blob(), backend()); + UpdateBundleAccessor update_bundle(blob_reader(), backend()); ASSERT_FAIL(update_bundle.OpenAndVerify()); } |