55 lines
1.5 KiB
Nix
55 lines
1.5 KiB
Nix
{ lib, coreutils, python3, gcc, writeText, writeScript, runCommand, makeBinaryWrapper }:
|
|
|
|
let
|
|
env = { nativeBuildInputs = [ makeBinaryWrapper gcc ]; };
|
|
envCheck = runCommand "envcheck" env ''
|
|
cc -o $out ${./envcheck.c}
|
|
'';
|
|
makeGoldenTest = testname: runCommand "test-wrapper_${testname}" env ''
|
|
mkdir -p /tmp/foo
|
|
|
|
params=$(<"${./.}/${testname}.cmdline")
|
|
eval "makeCWrapper /send/me/flags $params" > wrapper.c
|
|
|
|
diff wrapper.c "${./.}/${testname}.c"
|
|
|
|
if [ -f "${./.}/${testname}.env" ]; then
|
|
eval "makeBinaryWrapper ${envCheck} wrapped $params"
|
|
env -i ./wrapped > env.txt
|
|
sed "s#SUBST_ARGV0#${envCheck}#;s#SUBST_CWD#$PWD#" \
|
|
"${./.}/${testname}.env" > golden-env.txt
|
|
if ! diff env.txt golden-env.txt; then
|
|
echo "env/argv should be:"
|
|
cat golden-env.txt
|
|
echo "env/argv output is:"
|
|
cat env.txt
|
|
exit 1
|
|
fi
|
|
else
|
|
# without a golden env, we expect the wrapper compilation to fail
|
|
! eval "makeBinaryWrapper ${envCheck} wrapped $params" &> error.txt
|
|
fi
|
|
|
|
cp wrapper.c $out
|
|
'';
|
|
tests = let
|
|
names = [
|
|
"add-flags"
|
|
"argv0"
|
|
"basic"
|
|
"chdir"
|
|
"combination"
|
|
"env"
|
|
"inherit-argv0"
|
|
"invalid-env"
|
|
"prefix"
|
|
"suffix"
|
|
];
|
|
f = name: lib.nameValuePair name (makeGoldenTest name);
|
|
in builtins.listToAttrs (builtins.map f names);
|
|
in writeText "make-binary-wrapper-test" ''
|
|
${lib.concatStringsSep "\n" (lib.mapAttrsToList (_: test: ''
|
|
"${test.name}" "${test}"
|
|
'') tests)}
|
|
'' // tests
|