summary refs log tree commit diff
path: root/pkgs/test/make-binary-wrapper/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/test/make-binary-wrapper/default.nix')
-rw-r--r--pkgs/test/make-binary-wrapper/default.nix113
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