aboutsummaryrefslogtreecommitdiffstats
path: root/desktop/modules/status/test-statusctl.sh
diff options
context:
space:
mode:
Diffstat (limited to 'desktop/modules/status/test-statusctl.sh')
-rwxr-xr-xdesktop/modules/status/test-statusctl.sh87
1 files changed, 87 insertions, 0 deletions
diff --git a/desktop/modules/status/test-statusctl.sh b/desktop/modules/status/test-statusctl.sh
new file mode 100755
index 0000000..3b8f7ba
--- /dev/null
+++ b/desktop/modules/status/test-statusctl.sh
@@ -0,0 +1,87 @@
+#!/bin/bash
+#
+# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# The one runnable check for statusctl. It points XDG_RUNTIME_DIR at a
+# temporary directory, so nothing here touches the live modes.
+#
+# Usage: ./test-statusctl.sh (exit 0 = all passed)
+
+set -u
+
+here="$(cd "$(dirname "$0")" && pwd)"
+ctl="$here/statusctl"
+tmp="$(mktemp -d)"
+trap 'rm -rf "$tmp"' EXIT
+export XDG_RUNTIME_DIR="$tmp"
+
+pass=0
+fail=0
+
+check() {
+ local label="$1" want="$2" got="$3"
+ if [[ "$want" == "$got" ]]; then
+ printf 'ok %s\n' "$label"
+ pass=$((pass + 1))
+ else
+ printf 'FAIL %s: want %q, got %q\n' "$label" "$want" "$got"
+ fail=$((fail + 1))
+ fi
+}
+
+# A mode with no file reads as off.
+check "missing file reads 0" "0" "$("$ctl" dnd get)"
+
+# set writes the file and get reads it back.
+"$ctl" dnd set 1
+check "set 1 writes the file" "1" "$(cat "$tmp/status.dnd" | tr -d '[:space:]')"
+check "get after set 1" "1" "$("$ctl" dnd get)"
+
+# toggle flips it.
+"$ctl" dnd toggle
+check "toggle from 1" "0" "$("$ctl" dnd get)"
+"$ctl" dnd toggle
+check "toggle from 0" "1" "$("$ctl" dnd get)"
+
+# set 0 writes rather than removing, so a reader sees an explicit off.
+"$ctl" dnd set 0
+check "set 0 writes the file" "0" "$("$ctl" dnd get)"
+
+# An unknown mode is an error, not a silent success: a typo must not look
+# like a mode that is off.
+"$ctl" nosuch get >/dev/null 2>&1
+check "unknown mode exits non-zero" "1" "$?"
+
+# watch prints a line on change, and the class reflects the value. The
+# atomic write arrives as a rename, which is why the watch needs moved_to.
+out="$tmp/watch.out"
+"$ctl" presentation watch > "$out" 2>/dev/null &
+watcher=$!
+sleep 0.3
+"$ctl" presentation set 1
+sleep 0.5
+kill "$watcher" 2>/dev/null
+wait "$watcher" 2>/dev/null
+check "watch reports activated" "1" "$(grep -c '"class": *"activated"' "$out")"
+
+# A missing file is reported as down, distinct from a mode that is off.
+rm -f "$tmp/status.presentation"
+out2="$tmp/watch2.out"
+"$ctl" presentation watch > "$out2" 2>/dev/null &
+watcher2=$!
+sleep 0.5
+kill "$watcher2" 2>/dev/null
+wait "$watcher2" 2>/dev/null
+check "watch reports down when absent" "1" "$(grep -c '"class": *"down"' "$out2")"
+
+printf '\n%d passed, %d failed\n' "$pass" "$fail"
+[[ "$fail" -eq 0 ]]