aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Support/VirtualFileSystemTest.cpp
diff options
context:
space:
mode:
authorJan Svoboda <jan_svoboda@apple.com>2024-09-06 14:14:44 -0700
committerGitHub <noreply@github.com>2024-09-06 14:14:44 -0700
commit70fcdb3d52272eba96d4b268d334826690524f50 (patch)
tree3376b22d8498ac5672b9cd7108456be82103567f /llvm/unittests/Support/VirtualFileSystemTest.cpp
parent7815abec165114da29e191022c2816f857b1984f (diff)
downloadllvm-70fcdb3d52272eba96d4b268d334826690524f50.zip
llvm-70fcdb3d52272eba96d4b268d334826690524f50.tar.gz
llvm-70fcdb3d52272eba96d4b268d334826690524f50.tar.bz2
[llvm][support] Implement tracing virtual file system (#88326)
LLVM-based tools often use the `llvm::vfs::FileSystem` instrastructure to access the file system. This patch adds new kind of a VFS that performs lightweight tracing of file system operations on an underlying VFS. This is supposed to aid in investigating file system traffic without resorting to instrumentation on the operating system level. There will be follow-up patches that integrate this into Clang and its dependency scanner.
Diffstat (limited to 'llvm/unittests/Support/VirtualFileSystemTest.cpp')
-rw-r--r--llvm/unittests/Support/VirtualFileSystemTest.cpp114
1 files changed, 114 insertions, 0 deletions
diff --git a/llvm/unittests/Support/VirtualFileSystemTest.cpp b/llvm/unittests/Support/VirtualFileSystemTest.cpp
index 60649e9..8d1eb69 100644
--- a/llvm/unittests/Support/VirtualFileSystemTest.cpp
+++ b/llvm/unittests/Support/VirtualFileSystemTest.cpp
@@ -3565,3 +3565,117 @@ TEST(RedirectingFileSystemTest, ExistsRedirectOnly) {
EXPECT_FALSE(Redirecting->exists("/b"));
EXPECT_TRUE(Redirecting->exists("/vfile"));
}
+
+TEST(TracingFileSystemTest, TracingWorks) {
+ auto InMemoryFS = makeIntrusiveRefCnt<vfs::InMemoryFileSystem>();
+ auto TracingFS =
+ makeIntrusiveRefCnt<vfs::TracingFileSystem>(std::move(InMemoryFS));
+
+ EXPECT_EQ(TracingFS->NumStatusCalls, 0u);
+ EXPECT_EQ(TracingFS->NumOpenFileForReadCalls, 0u);
+ EXPECT_EQ(TracingFS->NumDirBeginCalls, 0u);
+ EXPECT_EQ(TracingFS->NumGetRealPathCalls, 0u);
+ EXPECT_EQ(TracingFS->NumExistsCalls, 0u);
+ EXPECT_EQ(TracingFS->NumIsLocalCalls, 0u);
+
+ (void)TracingFS->status("/foo");
+ EXPECT_EQ(TracingFS->NumStatusCalls, 1u);
+ EXPECT_EQ(TracingFS->NumOpenFileForReadCalls, 0u);
+ EXPECT_EQ(TracingFS->NumDirBeginCalls, 0u);
+ EXPECT_EQ(TracingFS->NumGetRealPathCalls, 0u);
+ EXPECT_EQ(TracingFS->NumExistsCalls, 0u);
+ EXPECT_EQ(TracingFS->NumIsLocalCalls, 0u);
+
+ (void)TracingFS->openFileForRead("/foo");
+ EXPECT_EQ(TracingFS->NumStatusCalls, 1u);
+ EXPECT_EQ(TracingFS->NumOpenFileForReadCalls, 1u);
+ EXPECT_EQ(TracingFS->NumDirBeginCalls, 0u);
+ EXPECT_EQ(TracingFS->NumGetRealPathCalls, 0u);
+ EXPECT_EQ(TracingFS->NumExistsCalls, 0u);
+ EXPECT_EQ(TracingFS->NumIsLocalCalls, 0u);
+
+ std::error_code EC;
+ (void)TracingFS->dir_begin("/foo", EC);
+ EXPECT_EQ(TracingFS->NumStatusCalls, 1u);
+ EXPECT_EQ(TracingFS->NumOpenFileForReadCalls, 1u);
+ EXPECT_EQ(TracingFS->NumDirBeginCalls, 1u);
+ EXPECT_EQ(TracingFS->NumGetRealPathCalls, 0u);
+ EXPECT_EQ(TracingFS->NumExistsCalls, 0u);
+ EXPECT_EQ(TracingFS->NumIsLocalCalls, 0u);
+
+ SmallString<128> RealPath;
+ (void)TracingFS->getRealPath("/foo", RealPath);
+ EXPECT_EQ(TracingFS->NumStatusCalls, 1u);
+ EXPECT_EQ(TracingFS->NumOpenFileForReadCalls, 1u);
+ EXPECT_EQ(TracingFS->NumDirBeginCalls, 1u);
+ EXPECT_EQ(TracingFS->NumGetRealPathCalls, 1u);
+ EXPECT_EQ(TracingFS->NumExistsCalls, 0u);
+ EXPECT_EQ(TracingFS->NumIsLocalCalls, 0u);
+
+ (void)TracingFS->exists("/foo");
+ EXPECT_EQ(TracingFS->NumStatusCalls, 1u);
+ EXPECT_EQ(TracingFS->NumOpenFileForReadCalls, 1u);
+ EXPECT_EQ(TracingFS->NumDirBeginCalls, 1u);
+ EXPECT_EQ(TracingFS->NumGetRealPathCalls, 1u);
+ EXPECT_EQ(TracingFS->NumExistsCalls, 1u);
+ EXPECT_EQ(TracingFS->NumIsLocalCalls, 0u);
+
+ bool IsLocal;
+ (void)TracingFS->isLocal("/foo", IsLocal);
+ EXPECT_EQ(TracingFS->NumStatusCalls, 1u);
+ EXPECT_EQ(TracingFS->NumOpenFileForReadCalls, 1u);
+ EXPECT_EQ(TracingFS->NumDirBeginCalls, 1u);
+ EXPECT_EQ(TracingFS->NumGetRealPathCalls, 1u);
+ EXPECT_EQ(TracingFS->NumExistsCalls, 1u);
+ EXPECT_EQ(TracingFS->NumIsLocalCalls, 1u);
+}
+
+TEST(TracingFileSystemTest, PrintOutput) {
+ auto InMemoryFS = makeIntrusiveRefCnt<vfs::InMemoryFileSystem>();
+ auto TracingFS =
+ makeIntrusiveRefCnt<vfs::TracingFileSystem>(std::move(InMemoryFS));
+
+ (void)TracingFS->status("/foo");
+
+ (void)TracingFS->openFileForRead("/foo");
+ (void)TracingFS->openFileForRead("/foo");
+
+ std::error_code EC;
+ (void)TracingFS->dir_begin("/foo", EC);
+ (void)TracingFS->dir_begin("/foo", EC);
+ (void)TracingFS->dir_begin("/foo", EC);
+
+ llvm::SmallString<128> RealPath;
+ (void)TracingFS->getRealPath("/foo", RealPath);
+ (void)TracingFS->getRealPath("/foo", RealPath);
+ (void)TracingFS->getRealPath("/foo", RealPath);
+ (void)TracingFS->getRealPath("/foo", RealPath);
+
+ (void)TracingFS->exists("/foo");
+ (void)TracingFS->exists("/foo");
+ (void)TracingFS->exists("/foo");
+ (void)TracingFS->exists("/foo");
+ (void)TracingFS->exists("/foo");
+
+ bool IsLocal;
+ (void)TracingFS->isLocal("/foo", IsLocal);
+ (void)TracingFS->isLocal("/foo", IsLocal);
+ (void)TracingFS->isLocal("/foo", IsLocal);
+ (void)TracingFS->isLocal("/foo", IsLocal);
+ (void)TracingFS->isLocal("/foo", IsLocal);
+ (void)TracingFS->isLocal("/foo", IsLocal);
+
+ std::string Output;
+ llvm::raw_string_ostream OS(Output);
+ TracingFS->print(OS);
+
+ ASSERT_EQ("TracingFileSystem\n"
+ "NumStatusCalls=1\n"
+ "NumOpenFileForReadCalls=2\n"
+ "NumDirBeginCalls=3\n"
+ "NumGetRealPathCalls=4\n"
+ "NumExistsCalls=5\n"
+ "NumIsLocalCalls=6\n"
+ " InMemoryFileSystem\n",
+ Output);
+}