aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/unit/libstore/characterization.hh28
-rw-r--r--tests/unit/libstore/common-protocol.cc2
-rw-r--r--tests/unit/libstore/derivation.cc2
-rw-r--r--tests/unit/libstore/protocol.hh2
-rw-r--r--tests/unit/libstore/serve-protocol.cc2
-rw-r--r--tests/unit/libstore/worker-protocol.cc2
-rw-r--r--tests/unit/libutil-support/tests/characterization.hh116
7 files changed, 121 insertions, 33 deletions
diff --git a/tests/unit/libstore/characterization.hh b/tests/unit/libstore/characterization.hh
deleted file mode 100644
index 46bf4b2e5..000000000
--- a/tests/unit/libstore/characterization.hh
+++ /dev/null
@@ -1,28 +0,0 @@
-#pragma once
-///@file
-
-namespace nix {
-
-/**
- * The path to the `unit-test-data` directory. See the contributing
- * guide in the manual for further details.
- */
-static Path getUnitTestData() {
- return getEnv("_NIX_TEST_UNIT_DATA").value();
-}
-
-/**
- * Whether we should update "golden masters" instead of running tests
- * against them. See the contributing guide in the manual for further
- * details.
- */
-static bool testAccept() {
- return getEnv("_NIX_TEST_ACCEPT") == "1";
-}
-
-constexpr std::string_view cannotReadGoldenMaster =
- "Cannot read golden master because another test is also updating it";
-
-constexpr std::string_view updatingGoldenMaster =
- "Updating golden master";
-}
diff --git a/tests/unit/libstore/common-protocol.cc b/tests/unit/libstore/common-protocol.cc
index 4c9ffb1ce..a820cb1c2 100644
--- a/tests/unit/libstore/common-protocol.cc
+++ b/tests/unit/libstore/common-protocol.cc
@@ -7,7 +7,7 @@
#include "common-protocol-impl.hh"
#include "build-result.hh"
#include "protocol.hh"
-#include "characterization.hh"
+#include "tests/characterization.hh"
namespace nix {
diff --git a/tests/unit/libstore/derivation.cc b/tests/unit/libstore/derivation.cc
index 2c4857c77..ca0cdff71 100644
--- a/tests/unit/libstore/derivation.cc
+++ b/tests/unit/libstore/derivation.cc
@@ -5,7 +5,7 @@
#include "derivations.hh"
#include "tests/libstore.hh"
-#include "characterization.hh"
+#include "tests/characterization.hh"
namespace nix {
diff --git a/tests/unit/libstore/protocol.hh b/tests/unit/libstore/protocol.hh
index 52689c51b..7fdd3e11c 100644
--- a/tests/unit/libstore/protocol.hh
+++ b/tests/unit/libstore/protocol.hh
@@ -2,7 +2,7 @@
#include <gtest/gtest.h>
#include "tests/libstore.hh"
-#include "characterization.hh"
+#include "tests/characterization.hh"
namespace nix {
diff --git a/tests/unit/libstore/serve-protocol.cc b/tests/unit/libstore/serve-protocol.cc
index 138f31b47..6cc60ca3e 100644
--- a/tests/unit/libstore/serve-protocol.cc
+++ b/tests/unit/libstore/serve-protocol.cc
@@ -7,7 +7,7 @@
#include "serve-protocol-impl.hh"
#include "build-result.hh"
#include "protocol.hh"
-#include "characterization.hh"
+#include "tests/characterization.hh"
namespace nix {
diff --git a/tests/unit/libstore/worker-protocol.cc b/tests/unit/libstore/worker-protocol.cc
index 1389e2bac..2d6fbd58f 100644
--- a/tests/unit/libstore/worker-protocol.cc
+++ b/tests/unit/libstore/worker-protocol.cc
@@ -8,7 +8,7 @@
#include "derived-path.hh"
#include "build-result.hh"
#include "protocol.hh"
-#include "characterization.hh"
+#include "tests/characterization.hh"
namespace nix {
diff --git a/tests/unit/libutil-support/tests/characterization.hh b/tests/unit/libutil-support/tests/characterization.hh
new file mode 100644
index 000000000..6ee994d71
--- /dev/null
+++ b/tests/unit/libutil-support/tests/characterization.hh
@@ -0,0 +1,116 @@
+#pragma once
+///@file
+
+#include <gtest/gtest.h>
+
+#include <filesystem>
+
+#include "util.hh"
+#include "types.hh"
+
+namespace nix {
+
+/**
+ * The path to the unit test data directory. See the contributing guide
+ * in the manual for further details.
+ */
+static Path getUnitTestData() {
+ return getEnv("_NIX_TEST_UNIT_DATA").value();
+}
+
+/**
+ * Whether we should update "golden masters" instead of running tests
+ * against them. See the contributing guide in the manual for further
+ * details.
+ */
+static bool testAccept() {
+ return getEnv("_NIX_TEST_ACCEPT") == "1";
+}
+
+/**
+ * Mixin class for writing characterization tests
+ */
+class CharacterizationTest : public virtual ::testing::Test
+{
+protected:
+ /**
+ * While the "golden master" for this characterization test is
+ * located. It should not be shared with any other test.
+ */
+ virtual Path goldenMaster(PathView testStem) const = 0;
+
+public:
+ /**
+ * Golden test for reading
+ *
+ * @param test hook that takes the contents of the file and does the
+ * actual work
+ */
+ void readTest(PathView testStem, auto && test)
+ {
+ auto file = goldenMaster(testStem);
+
+ if (testAccept())
+ {
+ GTEST_SKIP()
+ << "Cannot read golden master "
+ << file
+ << "because another test is also updating it";
+ }
+ else
+ {
+ test(readFile(file));
+ }
+ }
+
+ /**
+ * Golden test for writing
+ *
+ * @param test hook that produces contents of the file and does the
+ * actual work
+ */
+ void writeTest(
+ PathView testStem, auto && test, auto && readFile2, auto && writeFile2)
+ {
+ auto file = goldenMaster(testStem);
+
+ auto got = test();
+
+ if (testAccept())
+ {
+ createDirs(dirOf(file));
+ writeFile2(file, got);
+ GTEST_SKIP()
+ << "Updating golden master "
+ << file;
+ }
+ else
+ {
+ decltype(got) expected = readFile2(file);
+ ASSERT_EQ(got, expected);
+ }
+ }
+
+ /**
+ * Specialize to `std::string`
+ */
+ void writeTest(PathView testStem, auto && test)
+ {
+ writeTest(
+ testStem, test,
+ [](const Path & f) -> std::string {
+ return readFile(f);
+ },
+ [](const Path & f, const std::string & c) {
+ return writeFile(f, c);
+ });
+ }
+};
+
+constexpr std::string_view cannotReadGoldenMaster =
+ "Cannot read golden master because another test is also updating it";
+
+constexpr std::string_view updatingGoldenMaster =
+ "Updating golden master";
+
+}