This adds an implementation of BinaryCacheStore to be used by tests exercising both the logic inherent to BinaryCacheStore and more general Store tests. A new library target, nixstoremock, is created to indicate that this file is intended only for use in tests and not in user-facing code. Change-Id: Ib68f777238843a4f3a2303db8a69735fbc22d161 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1645 Tested-by: BuildkiteCI Reviewed-by: glittershark <grfn@gws.fyi>
91 lines
2.4 KiB
C++
91 lines
2.4 KiB
C++
#include "libstore/mock-binary-cache-store.hh"
|
|
|
|
#include <glog/logging.h>
|
|
|
|
namespace nix {
|
|
|
|
MockBinaryCacheStore::MockBinaryCacheStore(const Params& params)
|
|
: BinaryCacheStore(params), contents_(), errorInjections_() {}
|
|
|
|
std::string MockBinaryCacheStore::getUri() { return "mock://1"; }
|
|
|
|
bool MockBinaryCacheStore::fileExists(const std::string& path) {
|
|
ThrowInjectedErrors(path);
|
|
|
|
return contents_.find(path) != contents_.end();
|
|
};
|
|
|
|
void MockBinaryCacheStore::upsertFile(const std::string& path,
|
|
const std::string& data,
|
|
const std::string& mimeType) {
|
|
ThrowInjectedErrors(path);
|
|
|
|
contents_[path] = MemoryFile{data, mimeType};
|
|
}
|
|
|
|
void MockBinaryCacheStore::getFile(
|
|
const std::string& path,
|
|
Callback<std::shared_ptr<std::string>> callback) noexcept {
|
|
auto eit = errorInjections_.find(path);
|
|
if (eit != errorInjections_.end()) {
|
|
try {
|
|
eit->second();
|
|
LOG(FATAL) << "thrower failed to throw";
|
|
} catch (...) {
|
|
callback.rethrow();
|
|
}
|
|
return;
|
|
}
|
|
|
|
auto it = contents_.find(path);
|
|
if (it == contents_.end()) {
|
|
try {
|
|
throw NoSuchBinaryCacheFile(absl::StrCat(
|
|
"file '", path, "' was not added to the MockBinaryCache"));
|
|
} catch (...) {
|
|
callback.rethrow();
|
|
}
|
|
return;
|
|
}
|
|
callback(std::make_shared<std::string>(it->second.data));
|
|
}
|
|
|
|
PathSet MockBinaryCacheStore::queryAllValidPaths() {
|
|
PathSet paths;
|
|
|
|
for (auto it : contents_) {
|
|
paths.insert(it.first);
|
|
}
|
|
|
|
return paths;
|
|
}
|
|
|
|
void MockBinaryCacheStore::DeleteFile(const std::string& path) {
|
|
contents_.erase(path);
|
|
}
|
|
|
|
// Same as upsert, but bypasses injected errors.
|
|
void MockBinaryCacheStore::SetFileContentsForTest(const std::string& path,
|
|
const std::string& data,
|
|
const std::string& mimeType) {
|
|
contents_[path] = MemoryFile{data, mimeType};
|
|
}
|
|
|
|
void MockBinaryCacheStore::PrepareErrorInjection(
|
|
const std::string& path, std::function<void()> err_factory) {
|
|
errorInjections_[path] = err_factory;
|
|
}
|
|
|
|
void MockBinaryCacheStore::CancelErrorInjection(const std::string& path) {
|
|
errorInjections_.erase(path);
|
|
}
|
|
|
|
void MockBinaryCacheStore::ThrowInjectedErrors(const std::string& path) {
|
|
auto it = errorInjections_.find(path);
|
|
if (it != errorInjections_.end()) {
|
|
it->second();
|
|
LOG(FATAL) << "thrower failed to throw";
|
|
}
|
|
}
|
|
|
|
} // namespace nix
|