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