mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-20 03:55:48 -04:00

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
59 lines
2.0 KiB
C++
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
|