Files
omarchy/plugins/omaplug/tests/auto-check-coordinator-test.sh
T
asepharyana 1cdb82a76f Sync config from arch
- hypr/apps.lua
- hypr/autostart.lua
- hypr/envs.lua
- hypr/hyprland.lua
- hypr/hyprsunset.conf
- hypr/input.lua
- hypr/looknfeel.lua
- hypr/omasettings.lua
- hypr/xdph.conf
- omarchy/branding/about.txt
- omarchy/branding/screensaver.txt
- omarchy/extensions/omarchy-menu.jsonc
- omarchy/hooks/battery-low.d/play-warning-sound.sample
- omarchy/hooks/font-set.d/show-font-notification.sample
- omarchy/hooks/post-boot.d/weather.sample
- omarchy/hooks/post-update.d/install-voxtype.hook
- omarchy/hooks/post-update.d/setup-agent.hook
- omarchy/hooks/post-update.d/setup-fingerprint.hook
- omarchy/hooks/post-update.d/show-update-notification.sample
- omarchy/hooks/pre-refresh-pacman.d/add-custom-repo.sample
- omarchy/hooks/theme-set.d/show-theme-notification.sample
- omarchy/shell.json
- omarchy/shell.toml
- omarchy/theme.name
- omarchy/themes/azure-glow/README.md
- omarchy/themes/azure-glow/alacritty.toml
- omarchy/themes/azure-glow/btop.theme
- omarchy/themes/azure-glow/hyprland.conf
- omarchy/themes/azure-glow/hyprlock.conf
- omarchy/themes/azure-glow/icons.theme
- … 269 more
2026-09-23 15:19:12 +07:00

87 lines
2.8 KiB
Bash

#!/bin/bash
set -euo pipefail
ROOT=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)
TMP=$(mktemp -d)
trap 'rm -rf -- "$TMP"' EXIT
SCRIPTDIR="$TMP/scriptdir"
mkdir -p -- "$SCRIPTDIR"
cp -- "$ROOT/auto-check-coordinator.sh" "$SCRIPTDIR/"
cp -- "$ROOT/runtime-state.py" "$SCRIPTDIR/"
chmod +x "$SCRIPTDIR/auto-check-coordinator.sh"
CALLS="$TMP/calls.log"
: > "$CALLS"
# Stands in for plugin-state.sh: records that it ran, takes long enough that
# a second, concurrent coordinator invocation is guaranteed to still find
# the lock held, and prints one fixed, recognizable result line.
cat > "$SCRIPTDIR/plugin-state.sh" <<EOF
#!/bin/bash
printf '%s\n' "\$\$" >> "$CALLS"
sleep 0.4
printf 'UPDATE\tfixture\thttps://example.invalid/fixture.git\tbehind\n'
EOF
chmod +x "$SCRIPTDIR/plugin-state.sh"
export XDG_RUNTIME_DIR="$TMP/xdg"
mkdir -p -- "$XDG_RUNTIME_DIR"
PLUGINS_DIR="$TMP/plugins"
mkdir -p -- "$PLUGINS_DIR"
EXPECTED=$'UPDATE\tfixture\thttps://example.invalid/fixture.git\tbehind'
# Two "monitors" ticking their auto-check timer at effectively the same
# moment. The second is staggered by 50ms - well under the stub's 400ms
# hold time - so it deterministically finds the lock already taken instead
# of racing for it, making this a real leader/follower run rather than a
# coin flip.
"$SCRIPTDIR/auto-check-coordinator.sh" "$PLUGINS_DIR" > "$TMP/out1" 2>"$TMP/err1" &
pid1=$!
sleep 0.05
"$SCRIPTDIR/auto-check-coordinator.sh" "$PLUGINS_DIR" > "$TMP/out2" 2>"$TMP/err2" &
pid2=$!
wait "$pid1"
wait "$pid2"
call_count=$(wc -l < "$CALLS")
if [[ $call_count -ne 1 ]]; then
printf 'FAIL: expected plugin-state.sh to run exactly once for 2 concurrent monitors, ran %s times\n' "$call_count" >&2
cat "$CALLS" >&2
exit 1
fi
for f in out1 out2; do
if [[ $(cat "$TMP/$f") != "$EXPECTED" ]]; then
printf 'FAIL: %s did not receive the leader'"'"'s result\n' "$f" >&2
printf 'got: %q\n' "$(cat "$TMP/$f")" >&2
cat "$TMP/err1" "$TMP/err2" >&2
exit 1
fi
done
# A lock directory left behind by a process that no longer exists (e.g.
# Panel.qml's checkWatchdog SIGKILLing a coordinator mid-run, which skips
# any EXIT trap) must not wedge every future auto-check.
: > "$CALLS"
LOCK="$XDG_RUNTIME_DIR/omaplug/auto-check.flock"
printf 'stale\n' > "$LOCK"
OUT=$("$SCRIPTDIR/auto-check-coordinator.sh" "$PLUGINS_DIR")
if [[ $OUT != "$EXPECTED" ]]; then
printf 'FAIL: stale lock (dead pid) blocked a fresh check instead of being reclaimed\n' >&2
printf 'got: %q\n' "$OUT" >&2
exit 1
fi
[[ $(wc -l < "$CALLS") -eq 1 ]] || {
printf 'FAIL: stale-lock recovery did not actually run plugin-state.sh\n' >&2
exit 1
}
# The flock inode is intentionally retained; the kernel releases ownership
# when the process exits, avoiding stale-PID deletion races.
printf 'auto-check-coordinator-test: ok\n'