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 25*0a2be46cSDuncan P. N. Exon Smith TEST(InMemoryModuleCacheTest, initialState) { 268bef5cd4SDuncan P. N. Exon Smith InMemoryModuleCache Cache; 27*0a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(InMemoryModuleCache::Unknown, Cache.getPCMState("B")); 28*0a2be46cSDuncan P. N. Exon Smith EXPECT_FALSE(Cache.isPCMFinal("B")); 29*0a2be46cSDuncan P. N. Exon Smith EXPECT_FALSE(Cache.shouldBuildPCM("B")); 308bef5cd4SDuncan P. N. Exon Smith 31*0a2be46cSDuncan P. N. Exon Smith #if !defined(NDEBUG) && GTEST_HAS_DEATH_TEST 32*0a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.tryToDropPCM("B"), "PCM to remove is unknown"); 33*0a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.finalizePCM("B"), "PCM to finalize is unknown"); 34*0a2be46cSDuncan P. N. Exon Smith #endif 358bef5cd4SDuncan P. N. Exon Smith } 368bef5cd4SDuncan P. N. Exon Smith 37*0a2be46cSDuncan P. N. Exon Smith TEST(InMemoryModuleCacheTest, addPCM) { 38*0a2be46cSDuncan P. N. Exon Smith auto B = getBuffer(1); 39*0a2be46cSDuncan P. N. Exon Smith auto *RawB = B.get(); 40*0a2be46cSDuncan P. N. Exon Smith 418bef5cd4SDuncan P. N. Exon Smith InMemoryModuleCache Cache; 42*0a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(RawB, &Cache.addPCM("B", std::move(B))); 43*0a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(InMemoryModuleCache::Tentative, Cache.getPCMState("B")); 44*0a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(RawB, Cache.lookupPCM("B")); 45*0a2be46cSDuncan P. N. Exon Smith EXPECT_FALSE(Cache.isPCMFinal("B")); 46*0a2be46cSDuncan P. N. Exon Smith EXPECT_FALSE(Cache.shouldBuildPCM("B")); 478bef5cd4SDuncan P. N. Exon Smith 48*0a2be46cSDuncan P. N. Exon Smith #if !defined(NDEBUG) && GTEST_HAS_DEATH_TEST 49*0a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.addPCM("B", getBuffer(2)), "Already has a PCM"); 50*0a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.addBuiltPCM("B", getBuffer(2)), 51*0a2be46cSDuncan P. N. Exon Smith "Trying to override tentative PCM"); 52*0a2be46cSDuncan P. N. Exon Smith #endif 53*0a2be46cSDuncan P. N. Exon Smith } 548bef5cd4SDuncan P. N. Exon Smith 55*0a2be46cSDuncan P. N. Exon Smith TEST(InMemoryModuleCacheTest, addBuiltPCM) { 56*0a2be46cSDuncan P. N. Exon Smith auto B = getBuffer(1); 57*0a2be46cSDuncan P. N. Exon Smith auto *RawB = B.get(); 588bef5cd4SDuncan P. N. Exon Smith 59*0a2be46cSDuncan P. N. Exon Smith InMemoryModuleCache Cache; 60*0a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(RawB, &Cache.addBuiltPCM("B", std::move(B))); 61*0a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(InMemoryModuleCache::Final, Cache.getPCMState("B")); 62*0a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(RawB, Cache.lookupPCM("B")); 63*0a2be46cSDuncan P. N. Exon Smith EXPECT_TRUE(Cache.isPCMFinal("B")); 64*0a2be46cSDuncan P. N. Exon Smith EXPECT_FALSE(Cache.shouldBuildPCM("B")); 65*0a2be46cSDuncan P. N. Exon Smith 66*0a2be46cSDuncan P. N. Exon Smith #if !defined(NDEBUG) && GTEST_HAS_DEATH_TEST 67*0a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.addPCM("B", getBuffer(2)), "Already has a PCM"); 68*0a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.addBuiltPCM("B", getBuffer(2)), 69*0a2be46cSDuncan P. N. Exon Smith "Trying to override finalized PCM"); 70*0a2be46cSDuncan P. N. Exon Smith #endif 71*0a2be46cSDuncan P. N. Exon Smith } 72*0a2be46cSDuncan P. N. Exon Smith 73*0a2be46cSDuncan P. N. Exon Smith TEST(InMemoryModuleCacheTest, tryToDropPCM) { 74*0a2be46cSDuncan P. N. Exon Smith auto B = getBuffer(1); 75*0a2be46cSDuncan P. N. Exon Smith auto *RawB = B.get(); 76*0a2be46cSDuncan P. N. Exon Smith 77*0a2be46cSDuncan P. N. Exon Smith InMemoryModuleCache Cache; 78*0a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(InMemoryModuleCache::Unknown, Cache.getPCMState("B")); 79*0a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(RawB, &Cache.addPCM("B", std::move(B))); 80*0a2be46cSDuncan P. N. Exon Smith EXPECT_FALSE(Cache.tryToDropPCM("B")); 81*0a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(nullptr, Cache.lookupPCM("B")); 82*0a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(InMemoryModuleCache::ToBuild, Cache.getPCMState("B")); 83*0a2be46cSDuncan P. N. Exon Smith EXPECT_FALSE(Cache.isPCMFinal("B")); 84*0a2be46cSDuncan P. N. Exon Smith EXPECT_TRUE(Cache.shouldBuildPCM("B")); 85*0a2be46cSDuncan P. N. Exon Smith 86*0a2be46cSDuncan P. N. Exon Smith #if !defined(NDEBUG) && GTEST_HAS_DEATH_TEST 87*0a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.addPCM("B", getBuffer(2)), "Already has a PCM"); 88*0a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.tryToDropPCM("B"), 89*0a2be46cSDuncan P. N. Exon Smith "PCM to remove is scheduled to be built"); 90*0a2be46cSDuncan P. N. Exon Smith EXPECT_DEATH(Cache.finalizePCM("B"), "Trying to finalize a dropped PCM"); 91*0a2be46cSDuncan P. N. Exon Smith #endif 92*0a2be46cSDuncan P. N. Exon Smith 93*0a2be46cSDuncan P. N. Exon Smith B = getBuffer(2); 94*0a2be46cSDuncan P. N. Exon Smith ASSERT_NE(RawB, B.get()); 95*0a2be46cSDuncan P. N. Exon Smith RawB = B.get(); 96*0a2be46cSDuncan P. N. Exon Smith 97*0a2be46cSDuncan P. N. Exon Smith // Add a new one. 98*0a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(RawB, &Cache.addBuiltPCM("B", std::move(B))); 99*0a2be46cSDuncan P. N. Exon Smith EXPECT_TRUE(Cache.isPCMFinal("B")); 100*0a2be46cSDuncan P. N. Exon Smith 101*0a2be46cSDuncan P. N. Exon Smith // Can try to drop again, but this should error and do nothing. 102*0a2be46cSDuncan P. N. Exon Smith EXPECT_TRUE(Cache.tryToDropPCM("B")); 103*0a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(RawB, Cache.lookupPCM("B")); 104*0a2be46cSDuncan P. N. Exon Smith } 105*0a2be46cSDuncan P. N. Exon Smith 106*0a2be46cSDuncan P. N. Exon Smith TEST(InMemoryModuleCacheTest, finalizePCM) { 107*0a2be46cSDuncan P. N. Exon Smith auto B = getBuffer(1); 108*0a2be46cSDuncan P. N. Exon Smith auto *RawB = B.get(); 109*0a2be46cSDuncan P. N. Exon Smith 110*0a2be46cSDuncan P. N. Exon Smith InMemoryModuleCache Cache; 111*0a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(InMemoryModuleCache::Unknown, Cache.getPCMState("B")); 112*0a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(RawB, &Cache.addPCM("B", std::move(B))); 113*0a2be46cSDuncan P. N. Exon Smith 114*0a2be46cSDuncan P. N. Exon Smith // Call finalize. 115*0a2be46cSDuncan P. N. Exon Smith Cache.finalizePCM("B"); 116*0a2be46cSDuncan P. N. Exon Smith EXPECT_EQ(InMemoryModuleCache::Final, Cache.getPCMState("B")); 117*0a2be46cSDuncan P. N. Exon Smith EXPECT_TRUE(Cache.isPCMFinal("B")); 1188bef5cd4SDuncan P. N. Exon Smith } 1198bef5cd4SDuncan P. N. Exon Smith 1208bef5cd4SDuncan P. N. Exon Smith } // namespace 121