aboutsummaryrefslogtreecommitdiff
path: root/tests/unit/libstore/worker-protocol.cc
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-03-04 03:46:48 +0100
committereldritch horrors <pennae@lix.systems>2024-03-04 04:36:14 +0100
commitf17e7b185597715049fa7a12e6a0512ef66801b6 (patch)
treec7a59f65cbfd674ae93ba0a350fdeb9aec145bee /tests/unit/libstore/worker-protocol.cc
parent79dd9efe384cd70e04fe3fd3ee03c0b8d5ee8182 (diff)
Merge pull request #8923 from obsidiansystems/test-proto
Unit test some worker protocol serializers (cherry picked from commit c6faef61a6f31c71146aee5d88168e861df9a22a) Change-Id: I99e36f5f17eb7642211a4e42a16b143424f164b4
Diffstat (limited to 'tests/unit/libstore/worker-protocol.cc')
-rw-r--r--tests/unit/libstore/worker-protocol.cc139
1 files changed, 139 insertions, 0 deletions
diff --git a/tests/unit/libstore/worker-protocol.cc b/tests/unit/libstore/worker-protocol.cc
new file mode 100644
index 000000000..4a6ccf7c0
--- /dev/null
+++ b/tests/unit/libstore/worker-protocol.cc
@@ -0,0 +1,139 @@
+#include <regex>
+
+#include <nlohmann/json.hpp>
+#include <gtest/gtest.h>
+
+#include "worker-protocol.hh"
+#include "worker-protocol-impl.hh"
+#include "derived-path.hh"
+#include "tests/libstore.hh"
+
+namespace nix {
+
+class WorkerProtoTest : public LibStoreTest
+{
+public:
+ Path unitTestData = getEnv("_NIX_TEST_UNIT_DATA").value() + "/libstore/worker-protocol";
+
+ bool testAccept() {
+ return getEnv("_NIX_TEST_ACCEPT") == "1";
+ }
+
+ Path goldenMaster(std::string_view testStem) {
+ return unitTestData + "/" + testStem + ".bin";
+ }
+
+ /**
+ * Golden test for `T` reading
+ */
+ template<typename T>
+ void readTest(PathView testStem, T value)
+ {
+ if (testAccept())
+ {
+ GTEST_SKIP() << "Cannot read golden master because another test is also updating it";
+ }
+ else
+ {
+ auto expected = readFile(goldenMaster(testStem));
+
+ T got = ({
+ StringSource from { expected };
+ WorkerProto::Serialise<T>::read(
+ *store,
+ WorkerProto::ReadConn { .from = from });
+ });
+
+ ASSERT_EQ(got, value);
+ }
+ }
+
+ /**
+ * Golden test for `T` write
+ */
+ template<typename T>
+ void writeTest(PathView testStem, const T & value)
+ {
+ auto file = goldenMaster(testStem);
+
+ StringSink to;
+ WorkerProto::write(
+ *store,
+ WorkerProto::WriteConn { .to = to },
+ value);
+
+ if (testAccept())
+ {
+ createDirs(dirOf(file));
+ writeFile(file, to.s);
+ GTEST_SKIP() << "Updating golden master";
+ }
+ else
+ {
+ auto expected = readFile(file);
+ ASSERT_EQ(to.s, expected);
+ }
+ }
+};
+
+#define CHARACTERIZATION_TEST(NAME, STEM, VALUE) \
+ TEST_F(WorkerProtoTest, NAME ## _read) { \
+ readTest(STEM, VALUE); \
+ } \
+ TEST_F(WorkerProtoTest, NAME ## _write) { \
+ writeTest(STEM, VALUE); \
+ }
+
+CHARACTERIZATION_TEST(
+ string,
+ "string",
+ (std::tuple<std::string, std::string, std::string, std::string, std::string> {
+ "",
+ "hi",
+ "white rabbit",
+ "大白兔",
+ "oh no \0\0\0 what was that!",
+ }))
+
+CHARACTERIZATION_TEST(
+ storePath,
+ "store-path",
+ (std::tuple<StorePath, StorePath> {
+ StorePath { "g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-foo" },
+ StorePath { "g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-foo-bar" },
+ }))
+
+CHARACTERIZATION_TEST(
+ contentAddress,
+ "content-address",
+ (std::tuple<ContentAddress, ContentAddress, ContentAddress> {
+ ContentAddress {
+ .method = TextIngestionMethod {},
+ .hash = hashString(HashType::htSHA256, "Derive(...)"),
+ },
+ ContentAddress {
+ .method = FileIngestionMethod::Flat,
+ .hash = hashString(HashType::htSHA1, "blob blob..."),
+ },
+ ContentAddress {
+ .method = FileIngestionMethod::Recursive,
+ .hash = hashString(HashType::htSHA256, "(...)"),
+ },
+ }))
+
+CHARACTERIZATION_TEST(
+ derivedPath,
+ "derived-path",
+ (std::tuple<DerivedPath, DerivedPath> {
+ DerivedPath::Opaque {
+ .path = StorePath { "g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-foo" },
+ },
+ DerivedPath::Built {
+ .drvPath = makeConstantStorePathRef(StorePath {
+ "g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-bar.drv",
+ }),
+ .outputs = OutputsSpec::Names { "x", "y" },
+ },
+ }))
+
+}