1 //===-- TestFS.h ------------------------------------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // Allows setting up fake filesystem environments for tests.
11 //===----------------------------------------------------------------------===//
12 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_UNITTESTS_TESTFS_H
13 #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_UNITTESTS_TESTFS_H
14 #include "GlobalCompilationDatabase.h"
15 #include "support/Path.h"
16 #include "support/ThreadsafeFS.h"
17 #include "llvm/ADT/IntrusiveRefCntPtr.h"
18 #include "llvm/Support/Path.h"
19 #include "llvm/Support/VirtualFileSystem.h"
25 // Builds a VFS that provides access to the provided files, plus temporary
27 llvm::IntrusiveRefCntPtr
<llvm::vfs::FileSystem
>
28 buildTestFS(llvm::StringMap
<std::string
> const &Files
,
29 llvm::StringMap
<time_t> const &Timestamps
= {});
31 // A VFS provider that returns TestFSes containing a provided set of files.
32 class MockFS
: public ThreadsafeFS
{
34 IntrusiveRefCntPtr
<llvm::vfs::FileSystem
> viewImpl() const override
{
35 auto MemFS
= buildTestFS(Files
, Timestamps
);
36 if (!OverlayRealFileSystemForModules
)
38 llvm::IntrusiveRefCntPtr
<llvm::vfs::OverlayFileSystem
> OverlayFileSystem
=
39 new llvm::vfs::OverlayFileSystem(llvm::vfs::getRealFileSystem());
40 OverlayFileSystem
->pushOverlay(MemFS
);
41 return OverlayFileSystem
;
44 // If relative paths are used, they are resolved with testPath().
45 llvm::StringMap
<std::string
> Files
;
46 llvm::StringMap
<time_t> Timestamps
;
47 // If true, real file system will be used as fallback for the in-memory one.
48 // This is useful for testing module support.
49 bool OverlayRealFileSystemForModules
= false;
52 // A Compilation database that returns a fixed set of compile flags.
53 class MockCompilationDatabase
: public GlobalCompilationDatabase
{
55 /// If \p Directory is not empty, use that as the Directory field of the
56 /// CompileCommand, and as project SourceRoot.
58 /// If \p RelPathPrefix is not empty, use that as a prefix in front of the
59 /// source file name, instead of using an absolute path.
60 MockCompilationDatabase(StringRef Directory
= StringRef(),
61 StringRef RelPathPrefix
= StringRef());
63 std::optional
<tooling::CompileCommand
>
64 getCompileCommand(PathRef File
) const override
;
66 std::optional
<ProjectInfo
> getProjectInfo(PathRef File
) const override
;
68 std::vector
<std::string
> ExtraClangFlags
;
72 StringRef RelPathPrefix
;
75 // Returns an absolute (fake) test directory for this OS.
76 const char *testRoot();
78 // Returns a suitable absolute path for this OS.
79 std::string
testPath(PathRef File
,
80 llvm::sys::path::Style
= llvm::sys::path::Style::native
);
82 // unittest: is a scheme that refers to files relative to testRoot()
83 // This anchor is used to force the linker to link in the generated object file
84 // and thus register unittest: URI scheme plugin.
85 extern volatile int UnittestSchemeAnchorSource
;