Files
next.orly.dev/scripts/test-subscription-stability.sh
mleku 581e0ec588
Some checks failed
Go / build (push) Has been cancelled
Go / release (push) Has been cancelled
Implement comprehensive WebSocket subscription stability fixes
- Resolved critical issues causing subscriptions to drop after 30-60 seconds due to unconsumed receiver channels.
- Introduced per-subscription consumer goroutines to ensure continuous event delivery and prevent channel overflow.
- Enhanced REQ parsing to handle both wrapped and unwrapped filter arrays, eliminating EOF errors.
- Updated publisher logic to correctly send events to receiver channels, ensuring proper event delivery to subscribers.
- Added extensive documentation and testing tools to verify subscription stability and performance.
- Bumped version to v0.26.2 to reflect these significant improvements.
2025-11-06 18:21:00 +00:00

167 lines
4.4 KiB
Bash
Executable File

#!/bin/bash
# Test script for verifying subscription stability fixes
set -e
RELAY_URL="${RELAY_URL:-ws://localhost:3334}"
TEST_DURATION="${TEST_DURATION:-60}" # seconds
EVENT_INTERVAL="${EVENT_INTERVAL:-2}" # seconds between events
echo "==================================="
echo "Subscription Stability Test"
echo "==================================="
echo "Relay URL: $RELAY_URL"
echo "Test duration: ${TEST_DURATION}s"
echo "Event interval: ${EVENT_INTERVAL}s"
echo ""
# Check if websocat is installed
if ! command -v websocat &> /dev/null; then
echo "ERROR: websocat is not installed"
echo "Install with: cargo install websocat"
exit 1
fi
# Check if jq is installed
if ! command -v jq &> /dev/null; then
echo "ERROR: jq is not installed"
echo "Install with: sudo apt install jq"
exit 1
fi
# Temporary files for communication
FIFO_IN=$(mktemp -u)
FIFO_OUT=$(mktemp -u)
mkfifo "$FIFO_IN"
mkfifo "$FIFO_OUT"
# Cleanup on exit
cleanup() {
echo ""
echo "Cleaning up..."
rm -f "$FIFO_IN" "$FIFO_OUT"
kill $WS_PID 2>/dev/null || true
kill $READER_PID 2>/dev/null || true
kill $PUBLISHER_PID 2>/dev/null || true
}
trap cleanup EXIT INT TERM
echo "Step 1: Connecting to relay..."
# Start WebSocket connection
websocat "$RELAY_URL" < "$FIFO_IN" > "$FIFO_OUT" &
WS_PID=$!
# Wait for connection
sleep 1
if ! kill -0 $WS_PID 2>/dev/null; then
echo "ERROR: Failed to connect to relay at $RELAY_URL"
exit 1
fi
echo "✓ Connected to relay"
echo ""
echo "Step 2: Creating subscription..."
# Send REQ message
SUB_ID="stability-test-$(date +%s)"
REQ_MSG='["REQ","'$SUB_ID'",{"kinds":[1]}]'
echo "$REQ_MSG" > "$FIFO_IN"
echo "✓ Sent REQ for subscription: $SUB_ID"
echo ""
# Variables for tracking
RECEIVED_COUNT=0
PUBLISHED_COUNT=0
EOSE_RECEIVED=0
echo "Step 3: Waiting for EOSE..."
# Read messages and count events
(
while IFS= read -r line; do
echo "[RECV] $line"
# Check for EOSE
if echo "$line" | jq -e '. | select(.[0] == "EOSE" and .[1] == "'$SUB_ID'")' > /dev/null 2>&1; then
EOSE_RECEIVED=1
echo "✓ Received EOSE"
break
fi
done < "$FIFO_OUT"
) &
READER_PID=$!
# Wait up to 10 seconds for EOSE
for i in {1..10}; do
if [ $EOSE_RECEIVED -eq 1 ]; then
break
fi
sleep 1
done
echo ""
echo "Step 4: Starting long-running test..."
echo "Publishing events every ${EVENT_INTERVAL}s for ${TEST_DURATION}s..."
echo ""
# Start event counter
(
while IFS= read -r line; do
# Count EVENT messages for our subscription
if echo "$line" | jq -e '. | select(.[0] == "EVENT" and .[1] == "'$SUB_ID'")' > /dev/null 2>&1; then
RECEIVED_COUNT=$((RECEIVED_COUNT + 1))
EVENT_ID=$(echo "$line" | jq -r '.[2].id' 2>/dev/null || echo "unknown")
echo "[$(date +%H:%M:%S)] EVENT received #$RECEIVED_COUNT (id: ${EVENT_ID:0:8}...)"
fi
done < "$FIFO_OUT"
) &
READER_PID=$!
# Publish events
START_TIME=$(date +%s)
END_TIME=$((START_TIME + TEST_DURATION))
while [ $(date +%s) -lt $END_TIME ]; do
PUBLISHED_COUNT=$((PUBLISHED_COUNT + 1))
# Create and publish event (you'll need to implement this part)
# This is a placeholder - replace with actual event publishing
EVENT_JSON='["EVENT",{"kind":1,"content":"Test event '$PUBLISHED_COUNT' for stability test","created_at":'$(date +%s)',"tags":[],"pubkey":"0000000000000000000000000000000000000000000000000000000000000000","id":"0000000000000000000000000000000000000000000000000000000000000000","sig":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}]'
echo "[$(date +%H:%M:%S)] Publishing event #$PUBLISHED_COUNT"
# Sleep before next event
sleep "$EVENT_INTERVAL"
done
echo ""
echo "==================================="
echo "Test Complete"
echo "==================================="
echo "Duration: ${TEST_DURATION}s"
echo "Events published: $PUBLISHED_COUNT"
echo "Events received: $RECEIVED_COUNT"
echo ""
# Calculate success rate
if [ $PUBLISHED_COUNT -gt 0 ]; then
SUCCESS_RATE=$((RECEIVED_COUNT * 100 / PUBLISHED_COUNT))
echo "Success rate: ${SUCCESS_RATE}%"
echo ""
if [ $SUCCESS_RATE -ge 90 ]; then
echo "✓ TEST PASSED - Subscription remained stable"
exit 0
else
echo "✗ TEST FAILED - Subscription dropped events"
exit 1
fi
else
echo "✗ TEST FAILED - No events published"
exit 1
fi