teak-llvm/clang-tools-extra/clangd/unittests/FSTests.cpp
Sam McCall 9cca81344c [clangd] Make PreambleStatusCache handle filenames more carefully
Summary:
 - when we hit the cache, the reported filename should be that of the
   cache query, not that of the cache store. This matches behaviors of
   common FSes, and avoids triggering difficult edge cases in
   FileManager when files are being moved around concurrently.
 - filename comparisons (both cache queries and == mainfile checks)
   should fold away . and .. in paths. These can appear when relative
   paths occur in compile_commands.json. (gn does this).

Reviewers: kadircet

Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D63931

llvm-svn: 364740
2019-07-01 10:11:18 +00:00

59 lines
2.0 KiB
C++

//===-- 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);
FS->setCurrentWorkingDirectory(testRoot());
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