203 lines
5.4 KiB
Nix
203 lines
5.4 KiB
Nix
# NOTE: We must use `pkgs.runCommand` instead of `testers.runCommand` for negative tests -- those wrapped with
|
|
# `testers.testBuildFailure`. This is due to the fact that `testers.testBuildFailure` modifies the derivation such that
|
|
# it produces an output containing the exit code, logs, and other things. Since `testers.runCommand` expects the empty
|
|
# derivation, it produces a hash mismatch.
|
|
{ lib, testers }:
|
|
let
|
|
inherit (lib.attrsets) recurseIntoAttrs;
|
|
inherit (testers) testBuildFailure' testEqualArrayOrMap;
|
|
concatValuesArrayToActualArray = ''
|
|
nixLog "appending all values in valuesArray to actualArray"
|
|
for value in "''${valuesArray[@]}"; do
|
|
actualArray+=( "$value" )
|
|
done
|
|
'';
|
|
concatValuesMapToActualMap = ''
|
|
nixLog "adding all values in valuesMap to actualMap"
|
|
for key in "''${!valuesMap[@]}"; do
|
|
actualMap["$key"]="''${valuesMap["$key"]}"
|
|
done
|
|
'';
|
|
in
|
|
recurseIntoAttrs {
|
|
# NOTE: This particular test is used in the docs:
|
|
# See https://nixos.org/manual/nixpkgs/unstable/#tester-testEqualArrayOrMap
|
|
# or doc/build-helpers/testers.chapter.md
|
|
docs-test-function-add-cowbell = testEqualArrayOrMap {
|
|
name = "test-function-add-cowbell";
|
|
valuesArray = [
|
|
"cowbell"
|
|
"cowbell"
|
|
];
|
|
expectedArray = [
|
|
"cowbell"
|
|
"cowbell"
|
|
"cowbell"
|
|
];
|
|
script = ''
|
|
addCowbell() {
|
|
local -rn arrayNameRef="$1"
|
|
arrayNameRef+=( "cowbell" )
|
|
}
|
|
|
|
nixLog "appending all values in valuesArray to actualArray"
|
|
for value in "''${valuesArray[@]}"; do
|
|
actualArray+=( "$value" )
|
|
done
|
|
|
|
nixLog "applying addCowbell"
|
|
addCowbell actualArray
|
|
'';
|
|
};
|
|
array-append = testEqualArrayOrMap {
|
|
name = "testEqualArrayOrMap-array-append";
|
|
valuesArray = [
|
|
"apple"
|
|
"bee"
|
|
"cat"
|
|
];
|
|
expectedArray = [
|
|
"apple"
|
|
"bee"
|
|
"cat"
|
|
"dog"
|
|
];
|
|
script = ''
|
|
${concatValuesArrayToActualArray}
|
|
actualArray+=( "dog" )
|
|
'';
|
|
};
|
|
array-prepend = testEqualArrayOrMap {
|
|
name = "testEqualArrayOrMap-array-prepend";
|
|
valuesArray = [
|
|
"apple"
|
|
"bee"
|
|
"cat"
|
|
];
|
|
expectedArray = [
|
|
"dog"
|
|
"apple"
|
|
"bee"
|
|
"cat"
|
|
];
|
|
script = ''
|
|
actualArray+=( "dog" )
|
|
${concatValuesArrayToActualArray}
|
|
'';
|
|
};
|
|
array-empty = testEqualArrayOrMap {
|
|
name = "testEqualArrayOrMap-array-empty";
|
|
valuesArray = [
|
|
"apple"
|
|
"bee"
|
|
"cat"
|
|
];
|
|
expectedArray = [ ];
|
|
script = ''
|
|
# doing nothing
|
|
'';
|
|
};
|
|
array-missing-value = testBuildFailure' {
|
|
drv = testEqualArrayOrMap {
|
|
name = "testEqualArrayOrMap-array-missing-value";
|
|
valuesArray = [ "apple" ];
|
|
expectedArray = [ ];
|
|
script = concatValuesArrayToActualArray;
|
|
};
|
|
expectedBuilderLogEntries = [
|
|
"ERROR: assertEqualArray: arrays differ in length: expectedArray has length 0 but actualArray has length 1"
|
|
"ERROR: assertEqualArray: arrays differ at index 0: expectedArray has no such index but actualArray has value 'apple'"
|
|
];
|
|
};
|
|
map-insert = testEqualArrayOrMap {
|
|
name = "testEqualArrayOrMap-map-insert";
|
|
valuesMap = {
|
|
apple = "0";
|
|
bee = "1";
|
|
cat = "2";
|
|
};
|
|
expectedMap = {
|
|
apple = "0";
|
|
bee = "1";
|
|
cat = "2";
|
|
dog = "3";
|
|
};
|
|
script = ''
|
|
${concatValuesMapToActualMap}
|
|
actualMap["dog"]="3"
|
|
'';
|
|
};
|
|
map-remove = testEqualArrayOrMap {
|
|
name = "testEqualArrayOrMap-map-remove";
|
|
valuesMap = {
|
|
apple = "0";
|
|
bee = "1";
|
|
cat = "2";
|
|
dog = "3";
|
|
};
|
|
expectedMap = {
|
|
apple = "0";
|
|
cat = "2";
|
|
dog = "3";
|
|
};
|
|
script = ''
|
|
${concatValuesMapToActualMap}
|
|
unset 'actualMap[bee]'
|
|
'';
|
|
};
|
|
map-missing-key = testBuildFailure' {
|
|
drv = testEqualArrayOrMap {
|
|
name = "testEqualArrayOrMap-map-missing-key";
|
|
valuesMap = {
|
|
bee = "1";
|
|
cat = "2";
|
|
dog = "3";
|
|
};
|
|
expectedMap = {
|
|
apple = "0";
|
|
bee = "1";
|
|
cat = "2";
|
|
dog = "3";
|
|
};
|
|
script = concatValuesMapToActualMap;
|
|
};
|
|
expectedBuilderLogEntries = [
|
|
"ERROR: assertEqualMap: maps differ in length: expectedMap has length 4 but actualMap has length 3"
|
|
"ERROR: assertEqualMap: maps differ at key 'apple': expectedMap has value '0' but actualMap has no such key"
|
|
];
|
|
};
|
|
map-missing-key-with-empty = testBuildFailure' {
|
|
drv = testEqualArrayOrMap {
|
|
name = "testEqualArrayOrMap-map-missing-key-with-empty";
|
|
valuesArray = [ ];
|
|
expectedMap.apple = 1;
|
|
script = "";
|
|
};
|
|
expectedBuilderLogEntries = [
|
|
"ERROR: assertEqualMap: maps differ in length: expectedMap has length 1 but actualMap has length 0"
|
|
"ERROR: assertEqualMap: maps differ at key 'apple': expectedMap has value '1' but actualMap has no such key"
|
|
];
|
|
};
|
|
map-extra-key = testBuildFailure' {
|
|
drv = testEqualArrayOrMap {
|
|
name = "testEqualArrayOrMap-map-extra-key";
|
|
valuesMap = {
|
|
apple = "0";
|
|
bee = "1";
|
|
cat = "2";
|
|
dog = "3";
|
|
};
|
|
expectedMap = {
|
|
apple = "0";
|
|
bee = "1";
|
|
dog = "3";
|
|
};
|
|
script = concatValuesMapToActualMap;
|
|
};
|
|
expectedBuilderLogEntries = [
|
|
"ERROR: assertEqualMap: maps differ in length: expectedMap has length 3 but actualMap has length 4"
|
|
"ERROR: assertEqualMap: maps differ at key 'cat': expectedMap has no such key but actualMap has value '2'"
|
|
];
|
|
};
|
|
}
|