Report shutdown failures and test blocked window closing
This commit is contained in:
1 parent
92f9864c72
commit
eaaca77efb
2 files changed
+55
-10
No files matched your search
@@ -14,12 +14,19 @@ if [[ ${1:-} == "--inhibited" ]]; then
|
|||||||
|
|
||||||
sleep 2 # Allow apps like Chrome to shut down correctly
|
sleep 2 # Allow apps like Chrome to shut down correctly
|
||||||
systemctl poweroff --no-wall
|
systemctl poweroff --no-wall
|
||||||
|
elif [[ ${1:-} == "--inhibit" ]]; then
|
||||||
|
# Report failures from inside the service, independently of the launching terminal.
|
||||||
|
# Block lid handling explicitly: it ignores high-level sleep inhibitors.
|
||||||
|
systemd-inhibit --what=sleep:idle:handle-lid-switch \
|
||||||
|
--who=Omarchy --why="Shutdown in progress" --mode=block \
|
||||||
|
"$OMARCHY_PATH/bin/omarchy-system-shutdown" --inhibited || {
|
||||||
|
status=$?
|
||||||
|
omarchy-notification-send -u critical "Shutdown failed" "Could not complete shutdown. Please try again."
|
||||||
|
exit "$status"
|
||||||
|
}
|
||||||
else
|
else
|
||||||
# Schedule the shutdown in the user manager so closing the terminal's systemd
|
# Schedule the shutdown in the user manager so closing the terminal's systemd
|
||||||
# scope cannot terminate it before it runs.
|
# scope cannot terminate it before it runs.
|
||||||
# Block lid handling explicitly: it ignores high-level sleep inhibitors.
|
|
||||||
systemd-run --user --collect --quiet --property=Type=exec --property=RuntimeMaxSec=30s \
|
systemd-run --user --collect --quiet --property=Type=exec --property=RuntimeMaxSec=30s \
|
||||||
systemd-inhibit --what=sleep:idle:handle-lid-switch \
|
"$OMARCHY_PATH/bin/omarchy-system-shutdown" --inhibit
|
||||||
--who=Omarchy --why="Shutdown in progress" --mode=block \
|
|
||||||
"$OMARCHY_PATH/bin/omarchy-system-shutdown" --inhibited
|
|
||||||
fi
|
fi
|
||||||
@@ -25,20 +25,36 @@ cat >"$mock_bin/systemd-inhibit" <<'SH'
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
printf 'systemd-inhibit %s\n' "$*" >>"$CALL_LOG"
|
printf 'systemd-inhibit %s\n' "$*" >>"$CALL_LOG"
|
||||||
[[ ${FAIL_INHIBIT:-false} == "true" ]] && exit 1
|
[[ ${FAIL_INHIBIT:-false} == "true" ]] && exit 17
|
||||||
while [[ $1 == --* ]]; do shift; done
|
while [[ $1 == --* ]]; do shift; done
|
||||||
touch "$CALL_LOG.inhibited"
|
touch "$CALL_LOG.inhibited"
|
||||||
trap 'rm -f "$CALL_LOG.inhibited"' EXIT
|
trap 'rm -f "$CALL_LOG.inhibited"' EXIT
|
||||||
"$@"
|
"$@"
|
||||||
SH
|
SH
|
||||||
|
|
||||||
for command in omarchy-state omarchy-hyprland-window-close-all omarchy-osd sleep systemctl; do
|
for command in omarchy-state omarchy-hyprland-window-close-all omarchy-osd omarchy-notification-send sleep systemctl; do
|
||||||
cat >"$mock_bin/$command" <<'SH'
|
cat >"$mock_bin/$command" <<'SH'
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
command=${0##*/}
|
command=${0##*/}
|
||||||
printf '%s %s\n' "$command" "$*" >>"$CALL_LOG"
|
printf '%s %s\n' "$command" "$*" >>"$CALL_LOG"
|
||||||
case $command in
|
case $command in
|
||||||
|
omarchy-hyprland-window-close-all)
|
||||||
|
if [[ ${BLOCK_WINDOW_CLOSE:-false} == "true" ]]; then
|
||||||
|
for (( attempt = 0; attempt < 200; attempt++ )); do
|
||||||
|
if [[ -f $CALL_LOG.poweroff ]]; then
|
||||||
|
touch "$CALL_LOG.close-finished"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
/usr/bin/sleep 0.01
|
||||||
|
done
|
||||||
|
touch "$CALL_LOG.close-timeout"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
omarchy-notification-send)
|
||||||
|
[[ ${FAIL_NOTIFICATION:-false} != "true" ]] || exit 42
|
||||||
|
;;
|
||||||
sleep)
|
sleep)
|
||||||
if [[ $1 == "2" ]]; then
|
if [[ $1 == "2" ]]; then
|
||||||
# Synchronize with background preparation without a fixed test-time sleep.
|
# Synchronize with background preparation without a fixed test-time sleep.
|
||||||
@@ -51,6 +67,7 @@ case $command in
|
|||||||
;;
|
;;
|
||||||
systemctl)
|
systemctl)
|
||||||
[[ $* == "poweroff --no-wall" && -f $CALL_LOG.inhibited && -f $CALL_LOG.grace ]] || exit 2
|
[[ $* == "poweroff --no-wall" && -f $CALL_LOG.inhibited && -f $CALL_LOG.grace ]] || exit 2
|
||||||
|
touch "$CALL_LOG.poweroff"
|
||||||
[[ ${FAIL_POWEROFF:-false} != "true" ]]
|
[[ ${FAIL_POWEROFF:-false} != "true" ]]
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -77,7 +94,7 @@ diff -u "$test_tmp/reboot-expected.log" "$call_log" || fail "reboot runs after b
|
|||||||
pass "reboot runs after being scheduled outside the terminal scope"
|
pass "reboot runs after being scheduled outside the terminal scope"
|
||||||
|
|
||||||
run_power_command shutdown || fail "shutdown service is scheduled"
|
run_power_command shutdown || fail "shutdown service is scheduled"
|
||||||
grep -q '^systemd-run --user --collect --quiet --property=Type=exec --property=RuntimeMaxSec=30s systemd-inhibit ' "$CALL_LOG" || fail "shutdown uses a bounded service outside the launching terminal"
|
grep -q '^systemd-run --user --collect --quiet --property=Type=exec --property=RuntimeMaxSec=30s .* --inhibit$' "$CALL_LOG" || fail "shutdown uses a bounded service outside the launching terminal"
|
||||||
bash "$CALL_LOG.worker" || fail "protected shutdown succeeds"
|
bash "$CALL_LOG.worker" || fail "protected shutdown succeeds"
|
||||||
grep -q '^systemd-inhibit --what=sleep:idle:handle-lid-switch .* --mode=block .* --inhibited$' "$CALL_LOG" || fail "shutdown blocks sleep and lid handling"
|
grep -q '^systemd-inhibit --what=sleep:idle:handle-lid-switch .* --mode=block .* --inhibited$' "$CALL_LOG" || fail "shutdown blocks sleep and lid handling"
|
||||||
inhibit_line=$(grep -n '^systemd-inhibit ' "$CALL_LOG" | cut -d: -f1)
|
inhibit_line=$(grep -n '^systemd-inhibit ' "$CALL_LOG" | cut -d: -f1)
|
||||||
@@ -87,8 +104,19 @@ grep -q '^omarchy-state clear re\*-required$' "$CALL_LOG" || fail "shutdown clea
|
|||||||
grep -q '^omarchy-hyprland-window-close-all ' "$CALL_LOG" || fail "shutdown closes windows"
|
grep -q '^omarchy-hyprland-window-close-all ' "$CALL_LOG" || fail "shutdown closes windows"
|
||||||
grep -q '^systemctl poweroff --no-wall$' "$CALL_LOG" || fail "poweroff runs after the grace period while inhibited"
|
grep -q '^systemctl poweroff --no-wall$' "$CALL_LOG" || fail "poweroff runs after the grace period while inhibited"
|
||||||
[[ ! -f $CALL_LOG.inhibited ]] || fail "accepted poweroff releases inhibition"
|
[[ ! -f $CALL_LOG.inhibited ]] || fail "accepted poweroff releases inhibition"
|
||||||
|
! grep -q '^omarchy-notification-send ' "$CALL_LOG" || fail "successful shutdown sends no failure notification"
|
||||||
pass "shutdown stays inhibited through preparation and the poweroff request"
|
pass "shutdown stays inhibited through preparation and the poweroff request"
|
||||||
|
|
||||||
|
: >"$call_log"
|
||||||
|
rm -f "$CALL_LOG.grace" "$CALL_LOG.poweroff"
|
||||||
|
BLOCK_WINDOW_CLOSE=true bash "$CALL_LOG.worker" || fail "shutdown proceeds while window closing is blocked"
|
||||||
|
for (( attempt = 0; attempt < 200; attempt++ )); do
|
||||||
|
[[ -f $CALL_LOG.close-finished || -f $CALL_LOG.close-timeout ]] && break
|
||||||
|
/usr/bin/sleep 0.01
|
||||||
|
done
|
||||||
|
[[ -f $CALL_LOG.close-finished && ! -f $CALL_LOG.close-timeout ]] || fail "poweroff releases the blocked window helper before its timeout"
|
||||||
|
pass "blocked window closing cannot delay poweroff"
|
||||||
|
|
||||||
for action in reboot shutdown; do
|
for action in reboot shutdown; do
|
||||||
: >"$call_log"
|
: >"$call_log"
|
||||||
if FAIL_SYSTEMD_RUN=true "$ROOT/bin/omarchy-system-$action"; then
|
if FAIL_SYSTEMD_RUN=true "$ROOT/bin/omarchy-system-$action"; then
|
||||||
@@ -104,14 +132,24 @@ done
|
|||||||
for failure in FAIL_INHIBIT FAIL_POWEROFF; do
|
for failure in FAIL_INHIBIT FAIL_POWEROFF; do
|
||||||
: >"$call_log"
|
: >"$call_log"
|
||||||
rm -f "$CALL_LOG.grace"
|
rm -f "$CALL_LOG.grace"
|
||||||
if env "$failure=true" bash "$CALL_LOG.worker"; then
|
env "$failure=true" bash "$CALL_LOG.worker"
|
||||||
|
status=$?
|
||||||
|
expected_status=1
|
||||||
|
[[ $failure == "FAIL_INHIBIT" ]] && expected_status=17
|
||||||
|
if (( status != expected_status )); then
|
||||||
fail "$failure propagates to the service"
|
fail "$failure propagates to the service"
|
||||||
fi
|
fi
|
||||||
|
grep -q '^omarchy-notification-send -u critical Shutdown failed Could not complete shutdown. Please try again.$' "$CALL_LOG" || fail "$failure notifies the user"
|
||||||
[[ ! -f $CALL_LOG.inhibited ]] || fail "$failure releases inhibition"
|
[[ ! -f $CALL_LOG.inhibited ]] || fail "$failure releases inhibition"
|
||||||
if [[ $failure == "FAIL_INHIBIT" ]]; then
|
if [[ $failure == "FAIL_INHIBIT" ]]; then
|
||||||
(( $(wc -l <"$call_log") == 1 )) || fail "inhibitor failure leaves applications alone"
|
(( $(wc -l <"$call_log") == 2 )) || fail "inhibitor failure leaves applications alone"
|
||||||
else
|
else
|
||||||
grep -q '^systemctl poweroff --no-wall$' "$CALL_LOG" || fail "rejection test reaches poweroff"
|
grep -q '^systemctl poweroff --no-wall$' "$CALL_LOG" || fail "rejection test reaches poweroff"
|
||||||
fi
|
fi
|
||||||
pass "$failure leaves no inhibitor behind"
|
pass "$failure notifies the user and leaves no inhibitor behind"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
: >"$call_log"
|
||||||
|
FAIL_INHIBIT=true FAIL_NOTIFICATION=true bash "$CALL_LOG.worker"
|
||||||
|
[[ $? == 17 ]] || fail "notification failure preserves the shutdown error"
|
||||||
|
pass "notification failure preserves the shutdown error"
|
||||||
Reference in new issue
Block a user