biome: 1.9.2 -> 1.9.3
[NixPkgs.git] / pkgs / build-support / trivial-builders / test / writeShellApplication.nix
blobc50f5a4d283f9eccd31b4ba0c1b06a7dec155bfd
1 # Run with:
2 # nix-build -A tests.trivial-builders.writeShellApplication
3 { writeShellApplication
4 , writeTextFile
5 , runCommand
6 , lib
7 , linkFarm
8 , diffutils
9 , hello
11 let
12   checkShellApplication = args@{name, expected, ...}:
13     let
14       writeShellApplicationArgs = builtins.removeAttrs args ["expected"];
15       script = writeShellApplication writeShellApplicationArgs;
16       executable = lib.getExe script;
17       expected' = writeTextFile {
18         name = "${name}-expected";
19         text = expected;
20       };
21       actual = "${name}-actual";
22     in
23     runCommand name { } ''
24       echo "Running test executable ${name}"
25       ${executable} > ${actual}
26       echo "Got output from test executable:"
27       cat ${actual}
28       echo "Checking test output against expected output:"
29       ${diffutils}/bin/diff --color --unified ${expected'} ${actual}
30       touch $out
31     '';
33 linkFarm "writeShellApplication-tests" {
34   test-meta =
35     let
36       script = writeShellApplication {
37         name = "test-meta";
38         text = "";
39         meta.description = "A test for the `writeShellApplication` `meta` argument.";
40       };
41     in
42     assert script.meta.mainProgram == "test-meta";
43     assert script.meta.description == "A test for the `writeShellApplication` `meta` argument.";
44     script;
46   test-runtime-inputs =
47     checkShellApplication {
48       name = "test-runtime-inputs";
49       text = ''
50         hello
51       '';
52       runtimeInputs = [ hello ];
53       expected = "Hello, world!\n";
54     };
56   test-runtime-env =
57     checkShellApplication {
58       name = "test-runtime-env";
59       runtimeEnv = {
60         MY_COOL_ENV_VAR = "my-cool-env-value";
61         MY_OTHER_COOL_ENV_VAR = "my-other-cool-env-value";
62         # Check that we can serialize a bunch of different types:
63         BOOL = true;
64         INT = 1;
65         LIST = [1 2 3];
66         MAP = {
67           a = "a";
68           b = "b";
69         };
70       };
71       text = ''
72         echo "$MY_COOL_ENV_VAR"
73         echo "$MY_OTHER_COOL_ENV_VAR"
74       '';
75       expected = ''
76         my-cool-env-value
77         my-other-cool-env-value
78       '';
79     };
81   test-check-phase =
82     checkShellApplication {
83       name = "test-check-phase";
84       text = "";
85       checkPhase = ''
86         echo "echo -n hello" > $target
87       '';
88       expected = "hello";
89     };
91   test-argument-forwarding =
92     checkShellApplication {
93       name = "test-argument-forwarding";
94       text = "";
95       derivationArgs.MY_BUILD_TIME_VARIABLE = "puppy";
96       derivationArgs.postCheck = ''
97         if [[ "$MY_BUILD_TIME_VARIABLE" != puppy ]]; then
98           echo "\$MY_BUILD_TIME_VARIABLE is not set to 'puppy'!"
99           exit 1
100         fi
101       '';
102       meta.description = "A test checking that `writeShellApplication` forwards extra arguments to `stdenv.mkDerivation`.";
103       expected = "";
104     };
106   test-exclude-shell-checks = writeShellApplication {
107     name = "test-exclude-shell-checks";
108     excludeShellChecks = [ "SC2016" ];
109     text = ''
110       # Triggers SC2016: Expressions don't expand in single quotes, use double
111       # quotes for that.
112       echo '$SHELL'
113     '';
114   };
116   test-bash-options-pipefail = checkShellApplication {
117     name = "test-bash-options-pipefail";
118     text = ''
119       touch my-test-file
120       echo puppy | grep doggy | sed 's/doggy/puppy/g'
121       #            ^^^^^^^^^^ This will fail.
122       true
123     '';
124     # Don't use `pipefail`:
125     bashOptions = ["errexit" "nounset"];
126     expected = "";
127   };
129   test-bash-options-nounset = checkShellApplication {
130     name = "test-bash-options-nounset";
131     text = ''
132       echo -n "$someUndefinedVariable"
133     '';
134     # Don't use `nounset`:
135     bashOptions = [];
136     # Don't warn about the undefined variable at build time:
137     excludeShellChecks = [ "SC2154" ];
138     expected = "";
139   };