diff --git a/llvm/unittests/Support/VirtualFileSystemTest.cpp b/llvm/unittests/Support/VirtualFileSystemTest.cpp --- a/llvm/unittests/Support/VirtualFileSystemTest.cpp +++ b/llvm/unittests/Support/VirtualFileSystemTest.cpp @@ -2274,3 +2274,54 @@ EXPECT_FALSE(FS->exists(_b.Path + "/b")); EXPECT_FALSE(FS->exists(_c.Path + "/c")); } + +TEST_F(VFSFromYAMLTest, YAMLVFSWriterTestNestedDirs) { + ScopedDir TestDirectory("virtual-file-system-test", /*Unique*/ true); + ScopedDir a(TestDirectory + "/a"); + ScopedDir _a_aa(TestDirectory + "/a/aa"); + ScopedDir b(TestDirectory + "/b"); + ScopedDir _b_bb(TestDirectory + "/b/bb"); + ScopedDir c(TestDirectory + "/c"); + ScopedDir _c_cc(TestDirectory + "/c/cc"); + + vfs::YAMLVFSWriter VFSWriter; + VFSWriter.addDirectoryMapping(a.Path, "//root/a"); + VFSWriter.addDirectoryMapping(_a_aa.Path, "//root/a/aa"); + VFSWriter.addDirectoryMapping(b.Path, "//root/b"); + VFSWriter.addDirectoryMapping(_b_bb.Path, "//root/b/bb"); + VFSWriter.addDirectoryMapping(c.Path, "//root/c"); + VFSWriter.addDirectoryMapping(_c_cc.Path, "//root/c/cc"); + + std::string Buffer; + raw_string_ostream OS(Buffer); + VFSWriter.write(OS); + OS.flush(); + + IntrusiveRefCntPtr Lower(new ErrorDummyFileSystem()); + Lower->addDirectory("//root/a"); + Lower->addDirectory("//root/a/aa"); + Lower->addDirectory("//root/b"); + Lower->addDirectory("//root/b/bb"); + Lower->addDirectory("//root/c"); + Lower->addDirectory("//root/c/cc"); + + IntrusiveRefCntPtr FS = getFromYAMLRawString(Buffer, Lower); + ASSERT_TRUE(FS.get() != nullptr); + + EXPECT_TRUE(FS->exists(a.Path)); + EXPECT_TRUE(FS->exists(_a_aa.Path)); + EXPECT_TRUE(FS->exists(b.Path)); + EXPECT_TRUE(FS->exists(_b_bb.Path)); + EXPECT_TRUE(FS->exists(c.Path)); + EXPECT_TRUE(FS->exists(_c_cc.Path)); +} + +TEST(YAMLVFSWriterTest, HandleRootAsVPath) { + llvm::vfs::YAMLVFSWriter W; + W.addDirectoryMapping("/", "/tmp"); + W.addDirectoryMapping("/foo", "/tmp/bar"); + std::string Dump; + llvm::raw_string_ostream ToBeIgnored(Dump); + + EXPECT_NO_FATAL_FAILURE(W.write(ToBeIgnored)); +}