1{ lib, coreutils, python3, gcc, writeText, writeScript, runCommand, makeBinaryWrapper }:
2
3let
4 env = { buildInputs = [ makeBinaryWrapper ]; };
5 envCheck = runCommand "envcheck" env ''
6 ${gcc}/bin/cc -Wall -Werror -Wpedantic -o $out ${./envcheck.c}
7 '';
8 makeGoldenTest = testname: runCommand "test-wrapper_${testname}" env ''
9 mkdir -p ./tmp/foo
10
11 params=$(<"${./.}/${testname}.cmdline")
12 eval "makeCWrapper /send/me/flags $params" > wrapper.c
13
14 diff wrapper.c "${./.}/${testname}.c"
15
16 if [ -f "${./.}/${testname}.env" ]; then
17 eval "makeWrapper ${envCheck} wrapped $params"
18 env -i ./wrapped > env.txt
19 sed "s#SUBST_ARGV0#${envCheck}#;s#SUBST_CWD#$PWD#" \
20 "${./.}/${testname}.env" > golden-env.txt
21 if ! diff env.txt golden-env.txt; then
22 echo "env/argv should be:"
23 cat golden-env.txt
24 echo "env/argv output is:"
25 cat env.txt
26 exit 1
27 fi
28 else
29 # without a golden env, we expect the wrapper compilation to fail
30 ! eval "makeWrapper ${envCheck} wrapped $params" &> error.txt
31 fi
32
33 cp wrapper.c $out
34 '';
35 tests = let
36 names = [
37 "add-flags"
38 "argv0"
39 "basic"
40 "chdir"
41 "combination"
42 "env"
43 "inherit-argv0"
44 "invalid-env"
45 "prefix"
46 "suffix"
47 "overlength-strings"
48 ];
49 f = name: lib.nameValuePair name (makeGoldenTest name);
50 in builtins.listToAttrs (builtins.map f names);
51in writeText "make-binary-wrapper-test" ''
52 ${lib.concatStringsSep "\n" (lib.mapAttrsToList (_: test: ''
53 "${test.name}" "${test}"
54 '') tests)}
55'' // tests