1 //===-- FSTests.cpp - File system related tests -----------------*- C++ -*-===// 2 // 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 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "FS.h" 10 #include "TestFS.h" 11 #include "gmock/gmock.h" 12 #include "gtest/gtest.h" 13 14 namespace clang { 15 namespace clangd { 16 namespace { 17 18 TEST(FSTests, PreambleStatusCache) { 19 llvm::StringMap<std::string> Files; 20 Files["x"] = ""; 21 Files["y"] = ""; 22 Files["main"] = ""; 23 auto FS = buildTestFS(Files); 24 25 PreambleFileStatusCache StatCache(testPath("main")); 26 auto ProduceFS = StatCache.getProducingFS(FS); 27 EXPECT_TRUE(ProduceFS->openFileForRead("x")); 28 EXPECT_TRUE(ProduceFS->status("y")); 29 EXPECT_TRUE(ProduceFS->status("main")); 30 31 EXPECT_TRUE(StatCache.lookup(testPath("x")).has_value()); 32 EXPECT_TRUE(StatCache.lookup(testPath("y")).has_value()); 33 // Main file is not cached. 34 EXPECT_FALSE(StatCache.lookup(testPath("main")).has_value()); 35 36 llvm::vfs::Status S("fake", llvm::sys::fs::UniqueID(123, 456), 37 std::chrono::system_clock::now(), 0, 0, 1024, 38 llvm::sys::fs::file_type::regular_file, 39 llvm::sys::fs::all_all); 40 StatCache.update(*FS, S); 41 auto ConsumeFS = StatCache.getConsumingFS(FS); 42 auto Cached = ConsumeFS->status(testPath("fake")); 43 EXPECT_TRUE(Cached); 44 EXPECT_EQ(Cached->getName(), testPath("fake")); 45 EXPECT_EQ(Cached->getUniqueID(), S.getUniqueID()); 46 47 // fake and temp/../fake should hit the same cache entry. 48 // However, the Status returned reflects the actual path requested. 49 auto CachedDotDot = ConsumeFS->status(testPath("temp/../fake")); 50 EXPECT_TRUE(CachedDotDot); 51 EXPECT_EQ(CachedDotDot->getName(), testPath("temp/../fake")); 52 EXPECT_EQ(CachedDotDot->getUniqueID(), S.getUniqueID()); 53 } 54 55 } // namespace 56 } // namespace clangd 57 } // namespace clang 58