InMemoryModuleCacheTest.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. #include "clang/Serialization/InMemoryModuleCache.h"
  9. #include "llvm/Support/MemoryBuffer.h"
  10. #include "gtest/gtest.h"
  11. using namespace llvm;
  12. using namespace clang;
  13. namespace {
  14. std::unique_ptr<MemoryBuffer> getBuffer(int I) {
  15. SmallVector<char, 8> Bytes;
  16. raw_svector_ostream(Bytes) << "data:" << I;
  17. return MemoryBuffer::getMemBuffer(StringRef(Bytes.data(), Bytes.size()), "",
  18. /* RequiresNullTerminator = */ false);
  19. }
  20. TEST(InMemoryModuleCacheTest, addBuffer) {
  21. auto B1 = getBuffer(1);
  22. auto B2 = getBuffer(2);
  23. auto B3 = getBuffer(3);
  24. auto *RawB1 = B1.get();
  25. auto *RawB2 = B2.get();
  26. auto *RawB3 = B3.get();
  27. // Add a few buffers.
  28. InMemoryModuleCache Cache;
  29. EXPECT_EQ(RawB1, &Cache.addBuffer("1", std::move(B1)));
  30. EXPECT_EQ(RawB2, &Cache.addBuffer("2", std::move(B2)));
  31. EXPECT_EQ(RawB3, &Cache.addBuffer("3", std::move(B3)));
  32. EXPECT_EQ(RawB1, Cache.lookupBuffer("1"));
  33. EXPECT_EQ(RawB2, Cache.lookupBuffer("2"));
  34. EXPECT_EQ(RawB3, Cache.lookupBuffer("3"));
  35. EXPECT_FALSE(Cache.isBufferFinal("1"));
  36. EXPECT_FALSE(Cache.isBufferFinal("2"));
  37. EXPECT_FALSE(Cache.isBufferFinal("3"));
  38. // Remove the middle buffer.
  39. EXPECT_FALSE(Cache.tryToRemoveBuffer("2"));
  40. EXPECT_EQ(nullptr, Cache.lookupBuffer("2"));
  41. EXPECT_FALSE(Cache.isBufferFinal("2"));
  42. // Replace the middle buffer.
  43. B2 = getBuffer(2);
  44. RawB2 = B2.get();
  45. EXPECT_EQ(RawB2, &Cache.addBuffer("2", std::move(B2)));
  46. // Check that nothing is final.
  47. EXPECT_FALSE(Cache.isBufferFinal("1"));
  48. EXPECT_FALSE(Cache.isBufferFinal("2"));
  49. EXPECT_FALSE(Cache.isBufferFinal("3"));
  50. }
  51. TEST(InMemoryModuleCacheTest, finalizeCurrentBuffers) {
  52. // Add a buffer.
  53. InMemoryModuleCache Cache;
  54. auto B1 = getBuffer(1);
  55. auto *RawB1 = B1.get();
  56. Cache.addBuffer("1", std::move(B1));
  57. ASSERT_FALSE(Cache.isBufferFinal("1"));
  58. // Finalize it.
  59. Cache.finalizeCurrentBuffers();
  60. EXPECT_TRUE(Cache.isBufferFinal("1"));
  61. EXPECT_TRUE(Cache.tryToRemoveBuffer("1"));
  62. EXPECT_EQ(RawB1, Cache.lookupBuffer("1"));
  63. EXPECT_TRUE(Cache.isBufferFinal("1"));
  64. // Repeat.
  65. auto B2 = getBuffer(2);
  66. auto *RawB2 = B2.get();
  67. Cache.addBuffer("2", std::move(B2));
  68. EXPECT_FALSE(Cache.isBufferFinal("2"));
  69. Cache.finalizeCurrentBuffers();
  70. EXPECT_TRUE(Cache.isBufferFinal("1"));
  71. EXPECT_TRUE(Cache.isBufferFinal("2"));
  72. EXPECT_TRUE(Cache.tryToRemoveBuffer("1"));
  73. EXPECT_TRUE(Cache.tryToRemoveBuffer("2"));
  74. EXPECT_EQ(RawB1, Cache.lookupBuffer("1"));
  75. EXPECT_EQ(RawB2, Cache.lookupBuffer("2"));
  76. EXPECT_TRUE(Cache.isBufferFinal("1"));
  77. EXPECT_TRUE(Cache.isBufferFinal("2"));
  78. }
  79. } // namespace