| //===----------------------------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/CAS/BuiltinUnifiedCASDatabases.h" |
| #include "CASTestConfig.h" |
| #include "llvm/CAS/ActionCache.h" |
| #include "llvm/CAS/ObjectStore.h" |
| #include "llvm/Testing/Support/Error.h" |
| #include "llvm/Testing/Support/SupportHelpers.h" |
| #include "gtest/gtest.h" |
| |
| using namespace llvm; |
| using namespace llvm::cas; |
| |
| TEST_F(OnDiskCASTest, UnifiedCASMaterializationCheckPreventsGarbageCollection) { |
| unittest::TempDir Temp("on-disk-unified-cas", /*Unique=*/true); |
| |
| auto WithCAS = [&](llvm::function_ref<void(ObjectStore &)> Action) { |
| std::pair<std::unique_ptr<ObjectStore>, std::unique_ptr<ActionCache>> DBs; |
| ASSERT_THAT_ERROR( |
| createOnDiskUnifiedCASDatabases(Temp.path()).moveInto(DBs), |
| Succeeded()); |
| ObjectStore &CAS = *DBs.first; |
| ASSERT_THAT_ERROR(CAS.setSizeLimit(1), Succeeded()); |
| Action(CAS); |
| }; |
| |
| std::optional<CASID> ID; |
| |
| // Create an object in the CAS. |
| WithCAS([&ID](ObjectStore &CAS) { |
| std::optional<ObjectRef> Ref; |
| ASSERT_THAT_ERROR(CAS.store({}, "blah").moveInto(Ref), Succeeded()); |
| ASSERT_TRUE(Ref.has_value()); |
| |
| ID = CAS.getID(*Ref); |
| }); |
| |
| // Check materialization and prune the storage. |
| WithCAS([&ID](ObjectStore &CAS) { |
| std::optional<ObjectRef> Ref = CAS.getReference(*ID); |
| ASSERT_TRUE(Ref.has_value()); |
| |
| std::optional<bool> IsMaterialized; |
| ASSERT_THAT_ERROR(CAS.isMaterialized(*Ref).moveInto(IsMaterialized), |
| Succeeded()); |
| ASSERT_TRUE(IsMaterialized); |
| |
| ASSERT_THAT_ERROR(CAS.pruneStorageData(), Succeeded()); |
| }); |
| |
| // Verify that the previous materialization check kept the object in the CAS. |
| WithCAS([&ID](ObjectStore &CAS) { |
| std::optional<ObjectRef> Ref = CAS.getReference(*ID); |
| ASSERT_TRUE(Ref.has_value()); |
| |
| std::optional<bool> IsMaterialized; |
| ASSERT_THAT_ERROR(CAS.isMaterialized(*Ref).moveInto(IsMaterialized), |
| Succeeded()); |
| ASSERT_TRUE(IsMaterialized); |
| }); |
| } |