about summary refs log tree commit diff
path: root/third_party/nix/src/libstore/mock-binary-cache-store.cc
diff options
context:
space:
mode:
authorKane York <kanepyork@gmail.com>2020-08-04T23·44-0700
committerkanepyork <rikingcoding@gmail.com>2020-08-05T04·11+0000
commit3c3527e16bf1d0bf57207dcc54975534f5252225 (patch)
tree43eae1e4f72dee522fedbb2375da4f8b7103e8ca /third_party/nix/src/libstore/mock-binary-cache-store.cc
parent28c7e926ea48e4f5e57b9b8d1a70ccc494b2c188 (diff)
feat(3p/nix): add MockBinaryCacheStore r/1595
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>
Diffstat (limited to 'third_party/nix/src/libstore/mock-binary-cache-store.cc')
-rw-r--r--third_party/nix/src/libstore/mock-binary-cache-store.cc91
1 files changed, 91 insertions, 0 deletions
diff --git a/third_party/nix/src/libstore/mock-binary-cache-store.cc b/third_party/nix/src/libstore/mock-binary-cache-store.cc
new file mode 100644
index 000000000000..995d61521c01
--- /dev/null
+++ b/third_party/nix/src/libstore/mock-binary-cache-store.cc
@@ -0,0 +1,91 @@
+#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