brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · 3cdaceb Raw
87 lines · cpp
1//===-- FileCacheTests.cpp ------------------------------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "support/FileCache.h"10 11#include "TestFS.h"12#include "gmock/gmock.h"13#include "gtest/gtest.h"14#include <chrono>15#include <optional>16#include <utility>17 18namespace clang {19namespace clangd {20namespace config {21namespace {22 23class TestCache : public FileCache {24  MockFS FS;25  mutable std::string Value;26 27public:28  TestCache() : FileCache(testPath("foo.cc")) {}29 30  void setContents(const char *C) {31    if (C)32      FS.Files[testPath("foo.cc")] = C;33    else34      FS.Files.erase(testPath("foo.cc"));35  }36 37  std::pair<std::string, /*Parsed=*/bool>38  get(std::chrono::steady_clock::time_point FreshTime) const {39    bool GotParse = false;40    bool GotRead = false;41    std::string Result;42    read(43        FS, FreshTime,44        [&](std::optional<llvm::StringRef> Data) {45          GotParse = true;46          Value = Data.value_or("").str();47        },48        [&]() {49          GotRead = true;50          Result = Value;51        });52    EXPECT_TRUE(GotRead);53    return {Result, GotParse};54  }55};56 57MATCHER_P(Parsed, Value, "") { return arg.second && arg.first == Value; }58MATCHER_P(Cached, Value, "") { return !arg.second && arg.first == Value; }59 60TEST(FileCacheTest, Invalidation) {61  TestCache C;62 63  auto StaleOK = std::chrono::steady_clock::now();64  auto MustBeFresh = StaleOK + std::chrono::hours(1);65 66  C.setContents("a");67  EXPECT_THAT(C.get(StaleOK), Parsed("a")) << "Parsed first time";68  EXPECT_THAT(C.get(StaleOK), Cached("a")) << "Cached (time)";69  EXPECT_THAT(C.get(MustBeFresh), Cached("a")) << "Cached (stat)";70  C.setContents("bb");71  EXPECT_THAT(C.get(StaleOK), Cached("a")) << "Cached (time)";72  EXPECT_THAT(C.get(MustBeFresh), Parsed("bb")) << "Size changed";73  EXPECT_THAT(C.get(MustBeFresh), Cached("bb")) << "Cached (stat)";74  C.setContents(nullptr);75  EXPECT_THAT(C.get(StaleOK), Cached("bb")) << "Cached (time)";76  EXPECT_THAT(C.get(MustBeFresh), Parsed("")) << "stat failed";77  EXPECT_THAT(C.get(MustBeFresh), Cached("")) << "Cached (404)";78  C.setContents("bb"); // Match the previous stat values!79  EXPECT_THAT(C.get(StaleOK), Cached("")) << "Cached (time)";80  EXPECT_THAT(C.get(MustBeFresh), Parsed("bb")) << "Size changed";81}82 83} // namespace84} // namespace config85} // namespace clangd86} // namespace clang87