@@ -16,11 +16,17 @@ using namespace clang::tooling::dependencies;
16
16
namespace {
17
17
struct InstrumentingFilesystem
18
18
: llvm::RTTIExtends<InstrumentingFilesystem, llvm::vfs::ProxyFileSystem> {
19
+ unsigned NumStatusCalls = 0 ;
19
20
unsigned NumGetRealPathCalls = 0 ;
20
21
21
22
using llvm::RTTIExtends<InstrumentingFilesystem,
22
23
llvm::vfs::ProxyFileSystem>::RTTIExtends;
23
24
25
+ llvm::ErrorOr<llvm::vfs::Status> status (const llvm::Twine &Path) override {
26
+ ++NumStatusCalls;
27
+ return ProxyFileSystem::status (Path);
28
+ }
29
+
24
30
std::error_code getRealPath (const llvm::Twine &Path,
25
31
llvm::SmallVectorImpl<char > &Output) override {
26
32
++NumGetRealPathCalls;
@@ -29,6 +35,29 @@ struct InstrumentingFilesystem
29
35
};
30
36
} // namespace
31
37
38
+ TEST (DependencyScanningWorkerFilesystem, CacheStatusFailures) {
39
+ auto InMemoryFS = llvm::makeIntrusiveRefCnt<llvm::vfs::InMemoryFileSystem>();
40
+
41
+ auto InstrumentingFS =
42
+ llvm::makeIntrusiveRefCnt<InstrumentingFilesystem>(InMemoryFS);
43
+
44
+ DependencyScanningFilesystemSharedCache SharedCache;
45
+ DependencyScanningWorkerFilesystem DepFS (SharedCache, InstrumentingFS);
46
+ DependencyScanningWorkerFilesystem DepFS2 (SharedCache, InstrumentingFS);
47
+
48
+ DepFS.status (" /foo.c" );
49
+ EXPECT_EQ (InstrumentingFS->NumStatusCalls , 1u );
50
+
51
+ DepFS.status (" /foo.c" );
52
+ EXPECT_EQ (InstrumentingFS->NumStatusCalls , 1u ); // Cached, no increase.
53
+
54
+ DepFS.status (" /bar.c" );
55
+ EXPECT_EQ (InstrumentingFS->NumStatusCalls , 2u );
56
+
57
+ DepFS2.status (" /foo.c" );
58
+ EXPECT_EQ (InstrumentingFS->NumStatusCalls , 2u ); // Shared cache.
59
+ }
60
+
32
61
TEST (DependencyScanningFilesystem, CacheGetRealPath) {
33
62
auto InMemoryFS = llvm::makeIntrusiveRefCnt<llvm::vfs::InMemoryFileSystem>();
34
63
InMemoryFS->setCurrentWorkingDirectory (" /" );
0 commit comments