Both tests run against the live session and capture "what it was before" so they can put it back. Neither checked that what they found was sane, so one interrupted run poisoned every run after it -- and because each subsequent run faithfully restored the bad value, the desktop stayed broken while the failure looked like an ordinary flake. displays-contract left the monitor at scale 1.25 after a failed revert. The next run recorded 1.25 as the original and restored the desktop to it. It now reads the shipped scale out of monitors.lua and refuses to run when the live display disagrees. A failure to parse that value is fatal rather than skipped, because silently skipping the check is how the laundering happened in the first place. focus-session-expiry kills and restarts the shell mid-session, so an interrupted run leaves caffeine on with nothing left to turn it off. The next `focus start` recorded "previously on", handed it back on expiry, and failed the assertion that caffeine ends off -- identically, forever, with the desktop unable to idle or lock the entire time. It now refuses to start unless caffeine is already off, which is the only state in which the test can tell "restored correctly" from "never released". Both guards name the exact command to recover with. Verified each fires on a dirty state and passes on a clean one; caffeine was found latched on this machine and has been released. Claude-Session: https://claude.ai/code/session_01BRvzt4H8XXLPVH5MyYdk9L
63 lines
2.1 KiB
Bash
Executable File
63 lines
2.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
fail() {
|
|
printf 'focus-session expiry: %s\n' "$1" >&2
|
|
exit 1
|
|
}
|
|
|
|
cleanup() {
|
|
qs ipc call focus end >/dev/null 2>&1 || true
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
qs ipc call focus end >/dev/null 2>&1 || true
|
|
|
|
# focus start records the caffeine state it found so end() can hand it back, and
|
|
# the assertion below requires caffeine to finish off. Both are only true if
|
|
# caffeine starts off.
|
|
#
|
|
# This test kills and restarts the live shell, so an interrupted run leaves
|
|
# caffeine on with nothing to turn it back off. The next run then records
|
|
# "previously on", faithfully restores it, and fails -- and every run after
|
|
# that fails identically, with the desktop quietly unable to idle or lock the
|
|
# whole time. Refuse to start from that state rather than latching it in.
|
|
if [[ "$(qs ipc call caffeine status 2>/dev/null)" != "false" ]]; then
|
|
fail 'caffeine is on before the session starts -- this test cannot distinguish "restored correctly" from "never released". Turn it off first: qs ipc call caffeine toggle'
|
|
fi
|
|
|
|
qs ipc call focus start >/dev/null
|
|
|
|
state_file=$(find "${XDG_STATE_HOME:-$HOME/.local/state}/quickshell/by-shell" -name focus-session.json -print -quit)
|
|
[[ -n "$state_file" ]] || fail 'persistent state file was not created'
|
|
|
|
expired=$(mktemp "${state_file}.expired.XXXXXX")
|
|
jq '.paused = false | .deadlineMs = 1' "$state_file" >"$expired"
|
|
chmod --reference="$state_file" "$expired"
|
|
mv "$expired" "$state_file"
|
|
|
|
qs kill >/dev/null
|
|
for _ in $(seq 1 50); do
|
|
qs list 2>&1 | rg -q '^Instance ' || break
|
|
sleep 0.1
|
|
done
|
|
if qs list 2>&1 | rg -q '^Instance '; then
|
|
fail 'shell did not stop before restart'
|
|
fi
|
|
quickshell --daemonize >/dev/null
|
|
|
|
status=""
|
|
for _ in $(seq 1 60); do
|
|
status=$(qs ipc call focus status 2>/dev/null || true)
|
|
if jq -e '.active == false' <<<"$status" >/dev/null 2>&1; then
|
|
break
|
|
fi
|
|
sleep 0.2
|
|
done
|
|
|
|
jq -e '.active == false and .caffeine == false and .doNotDisturb == false' <<<"$status" >/dev/null || fail 'expired session was not completed and released'
|
|
|
|
trap - EXIT
|
|
printf 'focus-session expiry: PASS\n'
|