blob: 928cc1d9461f06666e45f9eba92806cfaa07fa08 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
{ lib
, stdenvNoCC
, testers
, callPackage
, writeText
# nativeBuildInputs
, shellcheck-minimal
# Samples
, samples ? cleanSamples (callPackage ./samples.nix { })
# Filter out the non-string-like attributes such as <pkg>.override added by
# callPackage.
, cleanSamples ? lib.filterAttrs (n: lib.isStringLike)
# Test targets
, writeDirectReferencesToFile
, writeClosure
}:
# -------------------------------------------------------------------------- #
#
# trivial-builders test
#
# -------------------------------------------------------------------------- #
#
# Execute this build script directly (quick):
#
# * Classic
# $ NIX_PATH="nixpkgs=$PWD" nix-shell -p tests.trivial-builders.references.testScriptBin --run references-test
#
# * Flake-based
# $ nix run .#tests.trivial-builders.references.testScriptBin
#
# or in the build sandbox with a ~20s VM overhead:
#
# * Classic
# $ nix-build --no-out-link -A tests.trivial-builders.references
#
# * Flake-based
# $ nix build -L --no-link .#tests.trivial-builders.references
#
# -------------------------------------------------------------------------- #
let
# Map each attribute to an element specification of Bash associative arrary
# and concatenate them with white spaces, to be used to define a
# one-line Bash associative array.
samplesToString = attrs:
lib.concatMapStringsSep " " (name: "[${name}]=${lib.escapeShellArg "${attrs.${name}}"}") (builtins.attrNames attrs);
closures = lib.mapAttrs (n: v: writeClosure [ v ]) samples;
directReferences = lib.mapAttrs (n: v: writeDirectReferencesToFile v) samples;
collectiveClosure = writeClosure (lib.attrValues samples);
testScriptBin = stdenvNoCC.mkDerivation (finalAttrs: {
name = "references-test";
src = ./references-test.sh;
dontUnpack = true;
dontBuild = true;
installPhase = ''
runHook preInstall
mkdir -p "$out/bin"
substitute "$src" "$out/bin/${finalAttrs.meta.mainProgram}" \
--replace "@SAMPLES@" ${lib.escapeShellArg (samplesToString samples)} \
--replace "@CLOSURES@" ${lib.escapeShellArg (samplesToString closures)} \
--replace "@DIRECT_REFS@" ${lib.escapeShellArg (samplesToString directReferences)} \
--replace "@COLLECTIVE_CLOSURE@" ${lib.escapeShellArg collectiveClosure}
runHook postInstall
chmod +x "$out/bin/${finalAttrs.meta.mainProgram}"
'';
doInstallCheck = true;
nativeInstallCheckInputs = [
shellcheck-minimal
];
installCheckPhase = ''
runHook preInstallCheck
shellcheck "$out/bin/${finalAttrs.meta.mainProgram}"
runHook postInstallCheck
'';
passthru = {
inherit
collectiveClosure
directReferences
closures
samples
;
};
meta = with lib; {
mainProgram = "references-test";
};
});
in
testers.nixosTest {
name = "nixpkgs-trivial-builders";
nodes.machine = { ... }: {
virtualisation.writableStore = true;
# Test runs without network, so we don't substitute and prepare our deps
nix.settings.substituters = lib.mkForce [ ];
environment.etc."pre-built-paths".source = writeText "pre-built-paths" (
builtins.toJSON [ testScriptBin ]
);
};
testScript =
''
machine.succeed("""
${lib.getExe testScriptBin} 2>/dev/console
""")
'';
passthru = {
inherit
collectiveClosure
directReferences
closures
samples
testScriptBin
;
};
meta = {
maintainers = with lib.maintainers; [
roberth
ShamrockLee
];
};
}
|