18bef5cd4SDuncan P. N. Exon Smith //===- InMemoryModuleCacheTest.cpp - InMemoryModuleCache tests ------------===// 28bef5cd4SDuncan P. N. Exon Smith // 38bef5cd4SDuncan P. N. Exon Smith // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 48bef5cd4SDuncan P. N. Exon Smith // See https://llvm.org/LICENSE.txt for license information. 58bef5cd4SDuncan P. N. Exon Smith // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 68bef5cd4SDuncan P. N. Exon Smith // 78bef5cd4SDuncan P. N. Exon Smith //===----------------------------------------------------------------------===// 88bef5cd4SDuncan P. N. Exon Smith 98bef5cd4SDuncan P. N. Exon Smith #include "clang/Serialization/InMemoryModuleCache.h" 108bef5cd4SDuncan P. N. Exon Smith #include "llvm/Support/MemoryBuffer.h" 118bef5cd4SDuncan P. N. Exon Smith #include "gtest/gtest.h" 128bef5cd4SDuncan P. N. Exon Smith 138bef5cd4SDuncan P. N. Exon Smith using namespace llvm; 148bef5cd4SDuncan P. N. Exon Smith using namespace clang; 158bef5cd4SDuncan P. N. Exon Smith 168bef5cd4SDuncan P. N. Exon Smith namespace { 178bef5cd4SDuncan P. N. Exon Smith 188bef5cd4SDuncan P. N. Exon Smith std::unique_ptr<MemoryBuffer> getBuffer(int I) { 198bef5cd4SDuncan P. N. Exon Smith SmallVector<char, 8> Bytes; 208bef5cd4SDuncan P. N. Exon Smith raw_svector_ostream(Bytes) << "data:" << I; 218bef5cd4SDuncan P. N. Exon Smith return MemoryBuffer::getMemBuffer(StringRef(Bytes.data(), Bytes.size()), "", 228bef5cd4SDuncan P. N. Exon Smith /* RequiresNullTerminator = */ false); 238bef5cd4SDuncan P. N. Exon Smith } 248bef5cd4SDuncan P. N. Exon Smith 250a2be46cSDuncan P. N. Exon Smith TEST(InMemoryModuleCacheTest, initialState) { 268bef5cd4SDuncan P. N. Exon Smith InMemoryModuleCache Cache; 270a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(InMemoryModuleCache::Unknown, Cache.getPCMState("B")); 280a2be46cSDuncan P. N. Exon Smith EXPECT_FALSE(Cache.isPCMFinal("B")); 290a2be46cSDuncan P. N. Exon Smith EXPECT_FALSE(Cache.shouldBuildPCM("B")); 308bef5cd4SDuncan P. N. Exon Smith 310a2be46cSDuncan P. N. Exon Smith #if !defined(NDEBUG) && GTEST_HAS_DEATH_TEST 320a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.tryToDropPCM("B"), "PCM to remove is unknown"); 330a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.finalizePCM("B"), "PCM to finalize is unknown"); 340a2be46cSDuncan P. N. Exon Smith #endif 358bef5cd4SDuncan P. N. Exon Smith } 368bef5cd4SDuncan P. N. Exon Smith 370a2be46cSDuncan P. N. Exon Smith TEST(InMemoryModuleCacheTest, addPCM) { 380a2be46cSDuncan P. N. Exon Smith auto B = getBuffer(1); 390a2be46cSDuncan P. N. Exon Smith auto *RawB = B.get(); 400a2be46cSDuncan P. N. Exon Smith 418bef5cd4SDuncan P. N. Exon Smith InMemoryModuleCache Cache; 420a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(RawB, &Cache.addPCM("B", std::move(B))); 430a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(InMemoryModuleCache::Tentative, Cache.getPCMState("B")); 440a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(RawB, Cache.lookupPCM("B")); 450a2be46cSDuncan P. N. Exon Smith EXPECT_FALSE(Cache.isPCMFinal("B")); 460a2be46cSDuncan P. N. Exon Smith EXPECT_FALSE(Cache.shouldBuildPCM("B")); 478bef5cd4SDuncan P. N. Exon Smith 480a2be46cSDuncan P. N. Exon Smith #if !defined(NDEBUG) && GTEST_HAS_DEATH_TEST 490a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.addPCM("B", getBuffer(2)), "Already has a PCM"); 500a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.addBuiltPCM("B", getBuffer(2)), 510a2be46cSDuncan P. N. Exon Smith "Trying to override tentative PCM"); 520a2be46cSDuncan P. N. Exon Smith #endif 530a2be46cSDuncan P. N. Exon Smith } 548bef5cd4SDuncan P. N. Exon Smith 550a2be46cSDuncan P. N. Exon Smith TEST(InMemoryModuleCacheTest, addBuiltPCM) { 560a2be46cSDuncan P. N. Exon Smith auto B = getBuffer(1); 570a2be46cSDuncan P. N. Exon Smith auto *RawB = B.get(); 588bef5cd4SDuncan P. N. Exon Smith 590a2be46cSDuncan P. N. Exon Smith InMemoryModuleCache Cache; 600a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(RawB, &Cache.addBuiltPCM("B", std::move(B))); 610a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(InMemoryModuleCache::Final, Cache.getPCMState("B")); 620a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(RawB, Cache.lookupPCM("B")); 630a2be46cSDuncan P. N. Exon Smith EXPECT_TRUE(Cache.isPCMFinal("B")); 640a2be46cSDuncan P. N. Exon Smith EXPECT_FALSE(Cache.shouldBuildPCM("B")); 650a2be46cSDuncan P. N. Exon Smith 660a2be46cSDuncan P. N. Exon Smith #if !defined(NDEBUG) && GTEST_HAS_DEATH_TEST 670a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.addPCM("B", getBuffer(2)), "Already has a PCM"); 680a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.addBuiltPCM("B", getBuffer(2)), 690a2be46cSDuncan P. N. Exon Smith "Trying to override finalized PCM"); 700a2be46cSDuncan P. N. Exon Smith #endif 710a2be46cSDuncan P. N. Exon Smith } 720a2be46cSDuncan P. N. Exon Smith 730a2be46cSDuncan P. N. Exon Smith TEST(InMemoryModuleCacheTest, tryToDropPCM) { 74*b7db2e9fSDuncan P. N. Exon Smith auto B1 = getBuffer(1); 75*b7db2e9fSDuncan P. N. Exon Smith auto B2 = getBuffer(2); 76*b7db2e9fSDuncan P. N. Exon Smith auto *RawB1 = B1.get(); 77*b7db2e9fSDuncan P. N. Exon Smith auto *RawB2 = B2.get(); 78*b7db2e9fSDuncan P. N. Exon Smith ASSERT_NE(RawB1, RawB2); 790a2be46cSDuncan P. N. Exon Smith 800a2be46cSDuncan P. N. Exon Smith InMemoryModuleCache Cache; 810a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(InMemoryModuleCache::Unknown, Cache.getPCMState("B")); 82*b7db2e9fSDuncan P. N. Exon Smith EXPECT_EQ(RawB1, &Cache.addPCM("B", std::move(B1))); 830a2be46cSDuncan P. N. Exon Smith EXPECT_FALSE(Cache.tryToDropPCM("B")); 840a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(nullptr, Cache.lookupPCM("B")); 850a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(InMemoryModuleCache::ToBuild, Cache.getPCMState("B")); 860a2be46cSDuncan P. N. Exon Smith EXPECT_FALSE(Cache.isPCMFinal("B")); 870a2be46cSDuncan P. N. Exon Smith EXPECT_TRUE(Cache.shouldBuildPCM("B")); 880a2be46cSDuncan P. N. Exon Smith 890a2be46cSDuncan P. N. Exon Smith #if !defined(NDEBUG) && GTEST_HAS_DEATH_TEST 900a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.addPCM("B", getBuffer(2)), "Already has a PCM"); 910a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.tryToDropPCM("B"), 920a2be46cSDuncan P. N. Exon Smith "PCM to remove is scheduled to be built"); 930a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.finalizePCM("B"), "Trying to finalize a dropped PCM"); 940a2be46cSDuncan P. N. Exon Smith #endif 950a2be46cSDuncan P. N. Exon Smith 960a2be46cSDuncan P. N. Exon Smith // Add a new one. 97*b7db2e9fSDuncan P. N. Exon Smith EXPECT_EQ(RawB2, &Cache.addBuiltPCM("B", std::move(B2))); 980a2be46cSDuncan P. N. Exon Smith EXPECT_TRUE(Cache.isPCMFinal("B")); 990a2be46cSDuncan P. N. Exon Smith 1000a2be46cSDuncan P. N. Exon Smith // Can try to drop again, but this should error and do nothing. 1010a2be46cSDuncan P. N. Exon Smith EXPECT_TRUE(Cache.tryToDropPCM("B")); 102*b7db2e9fSDuncan P. N. Exon Smith EXPECT_EQ(RawB2, Cache.lookupPCM("B")); 1030a2be46cSDuncan P. N. Exon Smith } 1040a2be46cSDuncan P. N. Exon Smith 1050a2be46cSDuncan P. N. Exon Smith TEST(InMemoryModuleCacheTest, finalizePCM) { 1060a2be46cSDuncan P. N. Exon Smith auto B = getBuffer(1); 1070a2be46cSDuncan P. N. Exon Smith auto *RawB = B.get(); 1080a2be46cSDuncan P. N. Exon Smith 1090a2be46cSDuncan P. N. Exon Smith InMemoryModuleCache Cache; 1100a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(InMemoryModuleCache::Unknown, Cache.getPCMState("B")); 1110a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(RawB, &Cache.addPCM("B", std::move(B))); 1120a2be46cSDuncan P. N. Exon Smith 1130a2be46cSDuncan P. N. Exon Smith // Call finalize. 1140a2be46cSDuncan P. N. Exon Smith Cache.finalizePCM("B"); 1150a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(InMemoryModuleCache::Final, Cache.getPCMState("B")); 1160a2be46cSDuncan P. N. Exon Smith EXPECT_TRUE(Cache.isPCMFinal("B")); 1178bef5cd4SDuncan P. N. Exon Smith } 1188bef5cd4SDuncan P. N. Exon Smith 1198bef5cd4SDuncan P. N. Exon Smith } // namespace 120