about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--third_party/nix/CMakeLists.txt8
-rw-r--r--third_party/nix/default.nix27
-rw-r--r--third_party/nix/src/CMakeLists.txt4
-rw-r--r--third_party/nix/src/libstore/store-api.cc2
-rw-r--r--third_party/nix/src/tests/CMakeLists.txt11
-rw-r--r--third_party/nix/src/tests/value-to-json.cc91
6 files changed, 97 insertions, 46 deletions
diff --git a/third_party/nix/CMakeLists.txt b/third_party/nix/CMakeLists.txt
index 4e6b209c36..f796ccdee4 100644
--- a/third_party/nix/CMakeLists.txt
+++ b/third_party/nix/CMakeLists.txt
@@ -38,4 +38,12 @@ INSTALL(DIRECTORY corepkgs
     PATTERN "*.nix")
 INSTALL(FILES "${PROJECT_BINARY_DIR}/config.nix" DESTINATION "${CMAKE_INSTALL_DATADIR}/nix/corepkgs")
 
+# Conditionally run tests
+option(PACKAGE_TESTS "Build the tests" ON)
+if (PACKAGE_TESTS)
+  enable_testing()
+  find_package(GTest)
+  include(GoogleTest)
+endif()
+
 add_subdirectory(src)
diff --git a/third_party/nix/default.nix b/third_party/nix/default.nix
index f998960214..ad1ff5beeb 100644
--- a/third_party/nix/default.nix
+++ b/third_party/nix/default.nix
@@ -52,6 +52,7 @@ in pkgs.llvmPackages.libcxxStdenv.mkDerivation {
     flex
     glog
     grpc
+    gtest
     libseccomp
     libsodium
     openssl
@@ -60,11 +61,37 @@ in pkgs.llvmPackages.libcxxStdenv.mkDerivation {
     xz
   ];
 
+  doCheck = false;
+  doInstallCheck = true;
+
   propagatedBuildInputs = with pkgs; [
     boost
     largeBoehm
   ];
 
+  configurePhase = ''
+    mkdir build
+    cd build
+    cmake .. \
+      -DCMAKE_INSTALL_PREFIX=$out \
+      -DCMAKE_BUILD_TYPE=Release \
+      -DCMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY=OFF \
+      -DCMAKE_FIND_USE_PACKAGE_REGISTRY=OFF \
+      -DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON
+  '';
+
+  installCheckPhase = ''
+    export NIX_DATA_DIR=$out/share
+    make test
+  '';
+
+  preBuild = ''
+    if [ -n "$NIX_BUILD_CORES" ]; then
+      makeFlags+="-j$NIX_BUILD_CORES "
+      makeFlags+="-l$NIX_BUILD_CORES "
+    fi
+  '';
+
   # Forward the location of the generated Protobuf / gRPC files so
   # that they can be included by CMake.
   NIX_PROTO_SRCS = protoSrcs;
diff --git a/third_party/nix/src/CMakeLists.txt b/third_party/nix/src/CMakeLists.txt
index 05386fa2dd..3775333ee3 100644
--- a/third_party/nix/src/CMakeLists.txt
+++ b/third_party/nix/src/CMakeLists.txt
@@ -11,6 +11,10 @@ add_subdirectory(libstore)
 add_subdirectory(libmain)
 add_subdirectory(libexpr)
 
+if (PACKAGE_TESTS)
+  add_subdirectory(tests)
+endif()
+
 add_executable(nix)
 set_property(TARGET nix PROPERTY CXX_STANDARD 17)
 include_directories(${PROJECT_BINARY_DIR})
diff --git a/third_party/nix/src/libstore/store-api.cc b/third_party/nix/src/libstore/store-api.cc
index f28b13c83d..dd1b199d92 100644
--- a/third_party/nix/src/libstore/store-api.cc
+++ b/third_party/nix/src/libstore/store-api.cc
@@ -446,7 +446,7 @@ PathSet Store::queryValidPaths(const PathSet& paths,
    responsibility of the caller to provide a closure. */
 std::string Store::makeValidityRegistration(const PathSet& paths,
                                             bool showDerivers, bool showHash) {
-  std::string s = s;
+  std::string s;
 
   for (auto& i : paths) {
     s += i + "\n";
diff --git a/third_party/nix/src/tests/CMakeLists.txt b/third_party/nix/src/tests/CMakeLists.txt
new file mode 100644
index 0000000000..0cbb8c7747
--- /dev/null
+++ b/third_party/nix/src/tests/CMakeLists.txt
@@ -0,0 +1,11 @@
+# -*- mode: cmake; -*-
+include_directories(${PROJECT_BINARY_DIR}) # for 'generated/'
+
+add_executable(value-to-json value-to-json.cc)
+target_link_libraries(value-to-json
+  nixexpr
+  nixstore
+  GTest::gtest_main
+)
+
+gtest_discover_tests(value-to-json)
diff --git a/third_party/nix/src/tests/value-to-json.cc b/third_party/nix/src/tests/value-to-json.cc
index 462d2fda01..7446987334 100644
--- a/third_party/nix/src/tests/value-to-json.cc
+++ b/third_party/nix/src/tests/value-to-json.cc
@@ -1,12 +1,13 @@
-#include "value-to-json.hh"
+#include "libexpr/value-to-json.hh"
 
+#include <set>
 #include <sstream>
 
 #include <gtest/gtest.h>
 
-#include "store-api.hh"
-#include "value-to-xml.hh"
-#include "value.hh"
+#include "libexpr/value-to-xml.hh"
+#include "libexpr/value.hh"
+#include "libstore/store-api.hh"
 
 class ValueTest : public ::testing::Test {
  protected:
@@ -20,46 +21,46 @@ class XMLValueTest : public ValueTest {};
 
 namespace nix {
 
-class DummyStore : public Store {
+class DummyStore final : public Store {
  public:
   explicit DummyStore() : Store(Store::Params{}) {}
 
   std::string getUri() { return ""; }
-  virtual void queryPathInfoUncached(const StorePath&) {}
-  virtual void queryPathInfoUncached(
-      const StorePath&,
-      nix::Callback<std::shared_ptr<const nix::ValidPathInfo>>) noexcept {}
-  std::optional<StorePath> queryPathFromHashPart(const std::string& hashPart) {
-    return {};
-  }
-  StorePath addToStore(const std::string&, const std::string&,
-                       const StorePathSet&, nix::RepairFlag) {
-    return StorePath::dummy.clone();
-  }
-  StorePath addToStore(const std::string&, const Path&, bool, nix::HashType,
-                       nix::PathFilter&, nix::RepairFlag) {
-    return StorePath::dummy.clone();
+
+  void queryPathInfoUncached(
+      const Path& path,
+      Callback<std::shared_ptr<ValidPathInfo>> callback) noexcept {}
+
+  Path queryPathFromHashPart(const std::string& hashPart) { return ""; }
+
+  Path addToStore(const std::string& name, const Path& srcPath,
+                  bool recursive = true, HashType hashAlgo = htSHA256,
+                  PathFilter& filter = defaultPathFilter,
+                  RepairFlag repair = NoRepair) {
+    return "/nix/store/g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-x";
   }
-  StorePath addTextToStore(const std::string&, const std::string&,
-                           const StorePathSet&, nix::RepairFlag) {
-    return StorePath::dummy.clone();
+
+  Path addTextToStore(const std::string& name, const std::string& s,
+                      const PathSet& references, RepairFlag repair = NoRepair) {
+    return "/nix/store/g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-x";
   }
 
-  void narFromPath(const StorePath&, Sink&) {}
-  void ensurePath(const StorePath&) {}
+  void narFromPath(const Path& path, Sink& sink) {}
 
-  BuildResult buildDerivation(const StorePath&, const BasicDerivation&,
-                              BuildMode) {
+  BuildResult buildDerivation(const Path& drvPath, const BasicDerivation& drv,
+                              BuildMode buildMode = bmNormal) {
     return BuildResult{};
   }
+
+  void ensurePath(const Path& path) {}
 };
 
 TEST_F(JSONValueTest, null) {
   std::stringstream ss;
   Value v;
   PathSet ps;
-  auto store = std::make_shared<DummyStore>();
-  EvalState s({}, ref<Store>(store), false);
+  std::shared_ptr<Store> store = std::make_shared<DummyStore>();
+  EvalState s({}, ref<Store>(store));
 
   mkNull(v);
   printValueAsJSON(s, true, v, ss, ps);
@@ -69,7 +70,7 @@ TEST_F(JSONValueTest, null) {
 TEST_F(JSONValueTest, BoolFalse) {
   std::stringstream ss;
   auto store = std::make_shared<DummyStore>();
-  EvalState s({"."}, ref<Store>(store), false);
+  EvalState s({"."}, ref<Store>(store));
   Value v;
   PathSet ps;
 
@@ -81,7 +82,7 @@ TEST_F(JSONValueTest, BoolFalse) {
 TEST_F(JSONValueTest, BoolTrue) {
   std::stringstream ss;
   auto store = std::make_shared<DummyStore>();
-  EvalState s({"."}, ref<Store>(store), false);
+  EvalState s({"."}, ref<Store>(store));
   Value v;
   PathSet ps;
 
@@ -93,7 +94,7 @@ TEST_F(JSONValueTest, BoolTrue) {
 TEST_F(JSONValueTest, IntPositive) {
   std::stringstream ss;
   auto store = std::make_shared<DummyStore>();
-  EvalState s({"."}, ref<Store>(store), false);
+  EvalState s({"."}, ref<Store>(store));
   Value v;
   PathSet ps;
 
@@ -105,7 +106,7 @@ TEST_F(JSONValueTest, IntPositive) {
 TEST_F(JSONValueTest, IntNegative) {
   std::stringstream ss;
   auto store = std::make_shared<DummyStore>();
-  EvalState s({"."}, ref<Store>(store), false);
+  EvalState s({"."}, ref<Store>(store));
   Value v;
   PathSet ps;
 
@@ -117,7 +118,7 @@ TEST_F(JSONValueTest, IntNegative) {
 TEST_F(JSONValueTest, String) {
   std::stringstream ss;
   auto store = std::make_shared<DummyStore>();
-  EvalState s({"."}, ref<Store>(store), false);
+  EvalState s({"."}, ref<Store>(store));
   Value v;
   PathSet ps;
 
@@ -129,7 +130,7 @@ TEST_F(JSONValueTest, String) {
 TEST_F(JSONValueTest, StringQuotes) {
   std::stringstream ss;
   auto store = std::make_shared<DummyStore>();
-  EvalState s({"."}, ref<Store>(store), false);
+  EvalState s({"."}, ref<Store>(store));
   Value v;
   PathSet ps;
 
@@ -141,7 +142,7 @@ TEST_F(JSONValueTest, StringQuotes) {
 TEST_F(JSONValueTest, Path) {
   std::stringstream ss;
   auto store = std::make_shared<DummyStore>();
-  EvalState s({"."}, ref<Store>(store), false);
+  EvalState s({"."}, ref<Store>(store));
   Value v;
   PathSet ps;
 
@@ -153,7 +154,7 @@ TEST_F(JSONValueTest, Path) {
 TEST_F(JSONValueTest, PathNoCopy) {
   std::stringstream ss;
   auto store = std::make_shared<DummyStore>();
-  EvalState s({"."}, ref<Store>(store), false);
+  EvalState s({"."}, ref<Store>(store));
   Value v;
   PathSet ps;
 
@@ -174,7 +175,7 @@ TEST_F(XMLValueTest, null) {
   Value v;
   PathSet ps;
   auto store = std::make_shared<DummyStore>();
-  EvalState s({}, ref<Store>(store), false);
+  EvalState s({}, ref<Store>(store));
 
   mkNull(v);
   printValueAsXML(s, true, true, v, ss, ps);
@@ -184,7 +185,7 @@ TEST_F(XMLValueTest, null) {
 TEST_F(XMLValueTest, BoolFalse) {
   std::stringstream ss;
   auto store = std::make_shared<DummyStore>();
-  EvalState s({"."}, ref<Store>(store), false);
+  EvalState s({"."}, ref<Store>(store));
   Value v;
   PathSet ps;
 
@@ -196,7 +197,7 @@ TEST_F(XMLValueTest, BoolFalse) {
 TEST_F(XMLValueTest, BoolTrue) {
   std::stringstream ss;
   auto store = std::make_shared<DummyStore>();
-  EvalState s({"."}, ref<Store>(store), false);
+  EvalState s({"."}, ref<Store>(store));
   Value v;
   PathSet ps;
 
@@ -208,7 +209,7 @@ TEST_F(XMLValueTest, BoolTrue) {
 TEST_F(XMLValueTest, IntPositive) {
   std::stringstream ss;
   auto store = std::make_shared<DummyStore>();
-  EvalState s({"."}, ref<Store>(store), false);
+  EvalState s({"."}, ref<Store>(store));
   Value v;
   PathSet ps;
 
@@ -220,7 +221,7 @@ TEST_F(XMLValueTest, IntPositive) {
 TEST_F(XMLValueTest, IntNegative) {
   std::stringstream ss;
   auto store = std::make_shared<DummyStore>();
-  EvalState s({"."}, ref<Store>(store), false);
+  EvalState s({"."}, ref<Store>(store));
   Value v;
   PathSet ps;
 
@@ -232,7 +233,7 @@ TEST_F(XMLValueTest, IntNegative) {
 TEST_F(XMLValueTest, String) {
   std::stringstream ss;
   auto store = std::make_shared<DummyStore>();
-  EvalState s({"."}, ref<Store>(store), false);
+  EvalState s({"."}, ref<Store>(store));
   Value v;
   PathSet ps;
 
@@ -244,7 +245,7 @@ TEST_F(XMLValueTest, String) {
 TEST_F(XMLValueTest, StringQuotes) {
   std::stringstream ss;
   auto store = std::make_shared<DummyStore>();
-  EvalState s({"."}, ref<Store>(store), false);
+  EvalState s({"."}, ref<Store>(store));
   Value v;
   PathSet ps;
 
@@ -260,7 +261,7 @@ TEST_F(XMLValueTest, StringQuotes) {
 TEST_F(XMLValueTest, Path) {
   std::stringstream ss;
   auto store = std::make_shared<DummyStore>();
-  EvalState s({"."}, ref<Store>(store), false);
+  EvalState s({"."}, ref<Store>(store));
   Value v;
   PathSet ps;
 
@@ -276,7 +277,7 @@ TEST_F(XMLValueTest, Path) {
 TEST_F(XMLValueTest, PathNoCopy) {
   std::stringstream ss;
   auto store = std::make_shared<DummyStore>();
-  EvalState s({"."}, ref<Store>(store), false);
+  EvalState s({"."}, ref<Store>(store));
   Value v;
   PathSet ps;