Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4c17a070 authored by David Anderson's avatar David Anderson
Browse files

libsnapshot: Fix test failures on certain configurations.

Due to how CF is built and tested, VABC is enabled even when not
supported by the kernel. To work around this add some logic in
libsnapshot and the test harness to recognize this situation and
silently flip off the VABC flag.

This also fixes the -force_mode option to vts_libsnapshot_test, so that
it will skip tests that aren't supported by the device.

Bug: 264279496
Test: vts_libsnapshot_test on 11-5.4 with vabc enabled
Change-Id: I4c1e88fac54732c21c88169a7e0dd664e3858b89
parent 42908c45
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -3216,6 +3216,8 @@ Return SnapshotManager::CreateUpdateSnapshots(const DeltaArchiveManifest& manife
        vabc_disable_reason = "recovery";
    } else if (!cow_format_support) {
        vabc_disable_reason = "cow format not supported";
    } else if (!KernelSupportsCompressedSnapshots()) {
        vabc_disable_reason = "kernel missing userspace block device support";
    }

    if (!vabc_disable_reason.empty()) {
+34 −1
Original line number Diff line number Diff line
@@ -124,6 +124,10 @@ class SnapshotTest : public ::testing::Test {
        SKIP_IF_NON_VIRTUAL_AB();

        SetupProperties();
        if (!DeviceSupportsMode()) {
            GTEST_SKIP() << "Mode not supported on this device";
        }

        InitializeState();
        CleanupTestArtifacts();
        FormatFakeSuper();
@@ -159,9 +163,15 @@ class SnapshotTest : public ::testing::Test {
        IPropertyFetcher::OverrideForTesting(std::move(fetcher));

        if (GetLegacyCompressionEnabledProperty() || CanUseUserspaceSnapshots()) {
            // If we're asked to test the device's actual configuration, then it
            // may be misconfigured, so check for kernel support as libsnapshot does.
            if (FLAGS_force_mode.empty()) {
                snapuserd_required_ = KernelSupportsCompressedSnapshots();
            } else {
                snapuserd_required_ = true;
            }
        }
    }

    void TearDown() override {
        RETURN_IF_NON_VIRTUAL_AB();
@@ -176,6 +186,16 @@ class SnapshotTest : public ::testing::Test {
        LOG(INFO) << "Teardown complete for test: " << test_name_;
    }

    bool DeviceSupportsMode() {
        if (FLAGS_force_mode.empty()) {
            return true;
        }
        if (snapuserd_required_ && !KernelSupportsCompressedSnapshots()) {
            return false;
        }
        return true;
    }

    void InitializeState() {
        ASSERT_TRUE(sm->EnsureImageManager());
        image_manager_ = sm->image_manager();
@@ -193,6 +213,11 @@ class SnapshotTest : public ::testing::Test {
        // get an accurate list to remove.
        lock_ = nullptr;

        // If there is no image manager, the test was skipped.
        if (!image_manager_) {
            return;
        }

        std::vector<std::string> snapshots = {"test-snapshot", "test_partition_a",
                                              "test_partition_b"};
        for (const auto& snapshot : snapshots) {
@@ -946,6 +971,11 @@ class SnapshotUpdateTest : public SnapshotTest {
        SKIP_IF_NON_VIRTUAL_AB();

        SnapshotTest::SetUp();
        if (!image_manager_) {
            // Test was skipped.
            return;
        }

        Cleanup();

        // Cleanup() changes slot suffix, so initialize it again.
@@ -2680,6 +2710,9 @@ class ImageManagerTest : public SnapshotTest {
        CleanUp();
    }
    void CleanUp() {
        if (!image_manager_) {
            return;
        }
        EXPECT_TRUE(!image_manager_->BackingImageExists(kImageName) ||
                    image_manager_->DeleteBackingImage(kImageName));
    }
+10 −1
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@
#include <fs_mgr/roots.h>
#include <liblp/property_fetcher.h>

using android::dm::DeviceMapper;
using android::dm::kSectorSize;
using android::fiemap::FiemapStatus;
using android::fs_mgr::EnsurePathMounted;
@@ -251,7 +252,10 @@ bool CanUseUserspaceSnapshots() {
        LOG(INFO) << "Userspace snapshots disabled for testing";
        return false;
    }

    if (!KernelSupportsCompressedSnapshots()) {
        LOG(ERROR) << "Userspace snapshots requested, but no kernel support is available.";
        return false;
    }
    return true;
}

@@ -278,5 +282,10 @@ bool IsDmSnapshotTestingEnabled() {
    return fetcher->GetBoolProperty("snapuserd.test.dm.snapshots", false);
}

bool KernelSupportsCompressedSnapshots() {
    auto& dm = DeviceMapper::Instance();
    return dm.GetTargetByName("user", nullptr);
}

}  // namespace snapshot
}  // namespace android
+2 −0
Original line number Diff line number Diff line
@@ -127,6 +127,8 @@ std::ostream& operator<<(std::ostream& os, const Now&);
void AppendExtent(google::protobuf::RepeatedPtrField<chromeos_update_engine::Extent>* extents,
                  uint64_t start_block, uint64_t num_blocks);

bool KernelSupportsCompressedSnapshots();

bool GetLegacyCompressionEnabledProperty();
bool GetUserspaceSnapshotsEnabledProperty();
bool GetIouringEnabledProperty();