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