From 1b8662b85cb70e02c2a1650e290ec3007b6c6d30 Mon Sep 17 00:00:00 2001 From: Jade Lovelace Date: Sun, 10 Mar 2024 00:32:43 -0800 Subject: [PATCH] import the revisions to the characterization test framework from cppnix This has some Flaws for sure (like, it is going to be a bit stretched to use for repl characterization), but it is a start. Change-Id: I258c8beb3aee236f45818a03be83bcda858120c9 --- tests/unit/libstore/characterization.hh | 28 ----- tests/unit/libstore/common-protocol.cc | 2 +- tests/unit/libstore/derivation.cc | 2 +- tests/unit/libstore/protocol.hh | 2 +- tests/unit/libstore/serve-protocol.cc | 2 +- tests/unit/libstore/worker-protocol.cc | 2 +- .../libutil-support/tests/characterization.hh | 116 ++++++++++++++++++ 7 files changed, 121 insertions(+), 33 deletions(-) delete mode 100644 tests/unit/libstore/characterization.hh create mode 100644 tests/unit/libutil-support/tests/characterization.hh 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 #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 + +#include + +#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"; + +}