From a7c00a0943411596fab0632bbbd52f3d7e2e68ba Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Thu, 6 Aug 2020 16:12:37 -0700 Subject: [PATCH] libsnapshot_test: skip global setup on non-VAB devices. On non-VAB devices, fake super image creation may fail because it may not support f2fs file pinning. Also changes global setup to a testing::Environment object because it is the recommended way in gtest's guide. SnapshotTestEnvironement::TearDown is automatically executed before RUN_ALL_TEST returns. Test: vts_libsnapshot_test Test: make IsVirtualAbEnabled() return false, then all tests are skipped. Bug: 162557082 Change-Id: I1382f9a4ddec146fa2d8cfb21ac66ca22a2e110f --- .../include_test/libsnapshot/test_helpers.h | 17 +++ .../partition_cow_creator_test.cpp | 16 ++- .../snapshot_metadata_updater_test.cpp | 13 ++- fs_mgr/libsnapshot/snapshot_test.cpp | 103 ++++++++++-------- fs_mgr/libsnapshot/test_helpers.cpp | 5 + 5 files changed, 98 insertions(+), 56 deletions(-) diff --git a/fs_mgr/libsnapshot/include_test/libsnapshot/test_helpers.h b/fs_mgr/libsnapshot/include_test/libsnapshot/test_helpers.h index 98bf56af6..8e369b052 100644 --- a/fs_mgr/libsnapshot/include_test/libsnapshot/test_helpers.h +++ b/fs_mgr/libsnapshot/include_test/libsnapshot/test_helpers.h @@ -180,5 +180,22 @@ class LowSpaceUserdata { uint64_t bsize_ = 0; }; +bool IsVirtualAbEnabled(); + +#define SKIP_IF_NON_VIRTUAL_AB() \ + do { \ + if (!IsVirtualAbEnabled()) GTEST_SKIP() << "Test for Virtual A/B devices only"; \ + } while (0) + +#define RETURN_IF_NON_VIRTUAL_AB_MSG(msg) \ + do { \ + if (!IsVirtualAbEnabled()) { \ + std::cerr << (msg); \ + return; \ + } \ + } while (0) + +#define RETURN_IF_NON_VIRTUAL_AB() RETURN_IF_NON_VIRTUAL_AB_MSG("") + } // namespace snapshot } // namespace android diff --git a/fs_mgr/libsnapshot/partition_cow_creator_test.cpp b/fs_mgr/libsnapshot/partition_cow_creator_test.cpp index adfb97519..297022273 100644 --- a/fs_mgr/libsnapshot/partition_cow_creator_test.cpp +++ b/fs_mgr/libsnapshot/partition_cow_creator_test.cpp @@ -41,8 +41,14 @@ namespace snapshot { class PartitionCowCreatorTest : public ::testing::Test { public: - void SetUp() override { SnapshotTestPropertyFetcher::SetUp(); } - void TearDown() override { SnapshotTestPropertyFetcher::TearDown(); } + void SetUp() override { + SKIP_IF_NON_VIRTUAL_AB(); + SnapshotTestPropertyFetcher::SetUp(); + } + void TearDown() override { + RETURN_IF_NON_VIRTUAL_AB(); + SnapshotTestPropertyFetcher::TearDown(); + } }; TEST_F(PartitionCowCreatorTest, IntersectSelf) { @@ -223,6 +229,8 @@ TEST_F(PartitionCowCreatorTest, Zero) { } TEST(DmSnapshotInternals, CowSizeCalculator) { + SKIP_IF_NON_VIRTUAL_AB(); + DmSnapCowSizeCalculator cc(512, 8); unsigned long int b; @@ -286,7 +294,9 @@ struct OptimizeOperationTestParam { std::optional expected_output; }; -class OptimizeOperationTest : public ::testing::TestWithParam {}; +class OptimizeOperationTest : public ::testing::TestWithParam { + void SetUp() override { SKIP_IF_NON_VIRTUAL_AB(); } +}; TEST_P(OptimizeOperationTest, Test) { InstallOperation actual_output; EXPECT_EQ(GetParam().expected_output.has_value(), diff --git a/fs_mgr/libsnapshot/snapshot_metadata_updater_test.cpp b/fs_mgr/libsnapshot/snapshot_metadata_updater_test.cpp index 5530e59f0..0a16c03ce 100644 --- a/fs_mgr/libsnapshot/snapshot_metadata_updater_test.cpp +++ b/fs_mgr/libsnapshot/snapshot_metadata_updater_test.cpp @@ -43,11 +43,11 @@ namespace snapshot { class SnapshotMetadataUpdaterTest : public ::testing::TestWithParam { public: - SnapshotMetadataUpdaterTest() { - is_virtual_ab_ = android::base::GetBoolProperty("ro.virtual_ab.enabled", false); - } + SnapshotMetadataUpdaterTest() = default; void SetUp() override { + SKIP_IF_NON_VIRTUAL_AB(); + target_slot_ = GetParam(); target_suffix_ = SlotSuffixForSlotNumber(target_slot_); SnapshotTestPropertyFetcher::SetUp(SlotSuffixForSlotNumber(1 - target_slot_)); @@ -68,7 +68,11 @@ class SnapshotMetadataUpdaterTest : public ::testing::TestWithParam { ASSERT_TRUE(FillFakeMetadata(builder_.get(), manifest_, target_suffix_)); } - void TearDown() override { SnapshotTestPropertyFetcher::TearDown(); } + void TearDown() override { + RETURN_IF_NON_VIRTUAL_AB(); + + SnapshotTestPropertyFetcher::TearDown(); + } // Append suffix to name. std::string T(std::string_view name) { return std::string(name) + target_suffix_; } @@ -127,7 +131,6 @@ class SnapshotMetadataUpdaterTest : public ::testing::TestWithParam { << "."; } - bool is_virtual_ab_; std::unique_ptr builder_; uint32_t target_slot_; std::string target_suffix_; diff --git a/fs_mgr/libsnapshot/snapshot_test.cpp b/fs_mgr/libsnapshot/snapshot_test.cpp index 2bd013599..6ff935bac 100644 --- a/fs_mgr/libsnapshot/snapshot_test.cpp +++ b/fs_mgr/libsnapshot/snapshot_test.cpp @@ -83,9 +83,7 @@ void MountMetadata(); class SnapshotTest : public ::testing::Test { public: - SnapshotTest() : dm_(DeviceMapper::Instance()) { - is_virtual_ab_ = android::base::GetBoolProperty("ro.virtual_ab.enabled", false); - } + SnapshotTest() : dm_(DeviceMapper::Instance()) {} // This is exposed for main. void Cleanup() { @@ -95,7 +93,7 @@ class SnapshotTest : public ::testing::Test { protected: void SetUp() override { - if (!is_virtual_ab_) GTEST_SKIP() << "Test for Virtual A/B devices only"; + SKIP_IF_NON_VIRTUAL_AB(); SnapshotTestPropertyFetcher::SetUp(); InitializeState(); @@ -106,7 +104,7 @@ class SnapshotTest : public ::testing::Test { } void TearDown() override { - if (!is_virtual_ab_) return; + RETURN_IF_NON_VIRTUAL_AB(); lock_ = nullptr; @@ -341,7 +339,6 @@ class SnapshotTest : public ::testing::Test { } static constexpr std::chrono::milliseconds snapshot_timeout_ = 5s; - bool is_virtual_ab_; DeviceMapper& dm_; std::unique_ptr lock_; android::fiemap::IImageManager* image_manager_ = nullptr; @@ -722,11 +719,13 @@ class LockTestConsumer { class LockTest : public ::testing::Test { public: void SetUp() { + SKIP_IF_NON_VIRTUAL_AB(); first_consumer.StartHandleRequestsInBackground(); second_consumer.StartHandleRequestsInBackground(); } void TearDown() { + RETURN_IF_NON_VIRTUAL_AB(); EXPECT_TRUE(first_consumer.MakeRequest(Request::EXIT)); EXPECT_TRUE(second_consumer.MakeRequest(Request::EXIT)); } @@ -770,7 +769,7 @@ INSTANTIATE_TEST_SUITE_P( class SnapshotUpdateTest : public SnapshotTest { public: void SetUp() override { - if (!is_virtual_ab_) GTEST_SKIP() << "Test for Virtual A/B devices only"; + SKIP_IF_NON_VIRTUAL_AB(); SnapshotTest::SetUp(); Cleanup(); @@ -832,7 +831,7 @@ class SnapshotUpdateTest : public SnapshotTest { } } void TearDown() override { - if (!is_virtual_ab_) return; + RETURN_IF_NON_VIRTUAL_AB(); Cleanup(); SnapshotTest::TearDown(); @@ -1365,13 +1364,17 @@ TEST_F(SnapshotUpdateTest, MergeCannotRemoveCow) { ASSERT_EQ(UpdateState::MergeCompleted, init->ProcessUpdateState()); } -class MetadataMountedTest : public SnapshotUpdateTest { +class MetadataMountedTest : public ::testing::Test { public: + // This is so main() can instantiate this to invoke Cleanup. + virtual void TestBody() override {} void SetUp() override { + SKIP_IF_NON_VIRTUAL_AB(); metadata_dir_ = test_device->GetMetadataDir(); ASSERT_TRUE(ReadDefaultFstab(&fstab_)); } void TearDown() override { + RETURN_IF_NON_VIRTUAL_AB(); SetUp(); // Remount /metadata test_device->set_recovery(false); @@ -1702,8 +1705,6 @@ class FlashAfterUpdateTest : public SnapshotUpdateTest, }; TEST_P(FlashAfterUpdateTest, FlashSlotAfterUpdate) { - if (!is_virtual_ab_) GTEST_SKIP() << "Test for Virtual A/B devices only"; - // OTA client blindly unmaps all partitions that are possibly mapped. for (const auto& name : {"sys_b", "vnd_b", "prd_b"}) { ASSERT_TRUE(sm->UnmapUpdateSnapshot(name)); @@ -1803,14 +1804,13 @@ INSTANTIATE_TEST_SUITE_P(Snapshot, FlashAfterUpdateTest, Combine(Values(0, 1), B class ImageManagerTest : public SnapshotTest, public WithParamInterface { protected: void SetUp() override { - if (!is_virtual_ab_) GTEST_SKIP() << "Test for Virtual A/B devices only"; - + SKIP_IF_NON_VIRTUAL_AB(); SnapshotTest::SetUp(); userdata_ = std::make_unique(); ASSERT_TRUE(userdata_->Init(GetParam())); } void TearDown() override { - if (!is_virtual_ab_) return; + RETURN_IF_NON_VIRTUAL_AB(); return; // BUG(149738928) EXPECT_TRUE(!image_manager_->BackingImageExists(kImageName) || @@ -1852,11 +1852,6 @@ std::vector ImageManagerTestParams() { INSTANTIATE_TEST_SUITE_P(ImageManagerTest, ImageManagerTest, ValuesIn(ImageManagerTestParams())); -} // namespace snapshot -} // namespace android - -using namespace android::snapshot; - bool Mkdir(const std::string& path) { if (mkdir(path.c_str(), 0700) && errno != EEXIST) { std::cerr << "Could not mkdir " << path << ": " << strerror(errno) << std::endl; @@ -1865,8 +1860,21 @@ bool Mkdir(const std::string& path) { return true; } -int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); +class SnapshotTestEnvironment : public ::testing::Environment { + public: + ~SnapshotTestEnvironment() override {} + void SetUp() override; + void TearDown() override; + + private: + std::unique_ptr super_images_; +}; + +void SnapshotTestEnvironment::SetUp() { + // b/163082876: GTEST_SKIP in Environment will make atest report incorrect results. Until + // that is fixed, don't call GTEST_SKIP here, but instead call GTEST_SKIP in individual test + // suites. + RETURN_IF_NON_VIRTUAL_AB_MSG("Virtual A/B is not enabled, skipping global setup.\n"); std::vector paths = { // clang-format off @@ -1879,18 +1887,13 @@ int main(int argc, char** argv) { // clang-format on }; for (const auto& path : paths) { - if (!Mkdir(path)) { - return 1; - } + ASSERT_TRUE(Mkdir(path)); } // Create this once, otherwise, gsid will start/stop between each test. test_device = new TestDeviceInfo(); sm = SnapshotManager::New(test_device); - if (!sm) { - std::cerr << "Could not create snapshot manager\n"; - return 1; - } + ASSERT_NE(nullptr, sm) << "Could not create snapshot manager"; // Clean up previous run. MetadataMountedTest().TearDown(); @@ -1898,31 +1901,35 @@ int main(int argc, char** argv) { SnapshotTest().Cleanup(); // Use a separate image manager for our fake super partition. - auto super_images = IImageManager::Open("ota/test/super", 10s); - if (!super_images) { - std::cerr << "Could not create image manager\n"; - return 1; - } + super_images_ = IImageManager::Open("ota/test/super", 10s); + ASSERT_NE(nullptr, super_images_) << "Could not create image manager"; // Clean up any old copy. - DeleteBackingImage(super_images.get(), "fake-super"); + DeleteBackingImage(super_images_.get(), "fake-super"); // Create and map the fake super partition. static constexpr int kImageFlags = IImageManager::CREATE_IMAGE_DEFAULT | IImageManager::CREATE_IMAGE_ZERO_FILL; - if (!super_images->CreateBackingImage("fake-super", kSuperSize, kImageFlags)) { - std::cerr << "Could not create fake super partition\n"; - return 1; - } - if (!super_images->MapImageDevice("fake-super", 10s, &fake_super)) { - std::cerr << "Could not map fake super partition\n"; - return 1; - } + ASSERT_TRUE(super_images_->CreateBackingImage("fake-super", kSuperSize, kImageFlags)) + << "Could not create fake super partition"; + + ASSERT_TRUE(super_images_->MapImageDevice("fake-super", 10s, &fake_super)) + << "Could not map fake super partition"; test_device->set_fake_super(fake_super); - - auto result = RUN_ALL_TESTS(); - - DeleteBackingImage(super_images.get(), "fake-super"); - - return result; +} + +void SnapshotTestEnvironment::TearDown() { + RETURN_IF_NON_VIRTUAL_AB(); + if (super_images_ != nullptr) { + DeleteBackingImage(super_images_.get(), "fake-super"); + } +} + +} // namespace snapshot +} // namespace android + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + ::testing::AddGlobalTestEnvironment(new ::android::snapshot::SnapshotTestEnvironment()); + return RUN_ALL_TESTS(); } diff --git a/fs_mgr/libsnapshot/test_helpers.cpp b/fs_mgr/libsnapshot/test_helpers.cpp index de3d91246..b07bf9182 100644 --- a/fs_mgr/libsnapshot/test_helpers.cpp +++ b/fs_mgr/libsnapshot/test_helpers.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -241,5 +242,9 @@ uint64_t LowSpaceUserdata::bsize() const { return bsize_; } +bool IsVirtualAbEnabled() { + return android::base::GetBoolProperty("ro.virtual_ab.enabled", false); +} + } // namespace snapshot } // namespace android