This PR include two changes: 1. Change debuginfod cache file name to include origin file name, the new file name would be something like: llvmcache-13267c5f5d2e3df472c133c8efa45fb3331ef1ea-liblzma.so.5.2.2.debuginfo.dwp So it will provide more information in image list instead of a plain llvmcache-123 2. Switch debuginfod cache to use lldb index cache settings. Currently we don't have proper settings for setting the cache path or the cache expiration time for debuginfod cache. We want to use the lldb index cache settings, as they make sense to be in the same place and have the same TTL. --------- Co-authored-by: George Hu <georgehuyubo@gmail.com>
71 lines
3.0 KiB
C++
71 lines
3.0 KiB
C++
//===-- llvm/unittest/Support/DebuginfodTests.cpp - unit tests ------------===//
|
|
//
|
|
// 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 "llvm/Debuginfod/Debuginfod.h"
|
|
#include "llvm/Debuginfod/HTTPClient.h"
|
|
#include "llvm/Support/FileSystem.h"
|
|
#include "llvm/Support/Path.h"
|
|
#include "llvm/Testing/Support/Error.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
#ifdef _WIN32
|
|
#define setenv(name, var, ignore) _putenv_s(name, var)
|
|
#endif
|
|
|
|
#define ASSERT_NO_ERROR(x) \
|
|
if (std::error_code ASSERT_NO_ERROR_ec = x) { \
|
|
SmallString<128> MessageStorage; \
|
|
raw_svector_ostream Message(MessageStorage); \
|
|
Message << #x ": did not return errc::success.\n" \
|
|
<< "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \
|
|
<< "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \
|
|
GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \
|
|
} else { \
|
|
}
|
|
|
|
using namespace llvm;
|
|
|
|
// Check that the Debuginfod client can find locally cached artifacts.
|
|
TEST(DebuginfodClient, CacheHit) {
|
|
int FD;
|
|
SmallString<64> CachedFilePath;
|
|
sys::fs::createTemporaryFile("llvmcache-key", "temp", FD, CachedFilePath);
|
|
StringRef CacheDir = sys::path::parent_path(CachedFilePath);
|
|
StringRef UniqueKey = sys::path::filename(CachedFilePath);
|
|
llvm::CachePruningPolicy policy;
|
|
EXPECT_TRUE(UniqueKey.consume_front("llvmcache-"));
|
|
raw_fd_ostream OF(FD, true, /*unbuffered=*/true);
|
|
OF << "contents\n";
|
|
OF << CacheDir << "\n";
|
|
OF.close();
|
|
Expected<std::string> PathOrErr = getCachedOrDownloadArtifact(
|
|
UniqueKey, /*UrlPath=*/"/null", CacheDir,
|
|
/*DebuginfodUrls=*/{}, /*Timeout=*/std::chrono::milliseconds(1), policy);
|
|
EXPECT_THAT_EXPECTED(PathOrErr, HasValue(CachedFilePath));
|
|
}
|
|
|
|
// Check that the Debuginfod client returns an Error when it fails to find an
|
|
// artifact.
|
|
TEST(DebuginfodClient, CacheMiss) {
|
|
SmallString<32> CacheDir;
|
|
ASSERT_NO_ERROR(
|
|
sys::fs::createUniqueDirectory("debuginfod-unittest", CacheDir));
|
|
sys::path::append(CacheDir, "cachedir");
|
|
ASSERT_FALSE(sys::fs::exists(CacheDir));
|
|
setenv("DEBUGINFOD_CACHE_PATH", CacheDir.c_str(),
|
|
/*replace=*/1);
|
|
// Ensure there are no urls to guarantee a cache miss.
|
|
setenv("DEBUGINFOD_URLS", "", /*replace=*/1);
|
|
HTTPClient::initialize();
|
|
Expected<std::string> PathOrErr = getCachedOrDownloadArtifact(
|
|
/*UniqueKey=*/"nonexistent-key", /*UrlPath=*/"/null");
|
|
EXPECT_THAT_EXPECTED(PathOrErr, Failed<StringError>());
|
|
// A cache miss with no possible URLs should not create the cache directory.
|
|
EXPECT_FALSE(sys::fs::exists(CacheDir));
|
|
}
|