]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test: get rid of the busybox stuff
authorFrantisek Sumsal <frantisek@sumsal.cz>
Wed, 17 May 2023 17:10:55 +0000 (19:10 +0200)
committerFrantisek Sumsal <frantisek@sumsal.cz>
Wed, 17 May 2023 21:22:54 +0000 (23:22 +0200)
It already required a lot of workarounds, since the busybox utilities
often work differently than their "full" counterparts, and putting
the container together using our "tools" is quite simple anyway.

test/TEST-13-NSPAWN/test.sh
test/create-busybox-container [deleted file]
test/meson.build
test/units/testsuite-13.machinectl.sh
test/units/testsuite-13.nspawn-oci.sh
test/units/testsuite-13.nspawn.sh
test/units/util.sh

index 8bf33ceb12e6166637fc0b22d378881a649afef8..47862f1dc2a52dcb8daeb56f2949c1abd2bf0062 100755 (executable)
@@ -11,19 +11,34 @@ TEST_NO_NSPAWN=1
 
 test_append_files() {
     local workspace="${1:?}"
+    local container="$workspace/testsuite-13-container-template"
 
-    # On openSUSE the static linked version of busybox is named "busybox-static".
-    busybox="$(type -P busybox-static || type -P busybox)"
-    inst_simple "$busybox" "$(dirname "$busybox")/busybox"
+    # Create a dummy container "template" with a minimal toolset, which we can
+    # then use as a base for our nspawn/machinectl tests
+    initdir="$container" setup_basic_dirs
+    initdir="$container" image_install \
+        bash \
+        cat \
+        hostname \
+        grep \
+        ip \
+        ls \
+        md5sum \
+        mountpoint \
+        nc \
+        ps \
+        seq \
+        sleep \
+        stat \
+        touch
 
-    if command -v selinuxenabled >/dev/null && selinuxenabled; then
-        image_install chcon selinuxenabled
-        cp -ar /etc/selinux "$workspace/etc/selinux"
-        sed -i "s/^SELINUX=.*$/SELINUX=permissive/" "$workspace/etc/selinux/config"
-    fi
-
-    "$TEST_BASE_DIR/create-busybox-container" "$workspace/testsuite-13.nc-container"
-    initdir="$workspace/testsuite-13.nc-container" image_install nc ip md5sum
+    cp /etc/os-release "$container/usr/lib/os-release"
+    cat >"$container/sbin/init" <<EOF
+#!/bin/bash
+echo "Hello from dummy init, beautiful day, innit?"
+ip link
+EOF
+    chmod +x "$container/sbin/init"
 }
 
 do_test "$@"
diff --git a/test/create-busybox-container b/test/create-busybox-container
deleted file mode 100755 (executable)
index 5b2c80e..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-#!/usr/bin/env bash
-# SPDX-License-Identifier: LGPL-2.1-or-later
-
-set -eu
-set -o pipefail
-
-root="${1:?Usage: $0 container-root}"
-mkdir -p "$root"
-mkdir -p "$root/usr/bin"
-
-# On openSUSE the static linked version of busybox is named "busybox-static".
-busybox="$(type -P busybox-static || type -P busybox)"
-cp "$busybox" "$root/usr/bin/busybox"
-
-mkdir "$root/var"
-mkdir -p "$root/usr/lib"
-touch "$root/usr/lib/os-release"
-
-ln -s busybox "$root/usr/bin/cat"
-ln -s busybox "$root/usr/bin/hostname"
-ln -s busybox "$root/usr/bin/ip"
-ln -s busybox "$root/usr/bin/md5sum"
-ln -s busybox "$root/usr/bin/mountpoint"
-ln -s busybox "$root/usr/bin/ps"
-ln -s busybox "$root/usr/bin/seq"
-ln -s busybox "$root/usr/bin/sh"
-ln -s busybox "$root/usr/bin/sleep"
-ln -s busybox "$root/usr/bin/stat"
-ln -s busybox "$root/usr/bin/test"
-ln -s busybox "$root/usr/bin/touch"
-ln -s busybox "$root/usr/bin/tr"
-ln -s busybox "$root/usr/bin/true"
-ln -s busybox "$root/usr/bin/usleep"
-
-# Mock the bare minimum of getent to make systemd-nspawn --user= "work"
-cat >"$root/usr/bin/getent" <<\EOF
-#!/bin/sh
-
-if [[ $# - eq 0 ]]; then
-    :
-elif [[ $1 == passwd ]]; then
-    echo "testuser:x:1000:1000:testuser:/:/bin/sh"
-elif [[ $1 == initgroups ]]; then
-    echo "testuser"
-fi
-EOF
-chmod +x "$root/usr/bin/getent"
-
-mkdir -p "$root/usr/sbin"
-cat >"$root/usr/sbin/init" <<\EOF
-#!/bin/sh
-
-printf "ps aufx:\n"
-ps aufx
-
-printf "/proc/1/cmdline:\n"
-printf "%s\n\n" "$(tr '\0' ' ' </proc/1/cmdline)"
-
-printf "/proc/1/environ:\n"
-printf "%s\n\n" "$(tr '\0' '\n' </proc/1/environ)"
-
-printf "/proc/1/mountinfo:\n"
-cat /proc/self/mountinfo
-printf "\n"
-
-printf "/proc/1/cgroup:\n"
-printf "%s\n\n" "$(cat /proc/1/cgroup)"
-
-printf "/proc/1/uid_map:\n"
-printf "%s\n\n" "$(cat /proc/1/uid_map)"
-
-printf "/proc/1/setgroups:\n"
-printf "%s\n\n" "$(cat /proc/1/setgroups)"
-
-printf "/proc/1/gid_map:\n"
-printf "%s\n\n" "$(cat /proc/1/gid_map)"
-
-printf "ip link:\n"
-ip link
-EOF
-chmod +x "$root/usr/sbin/init"
-
-ln -srf "$root/usr/bin" "$root/bin"
-ln -srf "$root/usr/sbin" "$root/sbin"
-ln -srf "$root/usr/lib" "$root/lib"
index 48f837cee52c2605625215106a72e9ee4aed9462..6192dbd9f400e79b281d09bd5fc432a9a11729bd 100644 (file)
@@ -45,10 +45,6 @@ if install_tests
                                install_dir : testdata_dir)
         endif
 
-        install_data('create-busybox-container',
-                     install_mode : 'rwxr-xr-x',
-                     install_dir : testdata_dir)
-
         # The unit tests implemented as shell scripts expect to find testdata/
         # in the directory where they are stored.
         meson.add_install_script(meson_make_symlink,
index 8ccf4c5dc35c1dc614a18bb6ca0d6e21ccd7b22d..7f8408bd8472d89fd8d3c8685b5a83155d5f5f4c 100755 (executable)
@@ -4,9 +4,10 @@
 set -eux
 set -o pipefail
 
-export PAGER=
+# shellcheck source=test/units/util.sh
+. "$(dirname "$0")"/util.sh
 
-CREATE_BB_CONTAINER="/usr/lib/systemd/tests/testdata/create-busybox-container"
+export PAGER=
 
 at_exit() {
     set +e
@@ -24,18 +25,17 @@ mount -t tmpfs tmpfs /var/lib/machines
 
 # Create a couple of containers we can refer to in tests
 for i in {0..4}; do
-    "$CREATE_BB_CONTAINER" "/var/lib/machines/container$i"
+    create_dummy_container "/var/lib/machines/container$i"
     machinectl start "container$i"
 done
 # Create one "long running" container with some basic signal handling
-"$CREATE_BB_CONTAINER" /var/lib/machines/long-running
+create_dummy_container /var/lib/machines/long-running
 cat >/var/lib/machines/long-running/sbin/init <<\EOF
-#!/bin/sh -x
-#
+#!/usr/bin/bash -x
+
 PID=0
 
-# sh doesn't recognize RTMIN+4, so we have to use the signal number directly
-trap "touch /poweroff" 38
+trap "touch /poweroff" RTMIN+4
 trap "touch /reboot" INT
 trap "touch /trap" TRAP
 trap 'kill $PID' EXIT
@@ -82,24 +82,24 @@ machinectl disable long-running
 test ! -L /etc/systemd/system/machines.target.wants/systemd-nspawn@long-running.service
 machinectl disable long-running long-running long-running container1
 
-[[ "$(machinectl shell testuser@ /bin/sh -c 'echo -ne $FOO')" == "" ]]
-[[ "$(machinectl shell --setenv=FOO=bar testuser@ /bin/sh -c 'echo -ne $FOO')" == "bar" ]]
+[[ "$(machinectl shell testuser@ /usr/bin/bash -c 'echo -ne $FOO')" == "" ]]
+[[ "$(machinectl shell --setenv=FOO=bar testuser@ /usr/bin/bash -c 'echo -ne $FOO')" == "bar" ]]
 
 [[ "$(machinectl show --property=State --value long-running)" == "running" ]]
 # Equivalent to machinectl kill --signal=SIGRTMIN+4 --kill-whom=leader
 rm -f /var/lib/machines/long-running/poweroff
 machinectl poweroff long-running
-timeout 10 sh -c "while ! test -e /var/lib/machines/long-running/poweroff; do sleep .5; done"
+timeout 10 bash -c "while ! test -e /var/lib/machines/long-running/poweroff; do sleep .5; done"
 machinectl poweroff long-running long-running long-running
 # Equivalent to machinectl kill --signal=SIGINT --kill-whom=leader
 rm -f /var/lib/machines/long-running/reboot
 machinectl reboot long-running
-timeout 10 sh -c "while ! test -e /var/lib/machines/long-running/reboot; do sleep .5; done"
+timeout 10 bash -c "while ! test -e /var/lib/machines/long-running/reboot; do sleep .5; done"
 machinectl reboot long-running long-running long-running
 # Skip machinectl terminate for now, as it doesn't play well with our "init"
 rm -f /var/lib/machines/long-running/trap
 machinectl kill --signal=SIGTRAP --kill-whom=leader long-running
-timeout 10 sh -c "while ! test -e /var/lib/machines/long-running/trap; do sleep .5; done"
+timeout 10 bash -c "while ! test -e /var/lib/machines/long-running/trap; do sleep .5; done"
 machinectl kill --signal=SIGTRAP --kill-whom=leader long-running long-running long-running
 # All used signals should've been caught by a handler
 [[ "$(machinectl show --property=State --value long-running)" == "running" ]]
@@ -181,7 +181,7 @@ machinectl import-fs /tmp/container.dir container-dir
 machinectl start container-dir
 rm -fr /tmp/container.dir
 
-timeout 10 sh -c "while ! machinectl clean --all; do sleep .5; done"
+timeout 10 bash -c "while ! machinectl clean --all; do sleep .5; done"
 
 NSPAWN_FRAGMENT="machinectl-test-$RANDOM.nspawn"
 cat >"/var/lib/machines/$NSPAWN_FRAGMENT" <<EOF
index cbfdb18290c1db91c4218916a29ce2b5139b6874..de60ff6e7583a8ed6108753ef14fb0229ef124d1 100755 (executable)
@@ -4,9 +4,11 @@
 set -eux
 set -o pipefail
 
+# shellcheck source=test/units/util.sh
+. "$(dirname "$0")"/util.sh
+
 export SYSTEMD_LOG_LEVEL=debug
 export SYSTEMD_LOG_TARGET=journal
-CREATE_BB_CONTAINER="/usr/lib/systemd/tests/testdata/create-busybox-container"
 
 # shellcheck disable=SC2317
 at_exit() {
@@ -32,7 +34,7 @@ mount --bind /proc/self/ns/net "$NETNS"
 TMPDIR="$(mktemp -d)"
 touch "$TMPDIR/hello"
 OCI="$(mktemp -d /var/lib/machines/testsuite-13.oci-bundle.XXX)"
-"$CREATE_BB_CONTAINER" "$OCI/rootfs"
+create_dummy_container "$OCI/rootfs"
 mkdir -p "$OCI/rootfs/opt/var"
 mkdir -p "$OCI/rootfs/opt/readonly"
 
@@ -52,7 +54,7 @@ cat >"$OCI/config.json" <<EOF
     ]
 }
 EOF
-systemd-nspawn --oci-bundle="$OCI" sh -xec 'mountpoint /root'
+systemd-nspawn --oci-bundle="$OCI" bash -xec 'mountpoint /root'
 
 # And now for something a bit more involved
 # Notes:
@@ -97,7 +99,7 @@ cat >"$OCI/config.json" <<EOF
         ],
         "cwd" : "/root",
         "args" : [
-            "sh",
+            "bash",
             "-xe",
             "/entrypoint.sh"
         ],
@@ -347,7 +349,7 @@ EOF
 # Create a simple "entrypoint" script that validates that the container
 # is created correctly according to the OCI config
 cat >"$OCI/rootfs/entrypoint.sh" <<EOF
-#!/bin/sh -e
+#!/usr/bin/bash -e
 
 # Mounts
 mountpoint /root
index 8f8daf05ccad929fb793062e37b3e1393f423a94..efd330743a1d18b21a70ead2440673de8f0adabd 100755 (executable)
@@ -4,9 +4,11 @@
 set -eux
 set -o pipefail
 
+# shellcheck source=test/units/util.sh
+. "$(dirname "$0")"/util.sh
+
 export SYSTEMD_LOG_LEVEL=debug
 export SYSTEMD_LOG_TARGET=journal
-CREATE_BB_CONTAINER="/usr/lib/systemd/tests/testdata/create-busybox-container"
 
 at_exit() {
     set +e
@@ -37,7 +39,7 @@ IS_USERNS_SUPPORTED=no
 # with enabled user namespaces support. By setting this value explicitly
 # we can ensure the user namespaces support to be detected correctly.
 sysctl -w user.max_user_namespaces=10000
-if unshare -U sh -c :; then
+if unshare -U bash -c :; then
     IS_USERNS_SUPPORTED=yes
 fi
 
@@ -50,7 +52,7 @@ testcase_sanity_check() {
 
     tmpdir="$(mktemp -d)"
     template="$(mktemp -d /tmp/nspawn-template.XXX)"
-    "$CREATE_BB_CONTAINER" "$template"
+    create_dummy_container "$template"
     # Create a simple image from the just created container template
     image="$(mktemp /var/lib/machines/testsuite-13.image-XXX.img)"
     dd if=/dev/zero of="$image" bs=1M count=32
@@ -65,49 +67,49 @@ testcase_sanity_check() {
 
     # --template=
     root="$(mktemp -u -d /var/lib/machines/testsuite-13.sanity.XXX)"
-    (! systemd-nspawn --directory="$root" sh -xec 'echo hello')
+    (! systemd-nspawn --directory="$root" bash -xec 'echo hello')
     # Initialize $root from $template (the $root directory must not exist, hence
     # the `mktemp -u` above)
-    systemd-nspawn --directory="$root" --template="$template" sh -xec 'echo hello'
-    systemd-nspawn --directory="$root" sh -xec 'echo hello; touch /initialized'
+    systemd-nspawn --directory="$root" --template="$template" bash -xec 'echo hello'
+    systemd-nspawn --directory="$root" bash -xec 'echo hello; touch /initialized'
     test -e "$root/initialized"
     # Check if the $root doesn't get re-initialized once it's not empty
-    systemd-nspawn --directory="$root" --template="$template" sh -xec 'echo hello'
+    systemd-nspawn --directory="$root" --template="$template" bash -xec 'echo hello'
     test -e "$root/initialized"
 
-    systemd-nspawn --directory="$root" --ephemeral sh -xec 'touch /ephemeral'
+    systemd-nspawn --directory="$root" --ephemeral bash -xec 'touch /ephemeral'
     test ! -e "$root/ephemeral"
     (! systemd-nspawn --directory="$root" \
                       --bind="${COVERAGE_BUILD_DIR:-$tmpdir}" \
                       --read-only \
-                      sh -xec 'touch /nope')
+                      bash -xec 'touch /nope')
     test ! -e "$root/nope"
-    systemd-nspawn --image="$image" sh -xec 'echo hello'
+    systemd-nspawn --image="$image" bash -xec 'echo hello'
 
     # --volatile=
     touch "$root/usr/has-usr"
     # volatile(=yes): rootfs is tmpfs, /usr/ from the OS tree is mounted read only
     systemd-nspawn --directory="$root"\
                    --volatile \
-                   sh -xec 'test -e /usr/has-usr; touch /usr/read-only && exit 1; touch /nope'
+                   bash -xec 'test -e /usr/has-usr; touch /usr/read-only && exit 1; touch /nope'
     test ! -e "$root/nope"
     test ! -e "$root/usr/read-only"
     systemd-nspawn --directory="$root"\
                    --volatile=yes \
-                   sh -xec 'test -e /usr/has-usr; touch /usr/read-only && exit 1; touch /nope'
+                   bash -xec 'test -e /usr/has-usr; touch /usr/read-only && exit 1; touch /nope'
     test ! -e "$root/nope"
     test ! -e "$root/usr/read-only"
     # volatile=state: rootfs is read-only, /var/ is tmpfs
     systemd-nspawn --directory="$root" \
                    --bind="${COVERAGE_BUILD_DIR:-$tmpdir}" \
                    --volatile=state \
-                   sh -xec 'test -e /usr/has-usr; mountpoint /var; touch /read-only && exit 1; touch /var/nope'
+                   bash -xec 'test -e /usr/has-usr; mountpoint /var; touch /read-only && exit 1; touch /var/nope'
     test ! -e "$root/read-only"
     test ! -e "$root/var/nope"
     # volatile=state: tmpfs overlay is mounted over rootfs
     systemd-nspawn --directory="$root" \
                    --volatile=overlay \
-                   sh -xec 'test -e /usr/has-usr; touch /nope; touch /var/also-nope; touch /usr/nope-too'
+                   bash -xec 'test -e /usr/has-usr; touch /nope; touch /var/also-nope; touch /usr/nope-too'
     test ! -e "$root/nope"
     test ! -e "$root/var/also-nope"
     test ! -e "$root/usr/nope-too"
@@ -115,29 +117,43 @@ testcase_sanity_check() {
     # --machine=, --hostname=
     systemd-nspawn --directory="$root" \
                    --machine="foo-bar.baz" \
-                   sh -xec '[[ $(hostname) == foo-bar.baz ]]'
+                   bash -xec '[[ $(hostname) == foo-bar.baz ]]'
     systemd-nspawn --directory="$root" \
                    --hostname="hello.world.tld" \
-                   sh -xec '[[ $(hostname) == hello.world.tld ]]'
+                   bash -xec '[[ $(hostname) == hello.world.tld ]]'
     systemd-nspawn --directory="$root" \
                    --machine="foo-bar.baz" \
                    --hostname="hello.world.tld" \
-                   sh -xec '[[ $(hostname) == hello.world.tld ]]'
+                   bash -xec '[[ $(hostname) == hello.world.tld ]]'
 
     # --uuid=
     rm -f "$root/etc/machine-id"
     uuid="deadbeef-dead-dead-beef-000000000000"
     systemd-nspawn --directory="$root" \
                    --uuid="$uuid" \
-                   sh -xec "[[ \$container_uuid == $uuid ]]"
+                   bash -xec "[[ \$container_uuid == $uuid ]]"
 
     # --as-pid2
-    systemd-nspawn --directory="$root" sh -xec '[[ $$ -eq 1 ]]'
-    systemd-nspawn --directory="$root" --as-pid2 sh -xec '[[ $$ -eq 2 ]]'
+    systemd-nspawn --directory="$root" bash -xec '[[ $$ -eq 1 ]]'
+    systemd-nspawn --directory="$root" --as-pid2 bash -xec '[[ $$ -eq 2 ]]'
 
     # --user=
-    systemd-nspawn --directory="$root" sh -xec '[[ $USER == root ]]'
-    systemd-nspawn --directory="$root" --user=testuser sh -xec '[[ $USER == testuser ]]'
+    # "Fake" getent passwd's bare minimum, so we don't have to pull it in
+    # with all the DSO shenanigans
+    cat >"$root/bin/getent" <<\EOF
+#!/bin/bash
+
+if [[ $# -eq 0 ]]; then
+    :
+elif [[ $1 == passwd ]]; then
+    echo "testuser:x:1000:1000:testuser:/:/bin/sh"
+elif [[ $1 == initgroups ]]; then
+    echo "testuser"
+fi
+EOF
+    chmod +x "$root/bin/getent"
+    systemd-nspawn --directory="$root" bash -xec '[[ $USER == root ]]'
+    systemd-nspawn --directory="$root" --user=testuser bash -xec '[[ $USER == testuser ]]'
 
     # --settings= + .nspawn files
     mkdir -p /run/systemd/nspawn/
@@ -146,22 +162,22 @@ testcase_sanity_check() {
     systemd-nspawn --directory="$root" \
                    --machine=foo-bar \
                    --settings=yes \
-                   sh -xec '[[ $container_uuid == deadbeef-dead-dead-beef-111111111111 ]]'
+                   bash -xec '[[ $container_uuid == deadbeef-dead-dead-beef-111111111111 ]]'
     systemd-nspawn --directory="$root" \
                    --machine=foo-bar \
                    --uuid="$uuid" \
                    --settings=yes \
-                   sh -xec "[[ \$container_uuid == $uuid ]]"
+                   bash -xec "[[ \$container_uuid == $uuid ]]"
     systemd-nspawn --directory="$root" \
                    --machine=foo-bar \
                    --uuid="$uuid" \
                    --settings=override \
-                   sh -xec '[[ $container_uuid == deadbeef-dead-dead-beef-111111111111 ]]'
+                   bash -xec '[[ $container_uuid == deadbeef-dead-dead-beef-111111111111 ]]'
     systemd-nspawn --directory="$root" \
                    --machine=foo-bar \
                    --uuid="$uuid" \
                    --settings=trusted \
-                   sh -xec "[[ \$container_uuid == $uuid ]]"
+                   bash -xec "[[ \$container_uuid == $uuid ]]"
 
     # Mounts
     mkdir "$tmpdir"/{1,2,3}
@@ -170,35 +186,35 @@ testcase_sanity_check() {
     # --bind=
     systemd-nspawn --directory="$root" \
                    --bind="$tmpdir:/foo" \
-                   sh -xec 'test -e /foo/foo; touch /foo/bar'
+                   bash -xec 'test -e /foo/foo; touch /foo/bar'
     test -e "$tmpdir/bar"
     # --bind-ro=
     systemd-nspawn --directory="$root" \
                    --bind-ro="$tmpdir:/foo" \
-                   sh -xec 'test -e /foo/foo; touch /foo/baz && exit 1; true'
+                   bash -xec 'test -e /foo/foo; touch /foo/baz && exit 1; true'
     # --inaccessible=
     systemd-nspawn --directory="$root" \
                    --inaccessible=/var \
-                   sh -xec 'touch /var/foo && exit 1; true'
+                   bash -xec 'touch /var/foo && exit 1; true'
     # --tmpfs=
     systemd-nspawn --directory="$root" \
                    --tmpfs=/var:rw,nosuid,noexec \
-                   sh -xec 'touch /var/nope'
+                   bash -xec 'touch /var/nope'
     test ! -e "$root/var/nope"
     # --overlay=
     systemd-nspawn --directory="$root" \
                    --overlay="$tmpdir/1:$tmpdir/2:$tmpdir/3:/var" \
-                   sh -xec 'test -e /var/one; test -e /var/two; test -e /var/three; touch /var/foo'
+                   bash -xec 'test -e /var/one; test -e /var/two; test -e /var/three; touch /var/foo'
     test -e "$tmpdir/3/foo"
     # --overlay-ro=
     systemd-nspawn --directory="$root" \
                    --overlay-ro="$tmpdir/1:$tmpdir/2:$tmpdir/3:/var" \
-                   sh -xec 'test -e /var/one; test -e /var/two; test -e /var/three; touch /var/nope && exit 1; true'
+                   bash -xec 'test -e /var/one; test -e /var/two; test -e /var/three; touch /var/nope && exit 1; true'
     test ! -e "$tmpdir/3/nope"
     rm -fr "$tmpdir"
 
     # Assorted tests
-    systemd-nspawn --directory="$root" --suppress-sync=yes sh -xec 'echo hello'
+    systemd-nspawn --directory="$root" --suppress-sync=yes bash -xec 'echo hello'
     systemd-nspawn --capability=help
     systemd-nspawn --resolv-conf=help
     systemd-nspawn --timezone=help
@@ -252,12 +268,12 @@ testcase_check_bind_tmp_path() {
     local root
 
     root="$(mktemp -d /var/lib/machines/testsuite-13.bind-tmp-path.XXX)"
-    "$CREATE_BB_CONTAINER" "$root"
+    create_dummy_container "$root"
     : >/tmp/bind
     systemd-nspawn --register=no \
                    --directory="$root" \
                    --bind=/tmp/bind \
-                   /bin/sh -c 'test -e /tmp/bind'
+                   bash -c 'test -e /tmp/bind'
 
     rm -fr "$root" /tmp/bind
 }
@@ -271,12 +287,12 @@ testcase_check_norbind() {
     echo -n "outer" >/tmp/binddir/subdir/file
     mount -t tmpfs tmpfs /tmp/binddir/subdir
     echo -n "inner" >/tmp/binddir/subdir/file
-    "$CREATE_BB_CONTAINER" "$root"
+    create_dummy_container "$root"
 
     systemd-nspawn --register=no \
                    --directory="$root" \
                    --bind=/tmp/binddir:/mnt:norbind \
-                   /bin/sh -c 'CONTENT=$(cat /mnt/subdir/file); if [[ $CONTENT != "outer" ]]; then echo "*** unexpected content: $CONTENT"; return 1; fi'
+                   bash -c 'CONTENT=$(cat /mnt/subdir/file); if [[ $CONTENT != "outer" ]]; then echo "*** unexpected content: $CONTENT"; exit 1; fi'
 
     umount /tmp/binddir/subdir
     rm -fr "$root" /tmp/binddir/
@@ -304,13 +320,13 @@ testcase_check_rootidmap() {
     touch /tmp/rootidmap/bind/file
     chown -R "$owner:$owner" /tmp/rootidmap/bind
 
-    "$CREATE_BB_CONTAINER" "$root"
+    create_dummy_container "$root"
     cmd='PERMISSIONS=$(stat -c "%u:%g" /mnt/file); if [[ $PERMISSIONS != "0:0" ]]; then echo "*** wrong permissions: $PERMISSIONS"; return 1; fi; touch /mnt/other_file'
     if ! SYSTEMD_LOG_TARGET=console \
             systemd-nspawn --register=no \
                            --directory="$root" \
                            --bind=/tmp/rootidmap/bind:/mnt:rootidmap \
-                           /bin/sh -c "$cmd" |& tee nspawn.out; then
+                           bash -c "$cmd" |& tee nspawn.out; then
         if grep -q "Failed to map ids for bind mount.*: Function not implemented" nspawn.out; then
             echo "idmapped mounts are not supported, skipping the test..."
             return 0
@@ -328,21 +344,24 @@ testcase_check_rootidmap() {
 
 testcase_check_notification_socket() {
     # https://github.com/systemd/systemd/issues/4944
-    local cmd='echo a | $(busybox which nc) -U -u -w 1 /run/host/notify'
+    local root
+    local cmd='echo a | nc -U -u -w 1 /run/host/notify'
+
+    root="$(mktemp -d /var/lib/machines/testsuite-13.check_notification_socket.XXX)"
+    create_dummy_container "$root"
 
-    # /testsuite-13.nc-container is prepared by test.sh
-    systemd-nspawn --register=no --directory=/testsuite-13.nc-container /bin/sh -x -c "$cmd"
-    systemd-nspawn --register=no --directory=/testsuite-13.nc-container -U /bin/sh -x -c "$cmd"
+    systemd-nspawn --register=no --directory="$root" bash -x -c "$cmd"
+    systemd-nspawn --register=no --directory="$root" -U bash -x -c "$cmd"
 }
 
 testcase_check_os_release() {
     local root entrypoint os_release_source
 
     root="$(mktemp -d /var/lib/machines/testsuite-13.check-os-release.XXX)"
-    "$CREATE_BB_CONTAINER" "$root"
+    create_dummy_container "$root"
     entrypoint="$root/entrypoint.sh"
     cat >"$entrypoint" <<\EOF
-#!/bin/sh -ex
+#!/usr/bin/bash -ex
 
 . /tmp/os-release
 [[ -n "${ID:-}" && "$ID" != "$container_host_id" ]] && exit 1
@@ -378,18 +397,18 @@ EOF
 
 testcase_check_machinectl_bind() {
     local service_path service_name root container_name ec
-    local cmd='for i in $(seq 1 20); do if test -f /tmp/marker; then exit 0; fi; usleep 500000; done; exit 1;'
+    local cmd='for i in $(seq 1 20); do if test -f /tmp/marker; then exit 0; fi; sleep .5; done; exit 1;'
 
     root="$(mktemp -d /var/lib/machines/testsuite-13.check-machinectl-bind.XXX)"
-    "$CREATE_BB_CONTAINER" "$root"
-    container_name="${root##*/}"
+    create_dummy_container "$root"
+    container_name="$(basename "$root")"
 
     service_path="$(mktemp /run/systemd/system/nspawn-machinectl-bind-XXX.service)"
     service_name="${service_path##*/}"
     cat >"$service_path" <<EOF
 [Service]
 Type=notify
-ExecStart=systemd-nspawn --directory="$root" --notify-ready=no /bin/sh -xec "$cmd"
+ExecStart=systemd-nspawn --directory="$root" --notify-ready=no /usr/bin/bash -xec "$cmd"
 EOF
 
     systemctl daemon-reload
@@ -399,6 +418,7 @@ EOF
 
     timeout 10 bash -c "while [[ '\$(systemctl show -P SubState $service_name)' == running ]]; do sleep .2; done"
     ec="$(systemctl show -P ExecMainStatus "$service_name")"
+    systemctl stop "$service_name"
 
     rm -fr "$root" "$service_path"
 
@@ -415,7 +435,7 @@ testcase_check_selinux() {
     local root
 
     root="$(mktemp -d /var/lib/machines/testsuite-13.check-selinux.XXX)"
-    "$CREATE_BB_CONTAINER" "$root"
+    create_dummy_container "$root"
     chcon -R -t container_t "$root"
 
     systemd-nspawn --register=no \
@@ -432,7 +452,7 @@ testcase_check_ephemeral_config() {
     local root container_name
 
     root="$(mktemp -d /var/lib/machines/testsuite-13.check-ephemeral-config.XXX)"
-    "$CREATE_BB_CONTAINER" "$root"
+    create_dummy_container "$root"
     container_name="${root##*/}"
 
     mkdir -p /run/systemd/nspawn/
@@ -445,13 +465,13 @@ EOF
     systemd-nspawn --register=no \
                    --directory="$root" \
                    --ephemeral \
-                   /bin/sh -x -c "test -f /tmp/ephemeral-config"
+                   bash -x -c "test -f /tmp/ephemeral-config"
 
     systemd-nspawn --register=no \
                    --directory="$root" \
                    --ephemeral \
                    --machine=foobar \
-                   /bin/sh -x -c "! test -f /tmp/ephemeral-config"
+                   bash -x -c "! test -f /tmp/ephemeral-config"
 
     rm -fr "$root" "/run/systemd/nspawn/$container_name"
 }
@@ -473,7 +493,7 @@ matrix_run_one() {
     fi
 
     root="$(mktemp -d "/var/lib/machines/testsuite-13.unified-$1-cgns-$2-api-vfs-writable-$3.XXX")"
-    "$CREATE_BB_CONTAINER" "$root"
+    create_dummy_container "$root"
 
     SYSTEMD_NSPAWN_UNIFIED_HIERARCHY="$cgroupsv2" SYSTEMD_NSPAWN_USE_CGNS="$use_cgns" SYSTEMD_NSPAWN_API_VFS_WRITABLE="$api_vfs_writable" \
         systemd-nspawn --register=no \
@@ -548,7 +568,7 @@ matrix_run_one() {
         systemd-nspawn --register=no \
                        --directory="$root" \
                        --network-namespace-path=/run/netns/nspawn_test \
-                       /bin/ip a | grep -v -E '^1: lo.*UP'
+                       ip a | grep -v -E '^1: lo.*UP'
     ip netns del nspawn_test
 
     rm -fr "$root"
index d151c39965d4072c39b33de320c3452869b080b6..cd4ddcdb2c8579880526e4dd21b8335951ead66a 100755 (executable)
@@ -80,3 +80,15 @@ runas() {
     shift
     XDG_RUNTIME_DIR=/run/user/"$(id -u "$userid")" setpriv --reuid="$userid" --init-groups "$@"
 }
+
+create_dummy_container() {
+    local root="${1:?}"
+
+    if [[ ! -d /testsuite-13-container-template ]]; then
+        echo >&2 "Missing container template, probably not running in TEST-13-NSPAWN?"
+        exit 1
+    fi
+
+    mkdir -p "$root"
+    cp -a /testsuite-13-container-template/* "$root"
+}