summary refs log tree commit diff
path: root/pkgs/test/make-binary-wrapper/default.nix
blob: c9e045a4d9818185f57860c61f0153c9528b120d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
{ lib, coreutils, python3, gcc, writeText, writeScript, runCommand, makeBinaryWrapper }:

let
  env = { nativeBuildInputs = [ makeBinaryWrapper ]; };
  envCheck = runCommand "envcheck" env ''
    ${gcc}/bin/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 "makeWrapper ${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 "makeWrapper ${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