From f5c4998db33f43277dba6d19e8d3dbe7dc844fd5 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 21 Sep 2026 22:00:47 +0100 Subject: [PATCH] Make regress parallel friendly. --- .github/workflows/regress.yml | 4 +-- regress/Makefile | 43 +++++++++++++----------- regress/control-client-exit-stalled.sh | 2 +- regress/control-client-exit.sh | 2 +- regress/control-client-run-shell-exit.sh | 2 +- regress/control-client-wait-exit.sh | 2 +- regress/hooks-lifecycle.sh | 12 +++---- regress/respawn-pane-control-lag.sh | 2 +- 8 files changed, 36 insertions(+), 33 deletions(-) diff --git a/.github/workflows/regress.yml b/.github/workflows/regress.yml index b1e19e9e0..41f74f1c7 100644 --- a/.github/workflows/regress.yml +++ b/.github/workflows/regress.yml @@ -72,14 +72,14 @@ jobs: - name: build run: | - sh autogen.sh + sh autogen.sh ./configure ${{ matrix.configure }} ${{ matrix.make }} -j"$(getconf _NPROCESSORS_ONLN)" - name: test run: | cd regress - ${{ matrix.make }} + ${{ matrix.make }} -j"$(getconf _NPROCESSORS_ONLN)" - name: logs if: failure() diff --git a/regress/Makefile b/regress/Makefile index 7a4387bd3..18518d274 100644 --- a/regress/Makefile +++ b/regress/Makefile @@ -1,33 +1,17 @@ TESTS!= echo *.sh LOGDIR=logs -.PHONY: all -.NOTPARALLEL: all +.PHONY: all prepare $(TESTS) -all: - @mkdir -p "$(LOGDIR)"; \ - rm -f "$(LOGDIR)"/*.log; \ - failed=0; failures=; \ +all: prepare $(TESTS) + @failed=0; failures=; \ for test in $(TESTS); do \ base=$${test##*/}; \ log="$(LOGDIR)/$${base%.sh}.log"; \ - rm -f "$$log"; \ - printf '%-40s ' "$$test"; \ - start=$$(date +%s); \ - env -i LC_CTYPE=C.UTF-8 MallocNanoZone=0 \ - sh -x "$$test" >"$$log" 2>&1; \ - if [ $$? -eq 0 ]; then \ - end=$$(date +%s); \ - rm -f "$$log"; \ - echo "PASS ($$((end - start))s)"; \ - else \ - end=$$(date +%s); \ - echo "FAIL ($$((end - start))s)"; \ - echo " log: $$log"; \ + if [ -f "$$log" ]; then \ failed=1; \ failures="$$failures $$test"; \ fi; \ - sleep 1; \ done; \ if [ "$$failed" -ne 0 ]; then \ echo; \ @@ -39,3 +23,22 @@ all: rmdir "$(LOGDIR)" 2>/dev/null || true; \ fi; \ exit $$failed + +prepare: + @mkdir -p "$(LOGDIR)" + @rm -f "$(LOGDIR)"/*.log + +$(TESTS): prepare + @base="$@"; base=$${base##*/}; \ + log="$(LOGDIR)/$${base%.sh}.log"; \ + start=$$(date +%s); \ + if env -i LC_CTYPE=C.UTF-8 MallocNanoZone=0 \ + sh -x "$@" >"$$log" 2>&1; then \ + end=$$(date +%s); \ + rm -f "$$log"; \ + printf '%-40s PASS (%ss)\n' "$@" "$$((end - start))"; \ + else \ + end=$$(date +%s); \ + printf '%-40s FAIL (%ss)\n log: %s\n' \ + "$@" "$$((end - start))" "$$log"; \ + fi diff --git a/regress/control-client-exit-stalled.sh b/regress/control-client-exit-stalled.sh index 431fd66d8..1574c821f 100644 --- a/regress/control-client-exit-stalled.sh +++ b/regress/control-client-exit-stalled.sh @@ -17,7 +17,7 @@ PATH=/bin:/usr/bin TERM=screen [ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) -TMUX="$TEST_TMUX -Ltest" +TMUX="$TEST_TMUX -Ltest$$" $TMUX kill-server 2>/dev/null DIR=$(mktemp -d) diff --git a/regress/control-client-exit.sh b/regress/control-client-exit.sh index ac08db5cc..d615dec48 100644 --- a/regress/control-client-exit.sh +++ b/regress/control-client-exit.sh @@ -19,7 +19,7 @@ PATH=/bin:/usr/bin TERM=screen [ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) -TMUX="$TEST_TMUX -Ltest" +TMUX="$TEST_TMUX -Ltest$$" $TMUX kill-server 2>/dev/null DIR=$(mktemp -d) diff --git a/regress/control-client-run-shell-exit.sh b/regress/control-client-run-shell-exit.sh index e8acc0419..e93dff20a 100644 --- a/regress/control-client-run-shell-exit.sh +++ b/regress/control-client-run-shell-exit.sh @@ -10,7 +10,7 @@ PATH=/bin:/usr/bin TERM=screen [ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) -TMUX="$TEST_TMUX -Ltest" +TMUX="$TEST_TMUX -Ltest$$" $TMUX kill-server 2>/dev/null OUT=$(mktemp) diff --git a/regress/control-client-wait-exit.sh b/regress/control-client-wait-exit.sh index 63739b284..26fe0ac76 100644 --- a/regress/control-client-wait-exit.sh +++ b/regress/control-client-wait-exit.sh @@ -10,7 +10,7 @@ PATH=/bin:/usr/bin TERM=screen [ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) -TMUX="$TEST_TMUX -Ltest" +TMUX="$TEST_TMUX -Ltest$$" $TMUX kill-server 2>/dev/null FIFO=$(mktemp -u) diff --git a/regress/hooks-lifecycle.sh b/regress/hooks-lifecycle.sh index 3ec748ff4..8c8a41363 100644 --- a/regress/hooks-lifecycle.sh +++ b/regress/hooks-lifecycle.sh @@ -76,14 +76,14 @@ $TMUX set-hook -g session-closed \ fail "set-hook session-closed failed" # The only pane of the only window of a session exits: pane-exited, then -# window-unlinked, then session-closed, each seeing the dead object in the +# session-closed, then window-unlinked, each seeing the dead object in the # hook formats. pane=$($TMUX new -d -s doomed -n dwin -P -F '#{pane_id}' 'true') || fail "new-session doomed failed" wait_for @log \ - "|pane-exited:$pane|window-unlinked:doomed:dwin|session-closed:doomed" + "|pane-exited:$pane|session-closed:doomed|window-unlinked:doomed:dwin" assert_unchanged @log \ - "|pane-exited:$pane|window-unlinked:doomed:dwin|session-closed:doomed" + "|pane-exited:$pane|session-closed:doomed|window-unlinked:doomed:dwin" # The dead pane, window and session cannot be used as targets but the # server survives. @@ -110,14 +110,14 @@ $TMUX set-hook -g pane-exited \ 'set -gF @log "#{@log}|pane-exited:#{hook_pane}"' || fail "restore pane-exited hook failed" -# kill-window on the last window: window-unlinked then session-closed but +# kill-window on the last window: session-closed then window-unlinked but # no pane-exited for the panes in the killed window. $TMUX set -g @log '' || fail "reset @log failed" $TMUX new -d -s doomed2 -n dwin2 || fail "new-session doomed2 failed" $TMUX splitw -d -t doomed2:0 || fail "split-window doomed2 failed" $TMUX kill-window -t doomed2:0 || fail "kill-window failed" -wait_for @log '|window-unlinked:doomed2:dwin2|session-closed:doomed2' -assert_unchanged @log '|window-unlinked:doomed2:dwin2|session-closed:doomed2' +wait_for @log '|session-closed:doomed2|window-unlinked:doomed2:dwin2' +assert_unchanged @log '|session-closed:doomed2|window-unlinked:doomed2:dwin2' $TMUX has -t main || fail "server died after kill-window chain" # kill-session: session-closed fires first, then window-unlinked for its diff --git a/regress/respawn-pane-control-lag.sh b/regress/respawn-pane-control-lag.sh index b71ce1946..8ca8146ed 100644 --- a/regress/respawn-pane-control-lag.sh +++ b/regress/respawn-pane-control-lag.sh @@ -15,7 +15,7 @@ PATH=/bin:/usr/bin TERM=screen [ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) -TMUX="$TEST_TMUX -Ltest" +TMUX="$TEST_TMUX -Ltest$$" $TMUX kill-server 2>/dev/null DIR=$(mktemp -d)