From 7c8344930bd536c919dbfa3ccaf1c506fb9bd31a Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 15 Jun 2026 22:47:39 +0100 Subject: [PATCH] Add a test for names. --- regress/check-names.sh | 140 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 regress/check-names.sh diff --git a/regress/check-names.sh b/regress/check-names.sh new file mode 100644 index 00000000..104ff01b --- /dev/null +++ b/regress/check-names.sh @@ -0,0 +1,140 @@ +#!/bin/sh + +# Name validation policy. + +PATH=/bin:/usr/bin +TERM=screen + +[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) +TMUX="$TEST_TMUX -Ltest -f/dev/null" +$TMUX kill-server 2>/dev/null + +fail() +{ + echo "$*" + $TMUX kill-server 2>/dev/null + exit 1 +} + +must_fail() +{ + "$@" >/dev/null 2>&1 && fail "unexpected success: $*" + return 0 +} + +must_equal() +{ + got=$1 + want=$2 + + [ "$got" = "$want" ] || fail "got '$got', expected '$want'" +} + +$TMUX new-session -d -x 80 -y 24 || exit 1 +$TMUX set-option -qg allow-set-title on || exit 1 +$TMUX set-option -qg allow-rename on || exit 1 +$TMUX set-option -qg automatic-rename off || exit 1 + +# Commands reject ':' and '.' for sessions and windows, but allow '#'. +$TMUX rename-session 'session#ok' || fail "session name with # rejected" +must_equal "$($TMUX display-message -p '#{session_name}')" 'session#ok' +must_fail $TMUX rename-session 'session:bad' +must_fail $TMUX rename-session 'session.bad' + +$TMUX rename-window 'window#ok' || fail "window name with # rejected" +must_equal "$($TMUX display-message -p '#{window_name}')" 'window#ok' +must_fail $TMUX rename-window 'window:bad' +must_fail $TMUX rename-window 'window.bad' + +$TMUX set-option -q @name 'format#ok' || exit 1 +$TMUX rename-session '#{@name}' || fail "format in session name not expanded" +must_equal "$($TMUX display-message -p '#{session_name}')" 'format#ok' +$TMUX rename-window '#{@name}' || fail "format in window name not expanded" +must_equal "$($TMUX display-message -p '#{window_name}')" 'format#ok' +must_fail $TMUX rename-session '#{session_name}:bad' +must_fail $TMUX rename-window '#{window_name}.bad' +pid=$($TMUX display-message -p '#{pid}') + +created=$($TMUX new-session -dP -F '#{session_id}:#{window_id}' \ + -s 'new-session#ok' -n 'new-window#ok') || \ + fail "new-session name with # rejected" +created_session=${created%:*} +created_window=${created#*:} +must_equal "$($TMUX display-message -pt "$created_session" '#{session_name}')" \ + 'new-session#ok' +must_equal "$($TMUX display-message -pt "$created_window" '#{window_name}')" \ + 'new-window#ok' +$TMUX kill-session -t "$created_session" + +must_fail $TMUX new-session -d -s 'new-session:bad' +must_fail $TMUX new-session -d -s 'new-session.bad' +must_fail $TMUX new-session -d -n 'new-window:bad' +must_fail $TMUX new-session -d -n 'new-window.bad' + +created_window=$($TMUX new-window -dP -F '#{window_id}' \ + -n 'created-window#ok') || \ + fail "new-window name with # rejected" +must_equal "$($TMUX display-message -pt "$created_window" '#{window_name}')" \ + 'created-window#ok' +must_fail $TMUX new-window -d -n 'created-window:bad' +must_fail $TMUX new-window -d -n 'created-window.bad' + +created=$($TMUX new-session -dP -F '#{session_id}:#{window_id}' \ + -s 'new-session-#{pid}' -n 'new-window-#{pid}') || \ + fail "format in new-session name not expanded" +created_session=${created%:*} +created_window=${created#*:} +must_equal "$($TMUX display-message -pt "$created_session" '#{session_name}')" \ + "new-session-$pid" +must_equal "$($TMUX display-message -pt "$created_window" '#{window_name}')" \ + "new-window-$pid" +$TMUX kill-session -t "$created_session" + +created_window=$($TMUX new-window -dP -F '#{window_id}' -n '#{@name}') || \ + fail "format in new-window name not expanded" +must_equal "$($TMUX display-message -pt "$created_window" '#{window_name}')" \ + 'format#ok' +must_fail $TMUX new-session -d -s 'new-session-#{pid}:bad' +must_fail $TMUX new-session -d -n 'new-window-#{pid}.bad' +must_fail $TMUX new-window -d -n '#{window_name}:bad' + +# Invalid UTF-8 is never allowed for command names. +invalid=$(printf '\302') +must_fail $TMUX rename-session "bad${invalid}name" +must_fail $TMUX rename-window "bad${invalid}name" +must_fail $TMUX new-session -d -s "bad${invalid}name" +must_fail $TMUX new-session -d -n "bad${invalid}name" +must_fail $TMUX new-window -d -n "bad${invalid}name" +must_fail $TMUX set-buffer -b "bad${invalid}name" data + +# Titles set by commands allow '#', ':' and '.'. +$TMUX select-pane -T 'title#:.ok' || fail "command title rejected" +must_equal "$($TMUX display-message -p '#{pane_title}')" 'title#:.ok' + +# Buffer names allow '#', ':' and '.'. +$TMUX set-buffer -b 'buffer#:.ok' data || fail "buffer name rejected" +must_equal "$($TMUX list-buffers -F '#{buffer_name}')" 'buffer#:.ok' + +# Window names from escape sequences reject '#', ':' and '.' by cleaning them. +$TMUX send-keys "printf '\\033kescape#:.ok\\033\\\\'" Enter || exit 1 +sleep 1 +must_equal "$($TMUX display-message -p '#{window_name}')" 'escape___ok' + +# Titles from escape sequences reject only '#'. +$TMUX send-keys "printf '\\033]2;escape#:.ok\\007'" Enter || exit 1 +sleep 1 +must_equal "$($TMUX display-message -p '#{pane_title}')" 'escape_:.ok' + +# Invalid UTF-8 from escape sequences is ignored. +$TMUX rename-window 'before-invalid' || exit 1 +$TMUX send-keys "printf '\\033kbad\\302name\\033\\\\'" Enter || exit 1 +sleep 1 +must_equal "$($TMUX display-message -p '#{window_name}')" 'before-invalid' + +$TMUX select-pane -T 'before-invalid-title' || exit 1 +$TMUX send-keys "printf '\\033]2;bad\\302title\\007'" Enter || exit 1 +sleep 1 +must_equal "$($TMUX display-message -p '#{pane_title}')" 'before-invalid-title' + +$TMUX kill-server 2>/dev/null +exit 0