Files
techircd/test_stress.sh

139 lines
3.6 KiB
Bash

#!/bin/bash
# TechIRCd Stability Stress Test
echo "=== TechIRCd Stability Stress Test ==="
echo "This test simulates conditions that previously caused freezing"
echo
# Start the server
echo "Starting TechIRCd..."
./techircd start &
SERVER_PID=$!
echo "Server started with PID: $SERVER_PID"
echo "Waiting 3 seconds for server to initialize..."
sleep 3
# Function to create a client connection
create_client() {
local client_id=$1
local duration=$2
timeout ${duration}s bash -c "
exec 3<>/dev/tcp/localhost/6667
echo 'NICK TestUser$client_id' >&3
echo 'USER testuser$client_id 0 * :Test User $client_id' >&3
sleep 2
echo 'JOIN #test' >&3
# Send periodic messages to keep connection alive
for i in {1..20}; do
echo 'PING :client$client_id' >&3
sleep 1
echo 'PRIVMSG #test :Message \$i from client $client_id' >&3
sleep 1
done
echo 'QUIT :Test complete' >&3
exec 3<&-
exec 3>&-
" 2>/dev/null &
}
# Function to create unstable client (connects and disconnects quickly)
create_unstable_client() {
local client_id=$1
timeout 5s bash -c "
exec 3<>/dev/tcp/localhost/6667
echo 'NICK Unstable$client_id' >&3
echo 'USER unstable$client_id 0 * :Unstable User $client_id' >&3
sleep 1
# Abruptly close connection without QUIT
exec 3<&-
exec 3>&-
" 2>/dev/null &
}
echo "Phase 1: Testing multiple stable connections..."
# Create 10 stable clients
for i in {1..10}; do
create_client $i 30
echo -n "."
sleep 0.5
done
echo " (10 stable clients created)"
echo "Phase 2: Testing unstable connections (simulating network issues)..."
# Create 20 unstable clients that disconnect abruptly
for i in {1..20}; do
create_unstable_client $i
echo -n "."
sleep 0.2
done
echo " (20 unstable clients created)"
echo "Phase 3: Testing rapid connection attempts..."
# Create many short-lived connections
for i in {1..30}; do
timeout 2s bash -c "
exec 3<>/dev/tcp/localhost/6667
echo 'NICK Rapid$i' >&3
exec 3<&-
exec 3>&-
" 2>/dev/null &
sleep 0.1
done
echo "30 rapid connections created"
echo
echo "Monitoring server health for 45 seconds..."
echo "Press Ctrl+C to interrupt test early"
# Monitor server for 45 seconds
for i in {1..45}; do
if ! kill -0 $SERVER_PID 2>/dev/null; then
echo "❌ Server died during stress test!"
echo "=== Stress Test Failed ==="
exit 1
fi
# Test server responsiveness every 10 seconds
if [ $((i % 10)) -eq 0 ]; then
echo "Testing server responsiveness at ${i}s..."
timeout 3s bash -c '
exec 3<>/dev/tcp/localhost/6667
echo "NICK HealthCheck$RANDOM" >&3
echo "USER healthcheck 0 * :Health Check" >&3
sleep 1
echo "QUIT :Health check complete" >&3
exec 3<&-
exec 3>&-
' 2>/dev/null && echo "✅ Server responsive" || echo "⚠️ Server response slow/failed"
fi
echo -n "."
sleep 1
done
echo
echo "✅ Server survived 45-second stress test!"
echo "Testing graceful shutdown after stress..."
kill -TERM $SERVER_PID
# Wait for shutdown
TIMEOUT=15
for i in $(seq 1 $TIMEOUT); do
if ! kill -0 $SERVER_PID 2>/dev/null; then
echo "✅ Server shut down gracefully after stress test"
echo "=== Stress Test Passed ==="
exit 0
fi
sleep 1
done
echo "⚠️ Server did not shut down gracefully, forcing..."
kill -9 $SERVER_PID 2>/dev/null
echo "=== Stress Test Completed with Warning ==="