xref: /llvm-project/clang/unittests/Serialization/InMemoryModuleCacheTest.cpp (revision 8bef5cd49a8bb66b777cc3c51f9fb31bffeaa580)
1 //===- InMemoryModuleCacheTest.cpp - InMemoryModuleCache tests ------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "clang/Serialization/InMemoryModuleCache.h"
10 #include "llvm/Support/MemoryBuffer.h"
11 #include "gtest/gtest.h"
12 
13 using namespace llvm;
14 using namespace clang;
15 
16 namespace {
17 
18 std::unique_ptr<MemoryBuffer> getBuffer(int I) {
19   SmallVector<char, 8> Bytes;
20   raw_svector_ostream(Bytes) << "data:" << I;
21   return MemoryBuffer::getMemBuffer(StringRef(Bytes.data(), Bytes.size()), "",
22                                     /* RequiresNullTerminator = */ false);
23 }
24 
25 TEST(InMemoryModuleCacheTest, addBuffer) {
26   auto B1 = getBuffer(1);
27   auto B2 = getBuffer(2);
28   auto B3 = getBuffer(3);
29   auto *RawB1 = B1.get();
30   auto *RawB2 = B2.get();
31   auto *RawB3 = B3.get();
32 
33   // Add a few buffers.
34   InMemoryModuleCache Cache;
35   EXPECT_EQ(RawB1, &Cache.addBuffer("1", std::move(B1)));
36   EXPECT_EQ(RawB2, &Cache.addBuffer("2", std::move(B2)));
37   EXPECT_EQ(RawB3, &Cache.addBuffer("3", std::move(B3)));
38   EXPECT_EQ(RawB1, Cache.lookupBuffer("1"));
39   EXPECT_EQ(RawB2, Cache.lookupBuffer("2"));
40   EXPECT_EQ(RawB3, Cache.lookupBuffer("3"));
41   EXPECT_FALSE(Cache.isBufferFinal("1"));
42   EXPECT_FALSE(Cache.isBufferFinal("2"));
43   EXPECT_FALSE(Cache.isBufferFinal("3"));
44 
45   // Remove the middle buffer.
46   EXPECT_FALSE(Cache.tryToRemoveBuffer("2"));
47   EXPECT_EQ(nullptr, Cache.lookupBuffer("2"));
48   EXPECT_FALSE(Cache.isBufferFinal("2"));
49 
50   // Replace the middle buffer.
51   B2 = getBuffer(2);
52   RawB2 = B2.get();
53   EXPECT_EQ(RawB2, &Cache.addBuffer("2", std::move(B2)));
54 
55   // Check that nothing is final.
56   EXPECT_FALSE(Cache.isBufferFinal("1"));
57   EXPECT_FALSE(Cache.isBufferFinal("2"));
58   EXPECT_FALSE(Cache.isBufferFinal("3"));
59 }
60 
61 TEST(InMemoryModuleCacheTest, finalizeCurrentBuffers) {
62   // Add a buffer.
63   InMemoryModuleCache Cache;
64   auto B1 = getBuffer(1);
65   auto *RawB1 = B1.get();
66   Cache.addBuffer("1", std::move(B1));
67   ASSERT_FALSE(Cache.isBufferFinal("1"));
68 
69   // Finalize it.
70   Cache.finalizeCurrentBuffers();
71   EXPECT_TRUE(Cache.isBufferFinal("1"));
72   EXPECT_TRUE(Cache.tryToRemoveBuffer("1"));
73   EXPECT_EQ(RawB1, Cache.lookupBuffer("1"));
74   EXPECT_TRUE(Cache.isBufferFinal("1"));
75 
76   // Repeat.
77   auto B2 = getBuffer(2);
78   auto *RawB2 = B2.get();
79   Cache.addBuffer("2", std::move(B2));
80   EXPECT_FALSE(Cache.isBufferFinal("2"));
81 
82   Cache.finalizeCurrentBuffers();
83   EXPECT_TRUE(Cache.isBufferFinal("1"));
84   EXPECT_TRUE(Cache.isBufferFinal("2"));
85   EXPECT_TRUE(Cache.tryToRemoveBuffer("1"));
86   EXPECT_TRUE(Cache.tryToRemoveBuffer("2"));
87   EXPECT_EQ(RawB1, Cache.lookupBuffer("1"));
88   EXPECT_EQ(RawB2, Cache.lookupBuffer("2"));
89   EXPECT_TRUE(Cache.isBufferFinal("1"));
90   EXPECT_TRUE(Cache.isBufferFinal("2"));
91 }
92 
93 } // namespace
94