From 646637f53ab7c64eb8edcb86eb0f73fc4c3a19b8 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Fri, 3 Jul 2026 23:45:22 +0100 Subject: [PATCH] Add control subs test. --- regress/control-subscriptions.sh | 172 +++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 regress/control-subscriptions.sh diff --git a/regress/control-subscriptions.sh b/regress/control-subscriptions.sh new file mode 100644 index 000000000..25c732ac0 --- /dev/null +++ b/regress/control-subscriptions.sh @@ -0,0 +1,172 @@ +#!/bin/sh + +PATH=/bin:/usr/bin +TERM=screen +LC_ALL=C.UTF-8 +LANG=C.UTF-8 +export TERM LC_ALL LANG + +[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) +TMUX="$TEST_TMUX -Ltest -f/dev/null" + +TMPDIR=$(mktemp -d) +IN="$TMPDIR/in" +OUT="$TMPDIR/out" +PID= + +cleanup() +{ + [ -n "$PID" ] && kill "$PID" 2>/dev/null + $TMUX kill-server 2>/dev/null + rm -rf "$TMPDIR" +} +trap cleanup EXIT + +wait_for() +{ + pattern=$1 + timeout=${2:-6} + i=0 + + while [ "$i" -lt "$timeout" ]; do + if grep -F -- "$pattern" "$OUT" >/dev/null 2>&1; then + return 0 + fi + sleep 1 + i=$((i + 1)) + done + echo "missing: $pattern" + cat "$OUT" + return 1 +} + +reject_for() +{ + pattern=$1 + timeout=${2:-3} + i=0 + + while [ "$i" -lt "$timeout" ]; do + if grep -F -- "$pattern" "$OUT" >/dev/null 2>&1; then + echo "unexpected: $pattern" + cat "$OUT" + return 1 + fi + sleep 1 + i=$((i + 1)) + done + return 0 +} + +wait_tmux() +{ + target=$1 + timeout=${2:-6} + i=0 + + while [ "$i" -lt "$timeout" ]; do + if $TMUX display-message -p -t "$target" '#{window_id}' \ + >/dev/null 2>&1; then + return 0 + fi + sleep 1 + i=$((i + 1)) + done + return 1 +} + +window_fields() +{ + $TMUX display-message -p -t "$1" '#{window_id} #{window_index}' +} + +pane_fields() +{ + $TMUX display-message -p -t "$1" '#{window_id} #{window_index} #{pane_id}' +} + +send() +{ + printf '%s\n' "$*" >&3 +} + +$TMUX kill-server 2>/dev/null +$TMUX new-session -d -s subs -x 80 -y 24 || exit 1 +sid=$($TMUX display-message -p -t subs '#{session_id}') + +mkfifo "$IN" +: >"$OUT" +$TMUX -C attach-session -t subs <"$IN" >"$OUT" 2>&1 & +PID=$! +exec 3>"$IN" + +send 'display-message -p ready' +wait_for 'ready' 3 || exit 1 + +send "refresh-client -B 'sw::#{session_windows}'" +wait_for "%subscription-changed sw $sid - - - : 1" || exit 1 + +send 'new-window' +wait_for "%subscription-changed sw $sid - - - : 2" || exit 1 + +send 'refresh-client -B sw' +send 'new-window' +reject_for "%subscription-changed sw $sid - - - : 3" || exit 1 + +send 'new-window -n pane-test' +wait_tmux subs:pane-test || exit 1 +set -- $(pane_fields subs:pane-test) +wid=$1 +widx=$2 +pane=$3 + +send "refresh-client -B 'ap:%*:#{pane_id}'" +wait_for "%subscription-changed ap $sid $wid $widx $pane : $pane" || exit 1 + +send 'split-window -t subs:pane-test' +i=0 +while [ "$i" -lt 6 ]; do + [ "$($TMUX list-panes -t subs:pane-test | wc -l)" -eq 2 ] && break + sleep 1 + i=$((i + 1)) +done +[ "$i" -lt 6 ] || exit 1 +newpane=$($TMUX list-panes -t subs:pane-test -F '#{pane_id}' | tail -n 1) +wait_for "%subscription-changed ap $sid $wid $widx $newpane : $newpane" || + exit 1 + +$TMUX new-session -d -s other || exit 1 +$TMUX link-window -s subs:pane-test -t other:1 || exit 1 + +send "refresh-client -B 'sp:$newpane:#{pane_id}:#{window_id}'" +wait_for "%subscription-changed sp $sid $wid $widx $newpane : $newpane:$wid" || + exit 1 + +send "refresh-client -B 'cw:$wid:#{window_id}:#{window_index}'" +wait_for "%subscription-changed cw $sid $wid $widx - : $wid:$widx" || + exit 1 + +send "refresh-client -B 'aw:@*:#{window_id}'" +send 'new-window -n window-test' +wait_tmux subs:window-test || exit 1 +set -- $(window_fields subs:window-test) +awid=$1 +awidx=$2 +wait_for "%subscription-changed aw $sid $awid $awidx - : $awid" || exit 1 + +send "refresh-client -B 'dup::#{session_windows}'" +wcount=$($TMUX display-message -p -t subs '#{session_windows}') +wait_for "%subscription-changed dup $sid - - - : $wcount" || exit 1 +send "refresh-client -B 'dup::#{session_name}'" +wait_for "%subscription-changed dup $sid - - - : subs" || exit 1 +send 'new-window -n dup-test' +wait_tmux subs:dup-test || exit 1 +wcount=$($TMUX display-message -p -t subs '#{session_windows}') +reject_for "%subscription-changed dup $sid - - - : $wcount" || exit 1 + +send "refresh-client -B 'missing-pane:%999999:#{pane_id}'" +send "refresh-client -B 'missing-window:@999999:#{window_id}'" +reject_for '%subscription-changed missing-pane' || exit 1 +reject_for '%subscription-changed missing-window' || exit 1 + +exit 0