vuls: init at 0.27.0
[NixPkgs.git] / nixos / tests / systemd-binfmt.nix
bloba5e46a455d3259320aec4b27f18035236cb8f0cf
1 # Teach the kernel how to run armv7l and aarch64-linux binaries,
2 # and run GNU Hello for these architectures.
4 { system ? builtins.currentSystem,
5   config ? {},
6   pkgs ? import ../.. { inherit system config; }
7 }:
9 with import ../lib/testing-python.nix { inherit system pkgs; };
11 let
12   expectArgv0 = xpkgs: xpkgs.runCommandCC "expect-argv0" {
13     src = pkgs.writeText "expect-argv0.c" ''
14       #include <stdio.h>
15       #include <string.h>
17       int main(int argc, char **argv) {
18         fprintf(stderr, "Our argv[0] is %s\n", argv[0]);
20         if (strcmp(argv[0], argv[1])) {
21           fprintf(stderr, "ERROR: argv[0] is %s, should be %s\n", argv[0], argv[1]);
22           return 1;
23         }
25         return 0;
26       }
27     '';
28   } ''
29     $CC -o $out $src
30   '';
31 in {
32   basic = makeTest {
33     name = "systemd-binfmt";
34     nodes.machine = {
35       boot.binfmt.emulatedSystems = [
36         "armv7l-linux"
37         "aarch64-linux"
38       ];
39     };
41     testScript = let
42       helloArmv7l = pkgs.pkgsCross.armv7l-hf-multiplatform.hello;
43       helloAarch64 = pkgs.pkgsCross.aarch64-multiplatform.hello;
44     in ''
45       machine.start()
47       assert "world" in machine.succeed(
48           "${helloArmv7l}/bin/hello"
49       )
51       assert "world" in machine.succeed(
52           "${helloAarch64}/bin/hello"
53       )
54     '';
55   };
57   preserveArgvZero = makeTest {
58     name = "systemd-binfmt-preserve-argv0";
59     nodes.machine = {
60       boot.binfmt.emulatedSystems = [
61         "aarch64-linux"
62       ];
63     };
64     testScript = let
65       testAarch64 = expectArgv0 pkgs.pkgsCross.aarch64-multiplatform;
66     in ''
67       machine.start()
68       machine.succeed("exec -a meow ${testAarch64} meow")
69     '';
70   };
72   ldPreload = makeTest {
73     name = "systemd-binfmt-ld-preload";
74     nodes.machine = {
75       boot.binfmt.emulatedSystems = [
76         "aarch64-linux"
77       ];
78     };
79     testScript = let
80       helloAarch64 = pkgs.pkgsCross.aarch64-multiplatform.hello;
81       libredirectAarch64 = pkgs.pkgsCross.aarch64-multiplatform.libredirect;
82     in ''
83       machine.start()
85       assert "error" not in machine.succeed(
86           "LD_PRELOAD='${libredirectAarch64}/lib/libredirect.so' ${helloAarch64}/bin/hello 2>&1"
87       ).lower()
88     '';
89   };
91   chroot = makeTest {
92     name = "systemd-binfmt-chroot";
93     nodes.machine = { pkgs, lib, ... }: {
94       boot.binfmt.emulatedSystems = [
95         "aarch64-linux" "wasm32-wasi"
96       ];
97       boot.binfmt.preferStaticEmulators = true;
99       environment.systemPackages = [
100         (pkgs.writeShellScriptBin "test-chroot" ''
101           set -euo pipefail
102           mkdir -p /tmp/chroot
103           cp ${lib.getExe' pkgs.pkgsCross.aarch64-multiplatform.pkgsStatic.busybox "busybox"} /tmp/chroot/busybox
104           cp ${lib.getExe pkgs.pkgsCross.wasi32.yaml2json} /tmp/chroot/yaml2json # wasi binaries that build are hard to come by
105           chroot /tmp/chroot /busybox uname -m | grep aarch64
106           echo 42 | chroot /tmp/chroot /yaml2json | grep 42
107         '')
108       ];
109     };
110     testScript = ''
111       machine.start()
112       machine.succeed("test-chroot")
113     '';
114   };