aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Support/VirtualFileSystemTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/unittests/Support/VirtualFileSystemTest.cpp')
-rw-r--r--llvm/unittests/Support/VirtualFileSystemTest.cpp108
1 files changed, 108 insertions, 0 deletions
diff --git a/llvm/unittests/Support/VirtualFileSystemTest.cpp b/llvm/unittests/Support/VirtualFileSystemTest.cpp
index ca35b5e..be32971 100644
--- a/llvm/unittests/Support/VirtualFileSystemTest.cpp
+++ b/llvm/unittests/Support/VirtualFileSystemTest.cpp
@@ -1627,6 +1627,114 @@ TEST_F(VFSFromYAMLTest, RemappedDirectoryOverlayNoFallthrough) {
EXPECT_EQ(0, NumDiagnostics);
}
+TEST_F(VFSFromYAMLTest, ReturnsRequestedPathVFSMiss) {
+ IntrusiveRefCntPtr<vfs::InMemoryFileSystem> BaseFS(
+ new vfs::InMemoryFileSystem);
+ BaseFS->addFile("//root/foo/a", 0,
+ MemoryBuffer::getMemBuffer("contents of a"));
+ ASSERT_FALSE(BaseFS->setCurrentWorkingDirectory("//root/foo"));
+ auto RemappedFS = vfs::RedirectingFileSystem::create(
+ {}, /*UseExternalNames=*/false, *BaseFS);
+
+ auto OpenedF = RemappedFS->openFileForRead("a");
+ ASSERT_FALSE(OpenedF.getError());
+ llvm::ErrorOr<std::string> Name = (*OpenedF)->getName();
+ ASSERT_FALSE(Name.getError());
+ EXPECT_EQ("a", Name.get());
+
+ auto OpenedS = (*OpenedF)->status();
+ ASSERT_FALSE(OpenedS.getError());
+ EXPECT_EQ("a", OpenedS->getName());
+ EXPECT_FALSE(OpenedS->IsVFSMapped);
+
+ auto DirectS = RemappedFS->status("a");
+ ASSERT_FALSE(DirectS.getError());
+ EXPECT_EQ("a", DirectS->getName());
+ EXPECT_FALSE(DirectS->IsVFSMapped);
+
+ EXPECT_EQ(0, NumDiagnostics);
+}
+
+TEST_F(VFSFromYAMLTest, ReturnsExternalPathVFSHit) {
+ IntrusiveRefCntPtr<vfs::InMemoryFileSystem> BaseFS(
+ new vfs::InMemoryFileSystem);
+ BaseFS->addFile("//root/foo/realname", 0,
+ MemoryBuffer::getMemBuffer("contents of a"));
+ auto FS =
+ getFromYAMLString("{ 'use-external-names': true,\n"
+ " 'roots': [\n"
+ "{\n"
+ " 'type': 'directory',\n"
+ " 'name': '//root/foo',\n"
+ " 'contents': [ {\n"
+ " 'type': 'file',\n"
+ " 'name': 'vfsname',\n"
+ " 'external-contents': 'realname'\n"
+ " }\n"
+ " ]\n"
+ "}]}",
+ BaseFS);
+ ASSERT_FALSE(FS->setCurrentWorkingDirectory("//root/foo"));
+
+ auto OpenedF = FS->openFileForRead("vfsname");
+ ASSERT_FALSE(OpenedF.getError());
+ llvm::ErrorOr<std::string> Name = (*OpenedF)->getName();
+ ASSERT_FALSE(Name.getError());
+ EXPECT_EQ("realname", Name.get());
+
+ auto OpenedS = (*OpenedF)->status();
+ ASSERT_FALSE(OpenedS.getError());
+ EXPECT_EQ("realname", OpenedS->getName());
+ EXPECT_TRUE(OpenedS->IsVFSMapped);
+
+ auto DirectS = FS->status("vfsname");
+ ASSERT_FALSE(DirectS.getError());
+ EXPECT_EQ("realname", DirectS->getName());
+ EXPECT_TRUE(DirectS->IsVFSMapped);
+
+ EXPECT_EQ(0, NumDiagnostics);
+}
+
+TEST_F(VFSFromYAMLTest, ReturnsInternalPathVFSHit) {
+ IntrusiveRefCntPtr<vfs::InMemoryFileSystem> BaseFS(
+ new vfs::InMemoryFileSystem);
+ BaseFS->addFile("//root/foo/realname", 0,
+ MemoryBuffer::getMemBuffer("contents of a"));
+ auto FS =
+ getFromYAMLString("{ 'use-external-names': false,\n"
+ " 'roots': [\n"
+ "{\n"
+ " 'type': 'directory',\n"
+ " 'name': '//root/foo',\n"
+ " 'contents': [ {\n"
+ " 'type': 'file',\n"
+ " 'name': 'vfsname',\n"
+ " 'external-contents': 'realname'\n"
+ " }\n"
+ " ]\n"
+ "}]}",
+ BaseFS);
+ ASSERT_FALSE(FS->setCurrentWorkingDirectory("//root/foo"));
+
+ auto OpenedF = FS->openFileForRead("vfsname");
+ ASSERT_FALSE(OpenedF.getError());
+ llvm::ErrorOr<std::string> Name = (*OpenedF)->getName();
+ ASSERT_FALSE(Name.getError());
+ EXPECT_EQ("vfsname", Name.get());
+
+ auto OpenedS = (*OpenedF)->status();
+ ASSERT_FALSE(OpenedS.getError());
+ EXPECT_EQ("vfsname", OpenedS->getName());
+ EXPECT_TRUE(OpenedS->IsVFSMapped);
+
+ auto DirectS = FS->status("vfsname");
+ ASSERT_FALSE(DirectS.getError());
+ EXPECT_EQ("vfsname", DirectS->getName());
+ EXPECT_TRUE(DirectS->IsVFSMapped);
+
+ EXPECT_EQ(0, NumDiagnostics);
+}
+
TEST_F(VFSFromYAMLTest, CaseInsensitive) {
IntrusiveRefCntPtr<DummyFileSystem> Lower(new DummyFileSystem());
Lower->addRegularFile("//root/foo/bar/a");