]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test: add a couple of tests for systemd-bsod
authorFrantisek Sumsal <frantisek@sumsal.cz>
Fri, 6 Oct 2023 15:14:34 +0000 (17:14 +0200)
committerLuca Boccassi <luca.boccassi@gmail.com>
Fri, 3 Nov 2023 20:39:15 +0000 (20:39 +0000)
Add some basic tests for systemd-bsod, mainly to have something to build on
for #29056.

test/TEST-04-JOURNAL/test.sh
test/units/testsuite-04.bsod.sh [new file with mode: 0755]

index 96fc8b7049415fdcb138d816d0fac48f10ed0909..7f1c460d471d98cd579a02624197bb0605712c81 100755 (executable)
@@ -13,7 +13,7 @@ test_append_files() {
     mkdir -p "$workspace/test-journals/"
     cp -av "${TEST_BASE_DIR:?}/test-journals/"* "$workspace/test-journals/"
 
-    image_install curl unzstd
+    image_install curl setterm unzstd
     image_install -o openssl
     # Necessary for RH-based systems, otherwise MHD fails with:
     #   microhttpd: Failed to initialise TLS session.
diff --git a/test/units/testsuite-04.bsod.sh b/test/units/testsuite-04.bsod.sh
new file mode 100755 (executable)
index 0000000..6abdd27
--- /dev/null
@@ -0,0 +1,90 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+set -eux
+set -o pipefail
+
+if systemd-detect-virt -cq; then
+    echo "This test requires a VM, skipping the test"
+    exit 0
+fi
+
+# shellcheck disable=SC2317
+at_exit() {
+    local EC=$?
+
+    if [[ $EC -ne 0 ]] && [[ -e /tmp/console.dump ]]; then
+        cat /tmp/console.dump
+    fi
+
+    if mountpoint -q /var/log/journal; then
+        journalctl --relinquish-var
+        umount /var/log/journal
+        journalctl --flush
+    fi
+
+    return 0
+}
+
+vcs_dump_and_check() {
+    local expected_message="${1:?}"
+
+    # It might take a while before the systemd-bsod stuff appears on the VCS,
+    # so try it a couple of times
+    for _ in {0..9}; do
+        setterm --term linux --dump --file /tmp/console.dump
+        if grep -aq "The current boot has failed" /tmp/console.dump; then
+            grep -aq "$expected_message" /tmp/console.dump
+            grep -aq "Press any key to exit" /tmp/console.dump
+
+            return 0
+        fi
+
+        sleep .5
+    done
+
+    return 1
+}
+
+# Since systemd-bsod always fetches only the first emergency message from the
+# current boot, let's temporarily overmount /var/log/journal with a tmpfs,
+# as we're going to wipe it multiple times, but we need to keep the original
+# journal intact for the other tests to work correctly.
+trap at_exit EXIT
+mount -t tmpfs tmpfs /var/log/journal
+systemctl restart systemd-journald
+
+systemctl stop systemd-bsod
+
+# Since we just wiped the journal, there should be no emergency messages and
+# systemd-bsod should be just a no-op
+timeout 10s /usr/lib/systemd/systemd-bsod
+setterm --term linux --dump --file /tmp/console.dump
+(! grep "The current boot has failed" /tmp/console.dump)
+
+# systemd-bsod should pick up emergency messages only with UID=0, so let's check
+# that as well
+systemd-run --user --machine testuser@ --wait --pipe systemd-cat -p emerg echo "User emergency message"
+systemd-cat -p emerg echo "Root emergency message"
+journalctl --sync
+# Set $SYSTEMD_COLORS so systemd-bsod also prints out the QR code
+SYSTEMD_COLORS=256 /usr/lib/systemd/systemd-bsod &
+PID=$!
+vcs_dump_and_check "Root emergency message"
+grep -aq "Scan the QR code" /tmp/console.dump
+# TODO: check if systemd-bsod exits on a key press (didn't figure this one out yet)
+kill $PID
+timeout 10 bash -c "while kill -0 $PID; do sleep .5; done"
+
+# Wipe the journal
+journalctl --vacuum-size=1 --rotate
+(! journalctl -q -b -p emerg --grep .)
+
+# Check the systemd-bsod.service as well
+# Note: the systemd-bsod.service unit has ConditionVirtualization=no, so let's
+# temporarily override it just for the test
+mkdir /run/systemd/system/systemd-bsod.service.d
+printf '[Unit]\nConditionVirtualization=\n' >/run/systemd/system/systemd-bsod.service.d/99-override.conf
+systemctl daemon-reload
+systemctl start systemd-bsod
+systemd-cat -p emerg echo "Service emergency message"
+vcs_dump_and_check "Service emergency message"