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