aboutsummaryrefslogtreecommitdiff
path: root/tests/unit/libstore
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unit/libstore')
-rw-r--r--tests/unit/libstore/characterization.hh5
-rw-r--r--tests/unit/libstore/common-protocol.cc8
-rw-r--r--tests/unit/libstore/derivation.cc273
-rw-r--r--tests/unit/libstore/protocol.hh4
4 files changed, 135 insertions, 155 deletions
diff --git a/tests/unit/libstore/characterization.hh b/tests/unit/libstore/characterization.hh
index 5f366cb42..46bf4b2e5 100644
--- a/tests/unit/libstore/characterization.hh
+++ b/tests/unit/libstore/characterization.hh
@@ -20,4 +20,9 @@ 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 083970e41..4c9ffb1ce 100644
--- a/tests/unit/libstore/common-protocol.cc
+++ b/tests/unit/libstore/common-protocol.cc
@@ -24,14 +24,14 @@ public:
{
if (testAccept())
{
- GTEST_SKIP() << "Cannot read golden master because another test is also updating it";
+ GTEST_SKIP() << cannotReadGoldenMaster;
}
else
{
- auto expected = readFile(goldenMaster(testStem));
+ auto encoded = readFile(goldenMaster(testStem));
T got = ({
- StringSource from { expected };
+ StringSource from { encoded };
CommonProto::Serialise<T>::read(
*store,
CommonProto::ReadConn { .from = from });
@@ -59,7 +59,7 @@ public:
{
createDirs(dirOf(file));
writeFile(file, to.s);
- GTEST_SKIP() << "Updating golden master";
+ GTEST_SKIP() << updatingGoldenMaster;
}
else
{
diff --git a/tests/unit/libstore/derivation.cc b/tests/unit/libstore/derivation.cc
index c360c9707..2c4857c77 100644
--- a/tests/unit/libstore/derivation.cc
+++ b/tests/unit/libstore/derivation.cc
@@ -5,9 +5,12 @@
#include "derivations.hh"
#include "tests/libstore.hh"
+#include "characterization.hh"
namespace nix {
+using nlohmann::json;
+
class DerivationTest : public LibStoreTest
{
public:
@@ -16,6 +19,12 @@ public:
* to worry about race conditions if the tests run concurrently.
*/
ExperimentalFeatureSettings mockXpSettings;
+
+ Path unitTestData = getUnitTestData() + "/libstore/derivation";
+
+ Path goldenMaster(std::string_view testStem) {
+ return unitTestData + "/" + testStem;
+ }
};
class CaDerivationTest : public DerivationTest
@@ -46,7 +55,7 @@ TEST_F(DerivationTest, BadATerm_version) {
ASSERT_THROW(
parseDerivation(
*store,
- R"(DrvWithVersion("invalid-version",[],[("/nix/store/c015dhfh5l0lp6wxyvdn7bmwhbbr6hr9-dep2.drv",["cat","dog"])],["/nix/store/c015dhfh5l0lp6wxyvdn7bmwhbbr6hr9-dep1"],"wasm-sel4","foo",["bar","baz"],[("BIG_BAD","WOLF")]))",
+ readFile(goldenMaster("bad-version.drv")),
"whatever",
mockXpSettings),
FormatError);
@@ -56,50 +65,61 @@ TEST_F(DynDerivationTest, BadATerm_oldVersionDynDeps) {
ASSERT_THROW(
parseDerivation(
*store,
- R"(Derive([],[("/nix/store/c015dhfh5l0lp6wxyvdn7bmwhbbr6hr9-dep2.drv",(["cat","dog"],[("cat",["kitten"]),("goose",["gosling"])]))],["/nix/store/c015dhfh5l0lp6wxyvdn7bmwhbbr6hr9-dep1"],"wasm-sel4","foo",["bar","baz"],[("BIG_BAD","WOLF")]))",
+ readFile(goldenMaster("bad-old-version-dyn-deps.drv")),
"dyn-dep-derivation",
mockXpSettings),
FormatError);
}
-#define TEST_JSON(FIXTURE, NAME, STR, VAL, DRV_NAME, OUTPUT_NAME) \
- TEST_F(FIXTURE, DerivationOutput_ ## NAME ## _to_json) { \
- using nlohmann::literals::operator "" _json; \
- ASSERT_EQ( \
- STR ## _json, \
- (DerivationOutput { VAL }).toJSON( \
- *store, \
- DRV_NAME, \
- OUTPUT_NAME)); \
- } \
- \
- TEST_F(FIXTURE, DerivationOutput_ ## NAME ## _from_json) { \
- using nlohmann::literals::operator "" _json; \
- ASSERT_EQ( \
- DerivationOutput { VAL }, \
- DerivationOutput::fromJSON( \
- *store, \
- DRV_NAME, \
- OUTPUT_NAME, \
- STR ## _json, \
- mockXpSettings)); \
+#define TEST_JSON(FIXTURE, NAME, VAL, DRV_NAME, OUTPUT_NAME) \
+ TEST_F(FIXTURE, DerivationOutput_ ## NAME ## _from_json) { \
+ if (testAccept()) \
+ { \
+ GTEST_SKIP() << cannotReadGoldenMaster; \
+ } \
+ else \
+ { \
+ auto encoded = json::parse( \
+ readFile(goldenMaster("output-" #NAME ".json"))); \
+ DerivationOutput got = DerivationOutput::fromJSON( \
+ *store, \
+ DRV_NAME, \
+ OUTPUT_NAME, \
+ encoded, \
+ mockXpSettings); \
+ DerivationOutput expected { VAL }; \
+ ASSERT_EQ(got, expected); \
+ } \
+ } \
+ \
+ TEST_F(FIXTURE, DerivationOutput_ ## NAME ## _to_json) { \
+ auto file = goldenMaster("output-" #NAME ".json"); \
+ \
+ json got = DerivationOutput { VAL }.toJSON( \
+ *store, \
+ DRV_NAME, \
+ OUTPUT_NAME); \
+ \
+ if (testAccept()) \
+ { \
+ createDirs(dirOf(file)); \
+ writeFile(file, got.dump(2) + "\n"); \
+ GTEST_SKIP() << updatingGoldenMaster; \
+ } \
+ else \
+ { \
+ auto expected = json::parse(readFile(file)); \
+ ASSERT_EQ(got, expected); \
+ } \
}
TEST_JSON(DerivationTest, inputAddressed,
- R"({
- "path": "/nix/store/c015dhfh5l0lp6wxyvdn7bmwhbbr6hr9-drv-name-output-name"
- })",
(DerivationOutput::InputAddressed {
.path = store->parseStorePath("/nix/store/c015dhfh5l0lp6wxyvdn7bmwhbbr6hr9-drv-name-output-name"),
}),
"drv-name", "output-name")
TEST_JSON(DerivationTest, caFixedFlat,
- R"({
- "hashAlgo": "sha256",
- "hash": "894517c9163c896ec31a2adbd33c0681fd5f45b2c0ef08a64c92a03fb97f390f",
- "path": "/nix/store/rhcg9h16sqvlbpsa6dqm57sbr2al6nzg-drv-name-output-name"
- })",
(DerivationOutput::CAFixed {
.ca = {
.method = FileIngestionMethod::Flat,
@@ -109,11 +129,6 @@ TEST_JSON(DerivationTest, caFixedFlat,
"drv-name", "output-name")
TEST_JSON(DerivationTest, caFixedNAR,
- R"({
- "hashAlgo": "r:sha256",
- "hash": "894517c9163c896ec31a2adbd33c0681fd5f45b2c0ef08a64c92a03fb97f390f",
- "path": "/nix/store/c015dhfh5l0lp6wxyvdn7bmwhbbr6hr9-drv-name-output-name"
- })",
(DerivationOutput::CAFixed {
.ca = {
.method = FileIngestionMethod::Recursive,
@@ -123,11 +138,6 @@ TEST_JSON(DerivationTest, caFixedNAR,
"drv-name", "output-name")
TEST_JSON(DynDerivationTest, caFixedText,
- R"({
- "hashAlgo": "text:sha256",
- "hash": "894517c9163c896ec31a2adbd33c0681fd5f45b2c0ef08a64c92a03fb97f390f",
- "path": "/nix/store/6s1zwabh956jvhv4w9xcdb5jiyanyxg1-drv-name-output-name"
- })",
(DerivationOutput::CAFixed {
.ca = {
.hash = Hash::parseAnyPrefixed("sha256-iUUXyRY8iW7DGirb0zwGgf1fRbLA7wimTJKgP7l/OQ8="),
@@ -136,9 +146,6 @@ TEST_JSON(DynDerivationTest, caFixedText,
"drv-name", "output-name")
TEST_JSON(CaDerivationTest, caFloating,
- R"({
- "hashAlgo": "r:sha256"
- })",
(DerivationOutput::CAFloating {
.method = FileIngestionMethod::Recursive,
.hashType = htSHA256,
@@ -146,15 +153,10 @@ TEST_JSON(CaDerivationTest, caFloating,
"drv-name", "output-name")
TEST_JSON(DerivationTest, deferred,
- R"({ })",
DerivationOutput::Deferred { },
"drv-name", "output-name")
TEST_JSON(ImpureDerivationTest, impure,
- R"({
- "hashAlgo": "r:sha256",
- "impure": true
- })",
(DerivationOutput::Impure {
.method = FileIngestionMethod::Recursive,
.hashType = htSHA256,
@@ -163,43 +165,79 @@ TEST_JSON(ImpureDerivationTest, impure,
#undef TEST_JSON
-#define TEST_JSON(FIXTURE, NAME, STR, VAL) \
- TEST_F(FIXTURE, Derivation_ ## NAME ## _to_json) { \
- using nlohmann::literals::operator "" _json; \
- ASSERT_EQ( \
- STR ## _json, \
- (VAL).toJSON(*store)); \
- } \
- \
- TEST_F(FIXTURE, Derivation_ ## NAME ## _from_json) { \
- using nlohmann::literals::operator "" _json; \
- ASSERT_EQ( \
- (VAL), \
- Derivation::fromJSON( \
- *store, \
- STR ## _json, \
- mockXpSettings)); \
+#define TEST_JSON(FIXTURE, NAME, VAL) \
+ TEST_F(FIXTURE, Derivation_ ## NAME ## _from_json) { \
+ if (testAccept()) \
+ { \
+ GTEST_SKIP() << cannotReadGoldenMaster; \
+ } \
+ else \
+ { \
+ auto encoded = json::parse( \
+ readFile(goldenMaster( #NAME ".json"))); \
+ Derivation expected { VAL }; \
+ Derivation got = Derivation::fromJSON( \
+ *store, \
+ encoded, \
+ mockXpSettings); \
+ ASSERT_EQ(got, expected); \
+ } \
+ } \
+ \
+ TEST_F(FIXTURE, Derivation_ ## NAME ## _to_json) { \
+ auto file = goldenMaster( #NAME ".json"); \
+ \
+ json got = Derivation { VAL }.toJSON(*store); \
+ \
+ if (testAccept()) \
+ { \
+ createDirs(dirOf(file)); \
+ writeFile(file, got.dump(2) + "\n"); \
+ GTEST_SKIP() << updatingGoldenMaster; \
+ } \
+ else \
+ { \
+ auto expected = json::parse(readFile(file)); \
+ ASSERT_EQ(got, expected); \
+ } \
}
-#define TEST_ATERM(FIXTURE, NAME, STR, VAL, DRV_NAME) \
- TEST_F(FIXTURE, Derivation_ ## NAME ## _to_aterm) { \
- ASSERT_EQ( \
- STR, \
- (VAL).unparse(*store, false)); \
- } \
- \
- TEST_F(FIXTURE, Derivation_ ## NAME ## _from_aterm) { \
- auto parsed = parseDerivation( \
- *store, \
- STR, \
- DRV_NAME, \
- mockXpSettings); \
- ASSERT_EQ( \
- (VAL).toJSON(*store), \
- parsed.toJSON(*store)); \
- ASSERT_EQ( \
- (VAL), \
- parsed); \
+#define TEST_ATERM(FIXTURE, NAME, VAL, DRV_NAME) \
+ TEST_F(FIXTURE, Derivation_ ## NAME ## _from_aterm) { \
+ if (testAccept()) \
+ { \
+ GTEST_SKIP() << cannotReadGoldenMaster; \
+ } \
+ else \
+ { \
+ auto encoded = readFile(goldenMaster( #NAME ".drv")); \
+ Derivation expected { VAL }; \
+ auto got = parseDerivation( \
+ *store, \
+ std::move(encoded), \
+ DRV_NAME, \
+ mockXpSettings); \
+ ASSERT_EQ(got.toJSON(*store), expected.toJSON(*store)) ; \
+ ASSERT_EQ(got, expected); \
+ } \
+ } \
+ \
+ TEST_F(FIXTURE, Derivation_ ## NAME ## _to_aterm) { \
+ auto file = goldenMaster( #NAME ".drv"); \
+ \
+ auto got = (VAL).unparse(*store, false); \
+ \
+ if (testAccept()) \
+ { \
+ createDirs(dirOf(file)); \
+ writeFile(file, got); \
+ GTEST_SKIP() << updatingGoldenMaster; \
+ } \
+ else \
+ { \
+ auto expected = readFile(file); \
+ ASSERT_EQ(got, expected); \
+ } \
}
Derivation makeSimpleDrv(const Store & store) {
@@ -236,36 +274,9 @@ Derivation makeSimpleDrv(const Store & store) {
return drv;
}
-TEST_JSON(DerivationTest, simple,
- R"({
- "name": "simple-derivation",
- "inputSrcs": [
- "/nix/store/c015dhfh5l0lp6wxyvdn7bmwhbbr6hr9-dep1"
- ],
- "inputDrvs": {
- "/nix/store/c015dhfh5l0lp6wxyvdn7bmwhbbr6hr9-dep2.drv": {
- "dynamicOutputs": {},
- "outputs": [
- "cat",
- "dog"
- ]
- }
- },
- "system": "wasm-sel4",
- "builder": "foo",
- "args": [
- "bar",
- "baz"
- ],
- "env": {
- "BIG_BAD": "WOLF"
- },
- "outputs": {}
- })",
- makeSimpleDrv(*store))
+TEST_JSON(DerivationTest, simple, makeSimpleDrv(*store))
TEST_ATERM(DerivationTest, simple,
- R"(Derive([],[("/nix/store/c015dhfh5l0lp6wxyvdn7bmwhbbr6hr9-dep2.drv",["cat","dog"])],["/nix/store/c015dhfh5l0lp6wxyvdn7bmwhbbr6hr9-dep1"],"wasm-sel4","foo",["bar","baz"],[("BIG_BAD","WOLF")]))",
makeSimpleDrv(*store),
"simple-derivation")
@@ -321,45 +332,9 @@ Derivation makeDynDepDerivation(const Store & store) {
return drv;
}
-TEST_JSON(DynDerivationTest, dynDerivationDeps,
- R"({
- "name": "dyn-dep-derivation",
- "inputSrcs": [
- "/nix/store/c015dhfh5l0lp6wxyvdn7bmwhbbr6hr9-dep1"
- ],
- "inputDrvs": {
- "/nix/store/c015dhfh5l0lp6wxyvdn7bmwhbbr6hr9-dep2.drv": {
- "dynamicOutputs": {
- "cat": {
- "dynamicOutputs": {},
- "outputs": ["kitten"]
- },
- "goose": {
- "dynamicOutputs": {},
- "outputs": ["gosling"]
- }
- },
- "outputs": [
- "cat",
- "dog"
- ]
- }
- },
- "system": "wasm-sel4",
- "builder": "foo",
- "args": [
- "bar",
- "baz"
- ],
- "env": {
- "BIG_BAD": "WOLF"
- },
- "outputs": {}
- })",
- makeDynDepDerivation(*store))
+TEST_JSON(DynDerivationTest, dynDerivationDeps, makeDynDepDerivation(*store))
TEST_ATERM(DynDerivationTest, dynDerivationDeps,
- R"(DrvWithVersion("xp-dyn-drv",[],[("/nix/store/c015dhfh5l0lp6wxyvdn7bmwhbbr6hr9-dep2.drv",(["cat","dog"],[("cat",["kitten"]),("goose",["gosling"])]))],["/nix/store/c015dhfh5l0lp6wxyvdn7bmwhbbr6hr9-dep1"],"wasm-sel4","foo",["bar","baz"],[("BIG_BAD","WOLF")]))",
makeDynDepDerivation(*store),
"dyn-dep-derivation")
diff --git a/tests/unit/libstore/protocol.hh b/tests/unit/libstore/protocol.hh
index 6f0db89ac..52689c51b 100644
--- a/tests/unit/libstore/protocol.hh
+++ b/tests/unit/libstore/protocol.hh
@@ -29,7 +29,7 @@ public:
{
if (testAccept())
{
- GTEST_SKIP() << "Cannot read golden master because another test is also updating it";
+ GTEST_SKIP() << cannotReadGoldenMaster;
}
else
{
@@ -70,7 +70,7 @@ public:
{
createDirs(dirOf(file));
writeFile(file, to.s);
- GTEST_SKIP() << "Updating golden master";
+ GTEST_SKIP() << updatingGoldenMaster;
}
else
{