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