diff options
author | Jan Svoboda <jan_svoboda@apple.com> | 2024-09-06 14:14:44 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-06 14:14:44 -0700 |
commit | 70fcdb3d52272eba96d4b268d334826690524f50 (patch) | |
tree | 3376b22d8498ac5672b9cd7108456be82103567f /llvm/unittests/Support/VirtualFileSystemTest.cpp | |
parent | 7815abec165114da29e191022c2816f857b1984f (diff) | |
download | llvm-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.cpp | 114 |
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); +} |