diff options
Diffstat (limited to 'clang/unittests/Serialization/InMemoryModuleCacheTest.cpp')
-rw-r--r-- | clang/unittests/Serialization/InMemoryModuleCacheTest.cpp | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/clang/unittests/Serialization/InMemoryModuleCacheTest.cpp b/clang/unittests/Serialization/InMemoryModuleCacheTest.cpp new file mode 100644 index 00000000000..356c9ed56f5 --- /dev/null +++ b/clang/unittests/Serialization/InMemoryModuleCacheTest.cpp @@ -0,0 +1,93 @@ +//===- InMemoryModuleCacheTest.cpp - InMemoryModuleCache tests ------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "clang/Serialization/InMemoryModuleCache.h" +#include "llvm/Support/MemoryBuffer.h" +#include "gtest/gtest.h" + +using namespace llvm; +using namespace clang; + +namespace { + +std::unique_ptr<MemoryBuffer> getBuffer(int I) { + SmallVector<char, 8> Bytes; + raw_svector_ostream(Bytes) << "data:" << I; + return MemoryBuffer::getMemBuffer(StringRef(Bytes.data(), Bytes.size()), "", + /* RequiresNullTerminator = */ false); +} + +TEST(InMemoryModuleCacheTest, addBuffer) { + auto B1 = getBuffer(1); + auto B2 = getBuffer(2); + auto B3 = getBuffer(3); + auto *RawB1 = B1.get(); + auto *RawB2 = B2.get(); + auto *RawB3 = B3.get(); + + // Add a few buffers. + InMemoryModuleCache Cache; + EXPECT_EQ(RawB1, &Cache.addBuffer("1", std::move(B1))); + EXPECT_EQ(RawB2, &Cache.addBuffer("2", std::move(B2))); + EXPECT_EQ(RawB3, &Cache.addBuffer("3", std::move(B3))); + EXPECT_EQ(RawB1, Cache.lookupBuffer("1")); + EXPECT_EQ(RawB2, Cache.lookupBuffer("2")); + EXPECT_EQ(RawB3, Cache.lookupBuffer("3")); + EXPECT_FALSE(Cache.isBufferFinal("1")); + EXPECT_FALSE(Cache.isBufferFinal("2")); + EXPECT_FALSE(Cache.isBufferFinal("3")); + + // Remove the middle buffer. + EXPECT_FALSE(Cache.tryToRemoveBuffer("2")); + EXPECT_EQ(nullptr, Cache.lookupBuffer("2")); + EXPECT_FALSE(Cache.isBufferFinal("2")); + + // Replace the middle buffer. + B2 = getBuffer(2); + RawB2 = B2.get(); + EXPECT_EQ(RawB2, &Cache.addBuffer("2", std::move(B2))); + + // Check that nothing is final. + EXPECT_FALSE(Cache.isBufferFinal("1")); + EXPECT_FALSE(Cache.isBufferFinal("2")); + EXPECT_FALSE(Cache.isBufferFinal("3")); +} + +TEST(InMemoryModuleCacheTest, finalizeCurrentBuffers) { + // Add a buffer. + InMemoryModuleCache Cache; + auto B1 = getBuffer(1); + auto *RawB1 = B1.get(); + Cache.addBuffer("1", std::move(B1)); + ASSERT_FALSE(Cache.isBufferFinal("1")); + + // Finalize it. + Cache.finalizeCurrentBuffers(); + EXPECT_TRUE(Cache.isBufferFinal("1")); + EXPECT_TRUE(Cache.tryToRemoveBuffer("1")); + EXPECT_EQ(RawB1, Cache.lookupBuffer("1")); + EXPECT_TRUE(Cache.isBufferFinal("1")); + + // Repeat. + auto B2 = getBuffer(2); + auto *RawB2 = B2.get(); + Cache.addBuffer("2", std::move(B2)); + EXPECT_FALSE(Cache.isBufferFinal("2")); + + Cache.finalizeCurrentBuffers(); + EXPECT_TRUE(Cache.isBufferFinal("1")); + EXPECT_TRUE(Cache.isBufferFinal("2")); + EXPECT_TRUE(Cache.tryToRemoveBuffer("1")); + EXPECT_TRUE(Cache.tryToRemoveBuffer("2")); + EXPECT_EQ(RawB1, Cache.lookupBuffer("1")); + EXPECT_EQ(RawB2, Cache.lookupBuffer("2")); + EXPECT_TRUE(Cache.isBufferFinal("1")); + EXPECT_TRUE(Cache.isBufferFinal("2")); +} + +} // namespace |