- 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.
167 lines
4.4 KiB
Bash
Executable File
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
|