about summary refs log tree commit diff
path: root/third_party/nix/src/tests/store_tests.cc
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/nix/src/tests/store_tests.cc')
-rw-r--r--third_party/nix/src/tests/store_tests.cc122
1 files changed, 122 insertions, 0 deletions
diff --git a/third_party/nix/src/tests/store_tests.cc b/third_party/nix/src/tests/store_tests.cc
new file mode 100644
index 0000000000..a6ffb715a9
--- /dev/null
+++ b/third_party/nix/src/tests/store_tests.cc
@@ -0,0 +1,122 @@
+#include <filesystem>
+
+#include <absl/container/btree_map.h>
+#include <absl/container/flat_hash_map.h>
+#include <absl/strings/escaping.h>
+#include <glog/logging.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+#include <sys/random.h>
+
+#include "libstore/binary-cache-store.hh"
+#include "libstore/mock-binary-cache-store.hh"
+#include "tests/store-util.hh"
+
+using ::testing::HasSubstr;
+
+namespace nix {
+
+MakeError(InjectedError, Error);
+
+class BinaryCacheStoreTest : public StoreTest {};
+
+constexpr absl::string_view kXZHeader = "7zXZ";
+
+constexpr absl::string_view kRootFileName = "myRootFile";
+constexpr absl::string_view kDep1FileName = "dep1";
+constexpr absl::string_view kDep1FileContents = "==dep1 contents==";
+constexpr absl::string_view kDep1NarCache =
+    "nar/0hfdc95cy6mxi4c15pp0frdf97r7yvd8c141qzvpms2f8x17p2ig.nar.xz";
+constexpr absl::string_view kBogusPath =
+    "/nix/store/g1ghizdg18k0d00000000000000z3v32-doesNotExist";
+
+struct TestTree {
+  Path rootPath;
+  Path dep1Path;
+};
+
+TestTree AddTestTreeToStore(Store& store) {
+  TestTree results;
+  results.rootPath =
+      store.addTextToStore(std::string(kRootFileName), "1", PathSet());
+
+  PathSet onlyRoot;
+  onlyRoot.insert(results.rootPath);
+  results.dep1Path = store.addTextToStore(
+      std::string(kDep1FileName), std::string(kDep1FileContents), onlyRoot);
+
+  return results;
+}
+
+TEST_F(BinaryCacheStoreTest, BasicStorage) {
+  MockBinaryCacheStore::Params params;
+  MockBinaryCacheStore store(params);
+
+  store.init();
+
+  auto tree = AddTestTreeToStore(store);
+
+  EXPECT_TRUE(store.isValidPath(tree.rootPath));
+  EXPECT_TRUE(store.isValidPath(tree.dep1Path));
+
+  StringSink sink;
+  store.narFromPath(tree.dep1Path, sink);
+  EXPECT_THAT(*sink.s, HasSubstr(kDep1FileContents));
+
+  EXPECT_THAT(*store.BinaryCacheStore::getFile(Path(kDep1NarCache)),
+              HasSubstr(kXZHeader));
+}
+
+TEST_F(BinaryCacheStoreTest, BasicErrors) {
+  MockBinaryCacheStore::Params params;
+  MockBinaryCacheStore store(params);
+
+  store.init();
+
+  auto tree = AddTestTreeToStore(store);
+  store.PrepareErrorInjection(std::string(kDep1NarCache),
+                              []() { throw InjectedError("injected"); });
+
+  {
+    StringSink sink;
+    EXPECT_THROW(store.narFromPath(tree.dep1Path, sink), InjectedError);
+  }
+  {
+    StringSink sink;
+    EXPECT_THROW(store.narFromPath(std::string(kBogusPath), sink),
+                 NoSuchBinaryCacheFile);
+  }
+}
+
+// ./tests/add.sh
+TEST_F(StoreTest, AddFileHashes) {
+  auto store_ = OpenTemporaryStore();
+  CHECK(store_.ok()) << "failed to open temporary store";
+  nix::Store* store = store_->release();
+  nix::Path dataPath = NIX_SRC_DIR "/src/tests/lang/data";
+  std::string dataName = "data";
+
+  nix::Path path1 = store->addToStore(dataName, dataPath);
+
+  nix::Path path2 = store->addToStore(dataName, dataPath, /*recursive=*/true,
+                                      HashType::htSHA256);
+
+  EXPECT_EQ(path1, path2) << "nix-store --add and --add-fixed mismatch";
+
+  nix::Path path3 = store->addToStore(dataName, dataPath, /*recursive=*/false,
+                                      HashType::htSHA256);
+  EXPECT_NE(path1, path3);
+
+  nix::Path path4 =
+      store->addToStore(dataName, dataPath, false, HashType::htSHA1);
+  EXPECT_NE(path1, path4);
+
+  auto info1 = store->queryPathInfo(store->followLinksToStorePath(path1));
+  ASSERT_EQ(info1->narHash.type, HashType::htSHA256);
+
+  Hash h = nix::hashPath(HashType::htSHA256, dataPath).first;
+
+  EXPECT_EQ(info1->narHash.to_string(), h.to_string());
+}
+
+}  // namespace nix