aboutsummaryrefslogtreecommitdiff
path: root/scripts/testing/maint-scenarios/30-unit-reset.sh
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-07-08 05:45:51 -0500
committerCraig Jennings <c@cjennings.net>2026-07-08 05:45:51 -0500
commitd6993d35368f4733cac7dfd23be354de7ef0a0fb (patch)
tree5b4fb22b66d69bf5851dac0e32614ef958af5378 /scripts/testing/maint-scenarios/30-unit-reset.sh
parent26f7ea43ed3ef2dcb088dc4af5eb5881743f6a88 (diff)
downloadarchsetup-d6993d35368f4733cac7dfd23be354de7ef0a0fb.tar.gz
archsetup-d6993d35368f4733cac7dfd23be354de7ef0a0fb.zip
test(maint): add VM and nspawn remedy scenario harness
Nine break/fix/assert scenarios run the real maint fix inside the test VM. The runner batches non-conflicting scenarios into one VM boot, restores the snapshot only between groups, and leaves the base image pristine afterwards. A systemd-nspawn fast lane runs the pacman-level group against a cached pacstrap rootfs in seconds. The plan layer validates the scenario contract without a VM and carries a 19-test unit suite. make test-maint wires the VM lane in. The zfs lane is filtered but unexercised: the FS_PROFILE=zfs base image fails to build (ZFS DKMS module not found on linux-lts 6.18). The failure is tracked in the todo.
Diffstat (limited to 'scripts/testing/maint-scenarios/30-unit-reset.sh')
-rw-r--r--scripts/testing/maint-scenarios/30-unit-reset.sh28
1 files changed, 28 insertions, 0 deletions
diff --git a/scripts/testing/maint-scenarios/30-unit-reset.sh b/scripts/testing/maint-scenarios/30-unit-reset.sh
new file mode 100644
index 0000000..07eed53
--- /dev/null
+++ b/scripts/testing/maint-scenarios/30-unit-reset.sh
@@ -0,0 +1,28 @@
+# shellcheck shell=bash disable=SC2034 # sourced by run-maint-scenarios.sh
+# Scenario: a failed unit's state is reset.
+#
+# A transient oneshot that exits 1 lands in systemctl --failed; the remedy
+# resets it and the failed list returns to its pre-break size. The unit name
+# rides the remedy's item argument, exercising the priv verb's unit-name
+# validation. The base image carries its own failed unit (grub-btrfsd — no
+# snapshot dirs in the VM), so the assert scopes to this scenario's unit and
+# the count delta, never the absolute failed list.
+SCENARIO_DESC="failed unit reset clears the failed list"
+SCENARIO_GROUP="systemd"
+SCENARIO_PROFILES="any"
+
+scenario_break() {
+ PRE_FAILED_COUNT=$(mexec "systemctl --failed --no-legend | wc -l") \
+ && mexec "systemd-run --unit=maint-scenario-fail --service-type=oneshot --no-block /bin/false; sleep 2; systemctl is-failed maint-scenario-fail.service"
+}
+
+scenario_fix() {
+ mfix unit_reset maint-scenario-fail.service
+}
+
+scenario_assert() {
+ local pre="$PRE_FAILED_COUNT"
+ unset PRE_FAILED_COUNT # don't leak scenario state past this scenario
+ mexec "! systemctl is-failed maint-scenario-fail.service >/dev/null 2>&1" \
+ && [ "$(mexec "systemctl --failed --no-legend | wc -l")" = "$pre" ]
+}