#!/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" # Restart the shell the way it is actually running. Under supervision # (panama-quickshell.service), `qs kill` + a bare relaunch would race the # unit's own Restart=on-failure and leave two shells fighting over the bus; # unsupervised, the unit path does not exist and the old dance is right. if systemctl --user is-active -q panama-quickshell.service; then systemctl --user restart panama-quickshell.service else 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 fi 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'