nixos/firmware: make compression configurable (#364924)
[NixPkgs.git] / pkgs / test / auto-patchelf-hook / package.nix
blobc67aa2ca375bf1216609bce089d6d84b719036b5
1 # This is a test for autoPatchelfHook. To test it, we just need a simple binary
2 # which uses the hook. We took the derivation from tonelib-jam, which sounds
3 # like a good candidate with a small closure, and trimmed it down.
6   stdenv,
7   lib,
8   fetchurl,
9   autoPatchelfHook,
10   dpkg,
11   freetype,
12   curl,
13   # This test checks that the behavior of autoPatchelfHook is correct whether
14   # __structuredAttrs
15   # (https://nixos.org/manual/nix/stable/language/advanced-attributes#adv-attr-structuredAttrs)
16   # is set or not. Hence __structuredAttrs is provided as a parameter.
17   __structuredAttrs,
20 let
21   runtimeDependencies =
22     [
23       (lib.getLib curl)
24       "/some/dep"
25       "/some/other/dep"
26     ]
27     # A dependency with space only works with __structuredAttrs set to true.
28     ++ lib.lists.optional __structuredAttrs "/some/dep with space";
31 stdenv.mkDerivation {
32   name = "auto-patchelf-test";
34   src = fetchurl {
35     url = "https://tonelib.net/download/221222/ToneLib-Jam-amd64.deb";
36     sha256 = "sha256-c6At2lRPngQPpE7O+VY/Hsfw+QfIb3COIuHfbqqIEuM=";
37   };
39   unpackCmd = ''
40     dpkg -x $curSrc source
41   '';
43   nativeBuildInputs = [
44     dpkg
45     autoPatchelfHook
46   ];
48   installPhase = ''
49     mv usr $out
50   '';
52   buildInputs = [
53     freetype
54   ];
56   autoPatchelfIgnoreMissingDeps = [
57     "libGL.so.1"
58     "libasound.so.2"
59   ];
61   inherit runtimeDependencies;
63   # Additional phase performing the actual test.
64   installCheckPhase =
65     let
66       allDeps = runtimeDependencies ++ [
67         (lib.getLib freetype)
68       ];
69     in
70     ''
71       local binary="$out/bin/ToneLib-Jam"
72       local interpreter=$(patchelf --print-interpreter $binary)
73       local runpath=$(patchelf --print-rpath $binary)
74       local glibcStorePath="${stdenv.cc.libc}"
76       # Check that the glibc path is a prefix of the interpreter. If
77       # autoPatchelfHook ran correctly, the binary should have set the interpreter
78       # to point to the store.
79       echo "[auto-patchelf-hook-test]: Check that the interpreter is in the store"
80       test "''${interpreter#$glibcStorePath}" != "$interpreter"
82       readarray -td':' runpathArray < <(echo -n "$runpath")
84       echo "[auto-patchelf-hook-test]: Check that the runpath has the right number of entries"
85       test "''${#runpathArray[@]}" -eq ${builtins.toString (builtins.length allDeps)}
87       echo "[auto-patchelf-hook-test]: Check that the runpath contains the expected runtime deps"
88     ''
89     + lib.strings.concatStringsSep "\n" (
90       lib.lists.imap0 (
91         i: path:
92         let
93           iAsStr = builtins.toString i;
94         in
95         ''
96           echo "[auto-patchelf-hook-test]: Check that entry ${iAsStr} is ${path}"
97           test "''${paths[${iAsStr}]}" = "$path"
98         ''
99       ) allDeps
100     );
102   doInstallCheck = true;
103   inherit __structuredAttrs;