Skip to content

Commit 987f307

Browse files
committed
Add unit test for Caching functionality.
1 parent 2d38a85 commit 987f307

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed

llvm/unittests/Support/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ add_llvm_unittest(SupportTests
1818
BranchProbabilityTest.cpp
1919
CachePruningTest.cpp
2020
CrashRecoveryTest.cpp
21+
Caching.cpp
2122
Casting.cpp
2223
CheckedArithmeticTest.cpp
2324
Chrono.cpp

llvm/unittests/Support/Caching.cpp

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
//===- Caching.cpp --------------------------------------------------------===//
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 "llvm/Support/Caching.h"
10+
#include "llvm/Support/Error.h"
11+
#include "llvm/Support/MemoryBuffer.h"
12+
#include "llvm/Support/Path.h"
13+
#include "llvm/Testing/Support/Error.h"
14+
#include "gtest/gtest.h"
15+
16+
using namespace llvm;
17+
18+
#define ASSERT_NO_ERROR(x) \
19+
if (std::error_code ASSERT_NO_ERROR_ec = x) { \
20+
SmallString<128> MessageStorage; \
21+
raw_svector_ostream Message(MessageStorage); \
22+
Message << #x ": did not return errc::success.\n" \
23+
<< "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \
24+
<< "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \
25+
GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \
26+
} else { \
27+
}
28+
29+
char data[] = "some data";
30+
31+
TEST(Caching, Normal) {
32+
SmallString<256> TempDir;
33+
sys::path::system_temp_directory(true, TempDir);
34+
SmallString<256> CacheDir;
35+
sys::path::append(CacheDir, TempDir, "llvm_test_cache");
36+
37+
sys::fs::remove_directories(CacheDir.str());
38+
39+
std::unique_ptr<MemoryBuffer> CachedBuffer;
40+
auto AddBuffer = [&CachedBuffer](unsigned Task, const Twine &ModuleName,
41+
std::unique_ptr<MemoryBuffer> M) {
42+
CachedBuffer = std::move(M);
43+
};
44+
auto CacheOrErr =
45+
localCache("LLVMTestCache", "LLVMTest", CacheDir, AddBuffer);
46+
ASSERT_TRUE(bool(CacheOrErr));
47+
48+
FileCache &Cache = *CacheOrErr;
49+
50+
{
51+
auto AddStreamOrErr = Cache(1, "foo", "");
52+
ASSERT_TRUE(bool(AddStreamOrErr));
53+
54+
AddStreamFn &AddStream = *AddStreamOrErr;
55+
ASSERT_TRUE(AddStream);
56+
57+
auto FileOrErr = AddStream(1, "");
58+
ASSERT_TRUE(bool(FileOrErr));
59+
60+
CachedFileStream *CFS = FileOrErr->get();
61+
(*CFS->OS).write(data, sizeof(data));
62+
ASSERT_THAT_ERROR(CFS->commit(), Succeeded());
63+
}
64+
65+
{
66+
auto AddStreamOrErr = Cache(1, "foo", "");
67+
ASSERT_TRUE(bool(AddStreamOrErr));
68+
69+
AddStreamFn &AddStream = *AddStreamOrErr;
70+
ASSERT_FALSE(AddStream);
71+
72+
ASSERT_TRUE(CachedBuffer->getBufferSize() == sizeof(data));
73+
StringRef readData = CachedBuffer->getBuffer();
74+
ASSERT_TRUE(memcmp(data, readData.data(), sizeof(data)) == 0);
75+
}
76+
77+
ASSERT_NO_ERROR(sys::fs::remove_directories(CacheDir.str()));
78+
}
79+
80+
TEST(Caching, WriteAfterCommit) {
81+
SmallString<256> TempDir;
82+
sys::path::system_temp_directory(true, TempDir);
83+
SmallString<256> CacheDir;
84+
sys::path::append(CacheDir, TempDir, "llvm_test_cache");
85+
86+
sys::fs::remove_directories(CacheDir.str());
87+
88+
std::unique_ptr<MemoryBuffer> CachedBuffer;
89+
auto AddBuffer = [&CachedBuffer](unsigned Task, const Twine &ModuleName,
90+
std::unique_ptr<MemoryBuffer> M) {
91+
CachedBuffer = std::move(M);
92+
};
93+
auto CacheOrErr =
94+
localCache("LLVMTestCache", "LLVMTest", CacheDir, AddBuffer);
95+
ASSERT_TRUE(bool(CacheOrErr));
96+
97+
FileCache &Cache = *CacheOrErr;
98+
99+
auto AddStreamOrErr = Cache(1, "foo", "");
100+
ASSERT_TRUE(bool(AddStreamOrErr));
101+
102+
AddStreamFn &AddStream = *AddStreamOrErr;
103+
ASSERT_TRUE(AddStream);
104+
105+
auto FileOrErr = AddStream(1, "");
106+
ASSERT_TRUE(bool(FileOrErr));
107+
108+
CachedFileStream *CFS = FileOrErr->get();
109+
(*CFS->OS).write(data, sizeof(data));
110+
ASSERT_THAT_ERROR(CFS->commit(), Succeeded());
111+
112+
EXPECT_DEATH({ (*CFS->OS).write(data, sizeof(data)); }, "")
113+
<< "Write after commit did not cause abort";
114+
115+
ASSERT_NO_ERROR(sys::fs::remove_directories(CacheDir.str()));
116+
}

0 commit comments

Comments
 (0)