-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Unit test for derivation "advanced attrs"
This tests the parser and JSON format using the DRV files from the tests added in the previous commit. Co-Authored-By: John Ericson <[email protected]>
- Loading branch information
1 parent
9f9984e
commit 7fb1420
Showing
11 changed files
with
347 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
1 change: 1 addition & 0 deletions
1
tests/unit/libstore/data/derivation/advanced-attributes-defaults.drv
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
../../../../functional/derivation/advanced-attributes-defaults.drv |
22 changes: 22 additions & 0 deletions
22
tests/unit/libstore/data/derivation/advanced-attributes-defaults.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
{ | ||
"args": [ | ||
"-c", | ||
"echo hello > $out" | ||
], | ||
"builder": "/bin/bash", | ||
"env": { | ||
"builder": "/bin/bash", | ||
"name": "advanced-attributes-defaults", | ||
"out": "/nix/store/1qsc7svv43m4dw2prh6mvyf7cai5czji-advanced-attributes-defaults", | ||
"system": "my-system" | ||
}, | ||
"inputDrvs": {}, | ||
"inputSrcs": [], | ||
"name": "advanced-attributes-defaults", | ||
"outputs": { | ||
"out": { | ||
"path": "/nix/store/1qsc7svv43m4dw2prh6mvyf7cai5czji-advanced-attributes-defaults" | ||
} | ||
}, | ||
"system": "my-system" | ||
} |
1 change: 1 addition & 0 deletions
1
tests/unit/libstore/data/derivation/advanced-attributes-structured-attrs-defaults.drv
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
../../../../functional/derivation/advanced-attributes-structured-attrs-defaults.drv |
24 changes: 24 additions & 0 deletions
24
tests/unit/libstore/data/derivation/advanced-attributes-structured-attrs-defaults.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
{ | ||
"args": [ | ||
"-c", | ||
"echo hello > $out" | ||
], | ||
"builder": "/bin/bash", | ||
"env": { | ||
"__json": "{\"builder\":\"/bin/bash\",\"name\":\"advanced-attributes-structured-attrs-defaults\",\"outputs\":[\"out\",\"dev\"],\"system\":\"my-system\"}", | ||
"dev": "/nix/store/8bazivnbipbyi569623skw5zm91z6kc2-advanced-attributes-structured-attrs-defaults-dev", | ||
"out": "/nix/store/f8f8nvnx32bxvyxyx2ff7akbvwhwd9dw-advanced-attributes-structured-attrs-defaults" | ||
}, | ||
"inputDrvs": {}, | ||
"inputSrcs": [], | ||
"name": "advanced-attributes-structured-attrs-defaults", | ||
"outputs": { | ||
"dev": { | ||
"path": "/nix/store/8bazivnbipbyi569623skw5zm91z6kc2-advanced-attributes-structured-attrs-defaults-dev" | ||
}, | ||
"out": { | ||
"path": "/nix/store/f8f8nvnx32bxvyxyx2ff7akbvwhwd9dw-advanced-attributes-structured-attrs-defaults" | ||
} | ||
}, | ||
"system": "my-system" | ||
} |
1 change: 1 addition & 0 deletions
1
tests/unit/libstore/data/derivation/advanced-attributes-structured-attrs.drv
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
../../../../functional/derivation/advanced-attributes-structured-attrs.drv |
41 changes: 41 additions & 0 deletions
41
tests/unit/libstore/data/derivation/advanced-attributes-structured-attrs.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
{ | ||
"args": [ | ||
"-c", | ||
"echo hello > $out" | ||
], | ||
"builder": "/bin/bash", | ||
"env": { | ||
"__json": "{\"__darwinAllowLocalNetworking\":true,\"__impureHostDeps\":[\"/usr/bin/ditto\"],\"__noChroot\":true,\"__sandboxProfile\":\"sandcastle\",\"allowSubstitutes\":false,\"builder\":\"/bin/bash\",\"impureEnvVars\":[\"UNICORN\"],\"name\":\"advanced-attributes-structured-attrs\",\"outputChecks\":{\"bin\":{\"disallowedReferences\":[\"/nix/store/7rhsm8i393hm1wcsmph782awg1hi2f7x-bar\"],\"disallowedRequisites\":[\"/nix/store/7rhsm8i393hm1wcsmph782awg1hi2f7x-bar\"]},\"dev\":{\"maxClosureSize\":5909,\"maxSize\":789},\"out\":{\"allowedReferences\":[\"/nix/store/3c08bzb71z4wiag719ipjxr277653ynp-foo\"],\"allowedRequisites\":[\"/nix/store/3c08bzb71z4wiag719ipjxr277653ynp-foo\"]}},\"outputs\":[\"out\",\"bin\",\"dev\"],\"preferLocalBuild\":true,\"requiredSystemFeatures\":[\"rainbow\",\"uid-range\"],\"system\":\"my-system\"}", | ||
"bin": "/nix/store/pbzb48v0ycf80jgligcp4n8z0rblna4n-advanced-attributes-structured-attrs-bin", | ||
"dev": "/nix/store/7xapi8jv7flcz1qq8jhw55ar8ag8hldh-advanced-attributes-structured-attrs-dev", | ||
"out": "/nix/store/mpq3l1l1qc2yr50q520g08kprprwv79f-advanced-attributes-structured-attrs" | ||
}, | ||
"inputDrvs": { | ||
"/nix/store/4xm4wccqsvagz9gjksn24s7rip2fdy7v-foo.drv": { | ||
"dynamicOutputs": {}, | ||
"outputs": [ | ||
"out" | ||
] | ||
}, | ||
"/nix/store/plsq5jbr5nhgqwcgb2qxw7jchc09dnl8-bar.drv": { | ||
"dynamicOutputs": {}, | ||
"outputs": [ | ||
"out" | ||
] | ||
} | ||
}, | ||
"inputSrcs": [], | ||
"name": "advanced-attributes-structured-attrs", | ||
"outputs": { | ||
"bin": { | ||
"path": "/nix/store/pbzb48v0ycf80jgligcp4n8z0rblna4n-advanced-attributes-structured-attrs-bin" | ||
}, | ||
"dev": { | ||
"path": "/nix/store/7xapi8jv7flcz1qq8jhw55ar8ag8hldh-advanced-attributes-structured-attrs-dev" | ||
}, | ||
"out": { | ||
"path": "/nix/store/mpq3l1l1qc2yr50q520g08kprprwv79f-advanced-attributes-structured-attrs" | ||
} | ||
}, | ||
"system": "my-system" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
../../../../functional/derivation/advanced-attributes.drv |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,234 @@ | ||
#include <nlohmann/json.hpp> | ||
#include <gtest/gtest.h> | ||
#include <optional> | ||
|
||
#include "experimental-features.hh" | ||
#include "derivations.hh" | ||
|
||
#include "tests/libstore.hh" | ||
#include "tests/characterization.hh" | ||
#include "parsed-derivations.hh" | ||
#include "types.hh" | ||
|
||
namespace nix { | ||
|
||
using nlohmann::json; | ||
|
||
class DerivationAdvancedAttrsTest : public CharacterizationTest, public LibStoreTest | ||
{ | ||
Path unitTestData = getUnitTestData() + "/derivation"; | ||
|
||
public: | ||
Path goldenMaster(std::string_view testStem) const override | ||
{ | ||
return unitTestData + "/" + testStem; | ||
} | ||
}; | ||
|
||
#define TEST_ATERM_JSON(STEM, NAME) \ | ||
TEST_F(DerivationAdvancedAttrsTest, Derivation_##STEM##_from_json) \ | ||
{ \ | ||
readTest(NAME ".json", [&](const auto & encoded_) { \ | ||
auto encoded = json::parse(encoded_); \ | ||
/* Use DRV file instead of C++ literal as source of truth. */ \ | ||
auto aterm = readFile(goldenMaster(NAME ".drv")); \ | ||
auto expected = parseDerivation(*store, std::move(aterm), NAME); \ | ||
Derivation got = Derivation::fromJSON(*store, encoded); \ | ||
EXPECT_EQ(got, expected); \ | ||
}); \ | ||
} \ | ||
\ | ||
TEST_F(DerivationAdvancedAttrsTest, Derivation_##STEM##_to_json) \ | ||
{ \ | ||
writeTest( \ | ||
NAME ".json", \ | ||
[&]() -> json { \ | ||
/* Use DRV file instead of C++ literal as source of truth. */ \ | ||
auto aterm = readFile(goldenMaster(NAME ".drv")); \ | ||
return parseDerivation(*store, std::move(aterm), NAME).toJSON(*store); \ | ||
}, \ | ||
[](const auto & file) { return json::parse(readFile(file)); }, \ | ||
[](const auto & file, const auto & got) { return writeFile(file, got.dump(2) + "\n"); }); \ | ||
} \ | ||
\ | ||
TEST_F(DerivationAdvancedAttrsTest, Derivation_##STEM##_from_aterm) \ | ||
{ \ | ||
readTest(NAME ".drv", [&](auto encoded) { \ | ||
/* Use JSON file instead of C++ literal as source of truth. */ \ | ||
auto json = json::parse(readFile(goldenMaster(NAME ".json"))); \ | ||
auto expected = Derivation::fromJSON(*store, json); \ | ||
auto got = parseDerivation(*store, std::move(encoded), NAME); \ | ||
EXPECT_EQ(got.toJSON(*store), expected.toJSON(*store)); \ | ||
EXPECT_EQ(got, expected); \ | ||
}); \ | ||
} \ | ||
\ | ||
/* No corresponding write test, because we need to read the drv to write the json file */ | ||
|
||
TEST_ATERM_JSON(advancedAttributes_defaults, "advanced-attributes-defaults"); | ||
TEST_ATERM_JSON(advancedAttributes, "advanced-attributes-defaults"); | ||
TEST_ATERM_JSON(advancedAttributes_structuredAttrs_defaults, "advanced-attributes-structured-attrs"); | ||
TEST_ATERM_JSON(advancedAttributes_structuredAttrs, "advanced-attributes-structured-attrs-defaults"); | ||
|
||
#undef TEST_ATERM_JSON | ||
|
||
TEST_F(DerivationAdvancedAttrsTest, Derivation_advancedAttributes_defaults) | ||
{ | ||
readTest("advanced-attributes-defaults.drv", [&](auto encoded) { | ||
auto got = parseDerivation(*store, std::move(encoded), "foo"); | ||
|
||
auto drvPath = writeDerivation(*store, got, NoRepair, true); | ||
|
||
ParsedDerivation parsedDrv(drvPath, got); | ||
|
||
EXPECT_EQ(parsedDrv.getStringAttr("__sandboxProfile").value_or(""), ""); | ||
EXPECT_EQ(parsedDrv.getBoolAttr("__noChroot"), false); | ||
EXPECT_EQ(parsedDrv.getStringsAttr("__impureHostDeps").value_or(Strings()), Strings()); | ||
EXPECT_EQ(parsedDrv.getStringsAttr("impureEnvVars").value_or(Strings()), Strings()); | ||
EXPECT_EQ(parsedDrv.getBoolAttr("__darwinAllowLocalNetworking"), false); | ||
EXPECT_EQ(parsedDrv.getStringsAttr("allowedReferences"), std::nullopt); | ||
EXPECT_EQ(parsedDrv.getStringsAttr("allowedRequisites"), std::nullopt); | ||
EXPECT_EQ(parsedDrv.getStringsAttr("disallowedReferences"), std::nullopt); | ||
EXPECT_EQ(parsedDrv.getStringsAttr("disallowedRequisites"), std::nullopt); | ||
EXPECT_EQ(parsedDrv.getRequiredSystemFeatures(), StringSet()); | ||
EXPECT_EQ(parsedDrv.canBuildLocally(*store), false); | ||
EXPECT_EQ(parsedDrv.willBuildLocally(*store), false); | ||
EXPECT_EQ(parsedDrv.substitutesAllowed(), true); | ||
EXPECT_EQ(parsedDrv.useUidRange(), false); | ||
}); | ||
}; | ||
|
||
TEST_F(DerivationAdvancedAttrsTest, Derivation_advancedAttributes) | ||
{ | ||
readTest("advanced-attributes.drv", [&](auto encoded) { | ||
auto got = parseDerivation(*store, std::move(encoded), "foo"); | ||
|
||
auto drvPath = writeDerivation(*store, got, NoRepair, true); | ||
|
||
ParsedDerivation parsedDrv(drvPath, got); | ||
|
||
StringSet systemFeatures{"rainbow", "uid-range"}; | ||
|
||
EXPECT_EQ(parsedDrv.getStringAttr("__sandboxProfile").value_or(""), "sandcastle"); | ||
EXPECT_EQ(parsedDrv.getBoolAttr("__noChroot"), true); | ||
EXPECT_EQ(parsedDrv.getStringsAttr("__impureHostDeps").value_or(Strings()), Strings{"/usr/bin/ditto"}); | ||
EXPECT_EQ(parsedDrv.getStringsAttr("impureEnvVars").value_or(Strings()), Strings{"UNICORN"}); | ||
EXPECT_EQ(parsedDrv.getBoolAttr("__darwinAllowLocalNetworking"), true); | ||
EXPECT_EQ( | ||
parsedDrv.getStringsAttr("allowedReferences"), Strings{"/nix/store/3c08bzb71z4wiag719ipjxr277653ynp-foo"}); | ||
EXPECT_EQ( | ||
parsedDrv.getStringsAttr("allowedRequisites"), Strings{"/nix/store/3c08bzb71z4wiag719ipjxr277653ynp-foo"}); | ||
EXPECT_EQ( | ||
parsedDrv.getStringsAttr("disallowedReferences"), | ||
Strings{"/nix/store/7rhsm8i393hm1wcsmph782awg1hi2f7x-bar"}); | ||
EXPECT_EQ( | ||
parsedDrv.getStringsAttr("disallowedRequisites"), | ||
Strings{"/nix/store/7rhsm8i393hm1wcsmph782awg1hi2f7x-bar"}); | ||
EXPECT_EQ(parsedDrv.getRequiredSystemFeatures(), systemFeatures); | ||
EXPECT_EQ(parsedDrv.canBuildLocally(*store), false); | ||
EXPECT_EQ(parsedDrv.willBuildLocally(*store), false); | ||
EXPECT_EQ(parsedDrv.substitutesAllowed(), false); | ||
EXPECT_EQ(parsedDrv.useUidRange(), true); | ||
}); | ||
}; | ||
|
||
TEST_F(DerivationAdvancedAttrsTest, Derivation_advancedAttributes_structuredAttrs_defaults) | ||
{ | ||
readTest("advanced-attributes-structured-attrs-defaults.drv", [&](auto encoded) { | ||
auto got = parseDerivation(*store, std::move(encoded), "foo"); | ||
|
||
auto drvPath = writeDerivation(*store, got, NoRepair, true); | ||
|
||
ParsedDerivation parsedDrv(drvPath, got); | ||
|
||
EXPECT_EQ(parsedDrv.getStringAttr("__sandboxProfile").value_or(""), ""); | ||
EXPECT_EQ(parsedDrv.getBoolAttr("__noChroot"), false); | ||
EXPECT_EQ(parsedDrv.getStringsAttr("__impureHostDeps").value_or(Strings()), Strings()); | ||
EXPECT_EQ(parsedDrv.getStringsAttr("impureEnvVars").value_or(Strings()), Strings()); | ||
EXPECT_EQ(parsedDrv.getBoolAttr("__darwinAllowLocalNetworking"), false); | ||
|
||
{ | ||
auto structuredAttrs_ = parsedDrv.getStructuredAttrs(); | ||
ASSERT_TRUE(structuredAttrs_); | ||
auto & structuredAttrs = *structuredAttrs_; | ||
|
||
auto outputChecks_ = get(structuredAttrs, "outputChecks"); | ||
ASSERT_FALSE(outputChecks_); | ||
} | ||
|
||
EXPECT_EQ(parsedDrv.getRequiredSystemFeatures(), StringSet()); | ||
EXPECT_EQ(parsedDrv.canBuildLocally(*store), false); | ||
EXPECT_EQ(parsedDrv.willBuildLocally(*store), false); | ||
EXPECT_EQ(parsedDrv.substitutesAllowed(), true); | ||
EXPECT_EQ(parsedDrv.useUidRange(), false); | ||
}); | ||
}; | ||
|
||
TEST_F(DerivationAdvancedAttrsTest, Derivation_advancedAttributes_structuredAttrs) | ||
{ | ||
readTest("advanced-attributes-structured-attrs.drv", [&](auto encoded) { | ||
auto got = parseDerivation(*store, std::move(encoded), "foo"); | ||
|
||
auto drvPath = writeDerivation(*store, got, NoRepair, true); | ||
|
||
ParsedDerivation parsedDrv(drvPath, got); | ||
|
||
StringSet systemFeatures{"rainbow", "uid-range"}; | ||
|
||
EXPECT_EQ(parsedDrv.getStringAttr("__sandboxProfile").value_or(""), "sandcastle"); | ||
EXPECT_EQ(parsedDrv.getBoolAttr("__noChroot"), true); | ||
EXPECT_EQ(parsedDrv.getStringsAttr("__impureHostDeps").value_or(Strings()), Strings{"/usr/bin/ditto"}); | ||
EXPECT_EQ(parsedDrv.getStringsAttr("impureEnvVars").value_or(Strings()), Strings{"UNICORN"}); | ||
EXPECT_EQ(parsedDrv.getBoolAttr("__darwinAllowLocalNetworking"), true); | ||
|
||
{ | ||
auto structuredAttrs_ = parsedDrv.getStructuredAttrs(); | ||
ASSERT_TRUE(structuredAttrs_); | ||
auto & structuredAttrs = *structuredAttrs_; | ||
|
||
auto outputChecks_ = get(structuredAttrs, "outputChecks"); | ||
ASSERT_TRUE(outputChecks_); | ||
auto & outputChecks = *outputChecks_; | ||
|
||
{ | ||
auto output_ = get(outputChecks, "out"); | ||
ASSERT_TRUE(output_); | ||
auto & output = *output_; | ||
EXPECT_EQ( | ||
get(output, "allowedReferences")->get<Strings>(), | ||
Strings{"/nix/store/3c08bzb71z4wiag719ipjxr277653ynp-foo"}); | ||
EXPECT_EQ( | ||
get(output, "allowedRequisites")->get<Strings>(), | ||
Strings{"/nix/store/3c08bzb71z4wiag719ipjxr277653ynp-foo"}); | ||
} | ||
|
||
{ | ||
auto output_ = get(outputChecks, "bin"); | ||
ASSERT_TRUE(output_); | ||
auto & output = *output_; | ||
EXPECT_EQ( | ||
get(output, "disallowedReferences")->get<Strings>(), | ||
Strings{"/nix/store/7rhsm8i393hm1wcsmph782awg1hi2f7x-bar"}); | ||
EXPECT_EQ( | ||
get(output, "disallowedRequisites")->get<Strings>(), | ||
Strings{"/nix/store/7rhsm8i393hm1wcsmph782awg1hi2f7x-bar"}); | ||
} | ||
|
||
{ | ||
auto output_ = get(outputChecks, "dev"); | ||
ASSERT_TRUE(output_); | ||
auto & output = *output_; | ||
EXPECT_EQ(get(output, "maxSize")->get<uint64_t>(), 789); | ||
EXPECT_EQ(get(output, "maxClosureSize")->get<uint64_t>(), 5909); | ||
} | ||
} | ||
|
||
EXPECT_EQ(parsedDrv.getRequiredSystemFeatures(), systemFeatures); | ||
EXPECT_EQ(parsedDrv.canBuildLocally(*store), false); | ||
EXPECT_EQ(parsedDrv.willBuildLocally(*store), false); | ||
EXPECT_EQ(parsedDrv.substitutesAllowed(), false); | ||
EXPECT_EQ(parsedDrv.useUidRange(), true); | ||
}); | ||
}; | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,6 +5,7 @@ | |
|
||
#include "types.hh" | ||
#include "environment-variables.hh" | ||
#include "file-system.hh" | ||
|
||
namespace nix { | ||
|
||
|