diff options
Diffstat (limited to 'pkgs/test/make-binary-wrapper/default.nix')
-rw-r--r-- | pkgs/test/make-binary-wrapper/default.nix | 113 |
1 files changed, 47 insertions, 66 deletions
diff --git a/pkgs/test/make-binary-wrapper/default.nix b/pkgs/test/make-binary-wrapper/default.nix index eddab15fd31..6f3b3ef4ae1 100644 --- a/pkgs/test/make-binary-wrapper/default.nix +++ b/pkgs/test/make-binary-wrapper/default.nix @@ -1,73 +1,54 @@ -{ lib, stdenv, runCommand, makeBinaryWrapper }: +{ lib, coreutils, python3, gcc, writeText, writeScript, runCommand, makeBinaryWrapper }: let - makeGoldenTest = { name, filename }: stdenv.mkDerivation { - name = name; - dontUnpack = true; - strictDeps = true; - nativeBuildInputs = [ makeBinaryWrapper ]; - phases = [ "installPhase" ]; - installPhase = '' - source ${./golden-test-utils.sh} - mkdir -p $out/bin - command=$(getInputCommand "${filename}") - eval "$command" > "$out/bin/result" - ''; - passthru = { - assertion = '' - source ${./golden-test-utils.sh} - contents=$(getOutputText "${filename}") - echo "$contents" | diff $out/bin/result - - ''; - }; - }; - tests = { - basic = makeGoldenTest { name = "basic"; filename = ./basic.c; }; - argv0 = makeGoldenTest { name = "argv0"; filename = ./argv0.c; }; - inherit_argv0 = makeGoldenTest { name = "inherit-argv0"; filename = ./inherit-argv0.c; }; - env = makeGoldenTest { name = "env"; filename = ./env.c; }; - invalid_env = makeGoldenTest { name = "invalid-env"; filename = ./invalid-env.c; }; - prefix = makeGoldenTest { name = "prefix"; filename = ./prefix.c; }; - suffix = makeGoldenTest { name = "suffix"; filename = ./suffix.c; }; - add_flags = makeGoldenTest { name = "add-flags"; filename = ./add-flags.c; }; - chdir = makeGoldenTest { name = "chdir"; filename = ./chdir.c; }; - combination = makeGoldenTest { name = "combination"; filename = ./combination.c; }; - }; -in runCommand "make-binary-wrapper-test" { - passthru = tests; - meta.platforms = lib.platforms.all; -} '' - validate() { - local name=$1 - local testout=$2 - local assertion=$3 - - echo -n "... $name: " >&2 - - local rc=0 - (out=$testout eval "$assertion") || rc=1 - - if [ "$rc" -eq 0 ]; then - echo "yes" >&2 + 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 - echo "no" >&2 + # without a golden env, we expect the wrapper compilation to fail + ! eval "makeBinaryWrapper ${envCheck} wrapped $params" &> error.txt fi - return "$rc" - } - - echo "checking whether makeCWrapper works properly... ">&2 - - fail= + 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: '' - validate "${test.name}" "${test}" ${lib.escapeShellArg test.assertion} || fail=1 + "${test.name}" "${test}" '') tests)} - - if [ "$fail" ]; then - echo "failed" - exit 1 - else - echo "succeeded" - touch $out - fi -'' +'' // tests |