From 3bad23e9a90cf41451c34d21caa535749c2e6778 Mon Sep 17 00:00:00 2001 From: m1ngsama Date: Tue, 30 Jun 2026 14:12:46 +0800 Subject: [PATCH] ci: harden remaining integration tests against connection races PR #63 fixed test_exec_mode.sh; apply the same hardening to the other integration tests that launch a server and open SSH connections in quick succession (test_basic, test_module_runtime, test_anonymous_access, test_interactive_input, test_mute_joins_view, test_empty_view): - launch the test server with TNT_MAX_CONN_PER_IP=256 TNT_MAX_CONNECTIONS=256 so rapid localhost connections never transiently exceed the default per-IP cap (5) on slow CI runners (the macOS/loaded-ubuntu flake root cause), and - add ssh ConnectionAttempts=3 / ConnectTimeout=15 so a dropped identification handshake is retried rather than failing an assertion. test_user_lifecycle.sh already sets a high per-IP cap; test_tntctl_cli.sh uses a fake ssh (no real server); test_connection_limits.sh intentionally exercises the caps -- all left unchanged. Also bump the version in the MODULE_PROTOCOL.md handshake example to 1.2.0. Verified: integration + anonymous-access suites pass locally. --- docs/MODULE_PROTOCOL.md | 2 +- tests/test_anonymous_access.sh | 4 ++-- tests/test_basic.sh | 8 +++++--- tests/test_empty_view.sh | 4 ++-- tests/test_interactive_input.sh | 4 ++-- tests/test_module_runtime.sh | 8 ++++---- tests/test_mute_joins_view.sh | 4 ++-- 7 files changed, 18 insertions(+), 16 deletions(-) diff --git a/docs/MODULE_PROTOCOL.md b/docs/MODULE_PROTOCOL.md index a98e85c..351e3ca 100644 --- a/docs/MODULE_PROTOCOL.md +++ b/docs/MODULE_PROTOCOL.md @@ -89,7 +89,7 @@ Optional compatibility fields: TNT starts a module process and writes a handshake event: ```json -{"type":"handshake","protocol":"tnt.module.v1","server":{"name":"tnt","version":"1.1.0"}} +{"type":"handshake","protocol":"tnt.module.v1","server":{"name":"tnt","version":"1.2.0"}} ``` The module should answer: diff --git a/tests/test_anonymous_access.sh b/tests/test_anonymous_access.sh index 7345196..cb23e1c 100755 --- a/tests/test_anonymous_access.sh +++ b/tests/test_anonymous_access.sh @@ -23,7 +23,7 @@ if [ ! -f "$BIN" ]; then exit 1 fi -SSH_BASE="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PubkeyAuthentication=no -p $PORT" +SSH_BASE="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PubkeyAuthentication=no -o ConnectionAttempts=3 -o ConnectTimeout=15 -p $PORT" wait_for_health() { local out @@ -76,7 +76,7 @@ EOF echo "=== TNT Anonymous Access Tests ===" -TNT_LANG=zh TNT_RATE_LIMIT=0 "$BIN" -p "$PORT" -d "$STATE_DIR" \ +TNT_LANG=zh TNT_RATE_LIMIT=0 TNT_MAX_CONN_PER_IP=256 TNT_MAX_CONNECTIONS=256 "$BIN" -p "$PORT" -d "$STATE_DIR" \ >"$STATE_DIR/server.log" 2>&1 & SERVER_PID=$! diff --git a/tests/test_basic.sh b/tests/test_basic.sh index 49dfe7c..ac1f924 100755 --- a/tests/test_basic.sh +++ b/tests/test_basic.sh @@ -8,7 +8,7 @@ FAIL=0 BIN="../tnt" SERVER_PID="" STATE_DIR=$(mktemp -d "${TMPDIR:-/tmp}/tnt-basic-test.XXXXXX") -SSH_HEALTH_OPTS="-n -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes -p $PORT" +SSH_HEALTH_OPTS="-n -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes -o ConnectionAttempts=3 -o ConnectTimeout=15 -p $PORT" cleanup() { if [ -n "$SERVER_PID" ]; then @@ -45,8 +45,10 @@ if ! command -v expect >/dev/null 2>&1; then exit 0 fi -# Start server -"$BIN" -p "$PORT" -d "$STATE_DIR" >"$STATE_DIR/server.log" 2>&1 & +# Start server. High per-IP/global caps so the suite's rapid SSH connections +# do not transiently exceed the default per-IP limit on slow CI runners. +TNT_MAX_CONN_PER_IP=256 TNT_MAX_CONNECTIONS=256 \ + "$BIN" -p "$PORT" -d "$STATE_DIR" >"$STATE_DIR/server.log" 2>&1 & SERVER_PID=$! # Test 1: Server started and accepts exec health checks diff --git a/tests/test_empty_view.sh b/tests/test_empty_view.sh index a247d65..a374d73 100755 --- a/tests/test_empty_view.sh +++ b/tests/test_empty_view.sh @@ -28,11 +28,11 @@ if [ ! -f "$BIN" ]; then exit 1 fi -SSH_OPTS="-e none -tt -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR -p $PORT" +SSH_OPTS="-e none -tt -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR -o ConnectionAttempts=3 -o ConnectTimeout=15 -p $PORT" echo "=== TNT Empty View Test ===" -TNT_LANG=en TNT_RATE_LIMIT=0 "$BIN" --bind 127.0.0.1 \ +TNT_LANG=en TNT_RATE_LIMIT=0 TNT_MAX_CONN_PER_IP=256 TNT_MAX_CONNECTIONS=256 "$BIN" --bind 127.0.0.1 \ -p "$PORT" -d "$STATE_DIR" >"$STATE_DIR/server.log" 2>&1 & SERVER_PID=$! diff --git a/tests/test_interactive_input.sh b/tests/test_interactive_input.sh index 5328b0a..5a01917 100755 --- a/tests/test_interactive_input.sh +++ b/tests/test_interactive_input.sh @@ -28,11 +28,11 @@ if [ ! -f "$BIN" ]; then exit 1 fi -SSH_OPTS="-e none -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR -p $PORT" +SSH_OPTS="-e none -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR -o ConnectionAttempts=3 -o ConnectTimeout=15 -p $PORT" echo "=== TNT Interactive Input Tests ===" -TNT_LANG=zh TNT_RATE_LIMIT=0 "$BIN" -p "$PORT" -d "$STATE_DIR" >"$STATE_DIR/server.log" 2>&1 & +TNT_LANG=zh TNT_RATE_LIMIT=0 TNT_MAX_CONN_PER_IP=256 TNT_MAX_CONNECTIONS=256 "$BIN" -p "$PORT" -d "$STATE_DIR" >"$STATE_DIR/server.log" 2>&1 & SERVER_PID=$! SERVER_READY=0 diff --git a/tests/test_module_runtime.sh b/tests/test_module_runtime.sh index 6873382..c33235e 100755 --- a/tests/test_module_runtime.sh +++ b/tests/test_module_runtime.sh @@ -31,7 +31,7 @@ if [ ! -f "$BIN" ]; then exit 1 fi -SSH_OPTS="-n -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes -p $PORT" +SSH_OPTS="-n -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes -o ConnectionAttempts=3 -o ConnectTimeout=15 -p $PORT" mkdir -p "$MODULE_DIR" cat >"$MODULE_DIR/tnt-module.json" <<'JSON' @@ -142,7 +142,7 @@ chmod +x "$INVALID_MODULE_DIR/invalid-module.sh" echo "=== TNT Module Runtime Tests ===" TNT_LANG=en TNT_RATE_LIMIT=0 TNT_MODULE_PATHS="$MODULE_DIR" \ - "$BIN" -p "$PORT" -d "$STATE_DIR" >"$STATE_DIR/server.log" 2>&1 & + TNT_MAX_CONN_PER_IP=256 TNT_MAX_CONNECTIONS=256 "$BIN" -p "$PORT" -d "$STATE_DIR" >"$STATE_DIR/server.log" 2>&1 & SERVER_PID=$! HEALTH_OUTPUT="" @@ -198,7 +198,7 @@ fi stop_server TNT_LANG=en TNT_RATE_LIMIT=0 TNT_MODULE_PATHS="$FLOOD_MODULE_DIR" \ - "$BIN" -p "$PORT" -d "$STATE_DIR" >"$STATE_DIR/flood-server.log" 2>&1 & + TNT_MAX_CONN_PER_IP=256 TNT_MAX_CONNECTIONS=256 "$BIN" -p "$PORT" -d "$STATE_DIR" >"$STATE_DIR/flood-server.log" 2>&1 & SERVER_PID=$! HEALTH_OUTPUT="" @@ -268,7 +268,7 @@ fi stop_server TNT_LANG=en TNT_RATE_LIMIT=0 TNT_MODULE_PATHS="$INVALID_MODULE_DIR" \ - "$BIN" -p "$PORT" -d "$STATE_DIR" >"$STATE_DIR/invalid-server.log" 2>&1 & + TNT_MAX_CONN_PER_IP=256 TNT_MAX_CONNECTIONS=256 "$BIN" -p "$PORT" -d "$STATE_DIR" >"$STATE_DIR/invalid-server.log" 2>&1 & SERVER_PID=$! HEALTH_OUTPUT="" diff --git a/tests/test_mute_joins_view.sh b/tests/test_mute_joins_view.sh index 91c0277..2f69772 100755 --- a/tests/test_mute_joins_view.sh +++ b/tests/test_mute_joins_view.sh @@ -28,7 +28,7 @@ if [ ! -f "$BIN" ]; then exit 1 fi -SSH_OPTS="-e none -tt -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR -p $PORT" +SSH_OPTS="-e none -tt -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR -o ConnectionAttempts=3 -o ConnectTimeout=15 -p $PORT" echo "=== TNT Mute Joins View Test ===" @@ -45,7 +45,7 @@ while [ "$i" -le 20 ]; do i=$((i + 1)) done -TNT_LANG=en TNT_RATE_LIMIT=0 "$BIN" --bind 127.0.0.1 \ +TNT_LANG=en TNT_RATE_LIMIT=0 TNT_MAX_CONN_PER_IP=256 TNT_MAX_CONNECTIONS=256 "$BIN" --bind 127.0.0.1 \ -p "$PORT" -d "$STATE_DIR" >"$STATE_DIR/server.log" 2>&1 & SERVER_PID=$!