|  | //===-- FSTests.cpp - File system related tests -----------------*- C++ -*-===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "FS.h" | 
|  | #include "TestFS.h" | 
|  | #include "gmock/gmock.h" | 
|  | #include "gtest/gtest.h" | 
|  |  | 
|  | namespace clang { | 
|  | namespace clangd { | 
|  | namespace { | 
|  |  | 
|  | TEST(FSTests, PreambleStatusCache) { | 
|  | llvm::StringMap<std::string> Files; | 
|  | Files["x"] = ""; | 
|  | Files["y"] = ""; | 
|  | Files["main"] = ""; | 
|  | auto FS = buildTestFS(Files); | 
|  |  | 
|  | PreambleFileStatusCache StatCache(testPath("main")); | 
|  | auto ProduceFS = StatCache.getProducingFS(FS); | 
|  | EXPECT_TRUE(ProduceFS->openFileForRead("x")); | 
|  | EXPECT_TRUE(ProduceFS->status("y")); | 
|  | EXPECT_TRUE(ProduceFS->status("main")); | 
|  |  | 
|  | EXPECT_TRUE(StatCache.lookup(testPath("x")).hasValue()); | 
|  | EXPECT_TRUE(StatCache.lookup(testPath("y")).hasValue()); | 
|  | // Main file is not cached. | 
|  | EXPECT_FALSE(StatCache.lookup(testPath("main")).hasValue()); | 
|  |  | 
|  | llvm::vfs::Status S("fake", llvm::sys::fs::UniqueID(123, 456), | 
|  | std::chrono::system_clock::now(), 0, 0, 1024, | 
|  | llvm::sys::fs::file_type::regular_file, | 
|  | llvm::sys::fs::all_all); | 
|  | StatCache.update(*FS, S); | 
|  | auto ConsumeFS = StatCache.getConsumingFS(FS); | 
|  | auto Cached = ConsumeFS->status(testPath("fake")); | 
|  | EXPECT_TRUE(Cached); | 
|  | EXPECT_EQ(Cached->getName(), testPath("fake")); | 
|  | EXPECT_EQ(Cached->getUniqueID(), S.getUniqueID()); | 
|  |  | 
|  | // fake and temp/../fake should hit the same cache entry. | 
|  | // However, the Status returned reflects the actual path requested. | 
|  | auto CachedDotDot = ConsumeFS->status(testPath("temp/../fake")); | 
|  | EXPECT_TRUE(CachedDotDot); | 
|  | EXPECT_EQ(CachedDotDot->getName(), testPath("temp/../fake")); | 
|  | EXPECT_EQ(CachedDotDot->getUniqueID(), S.getUniqueID()); | 
|  | } | 
|  |  | 
|  | } // namespace | 
|  | } // namespace clangd | 
|  | } // namespace clang |