test-subscription-stability.sh raw
1 #!/bin/bash
2 # Test script for verifying subscription stability fixes
3
4 set -e
5
6 RELAY_URL="${RELAY_URL:-ws://localhost:3334}"
7 TEST_DURATION="${TEST_DURATION:-60}" # seconds
8 EVENT_INTERVAL="${EVENT_INTERVAL:-2}" # seconds between events
9
10 echo "==================================="
11 echo "Subscription Stability Test"
12 echo "==================================="
13 echo "Relay URL: $RELAY_URL"
14 echo "Test duration: ${TEST_DURATION}s"
15 echo "Event interval: ${EVENT_INTERVAL}s"
16 echo ""
17
18 # Check if websocat is installed
19 if ! command -v websocat &> /dev/null; then
20 echo "ERROR: websocat is not installed"
21 echo "Install with: cargo install websocat"
22 exit 1
23 fi
24
25 # Check if jq is installed
26 if ! command -v jq &> /dev/null; then
27 echo "ERROR: jq is not installed"
28 echo "Install with: sudo apt install jq"
29 exit 1
30 fi
31
32 # Temporary files for communication
33 FIFO_IN=$(mktemp -u)
34 FIFO_OUT=$(mktemp -u)
35 mkfifo "$FIFO_IN"
36 mkfifo "$FIFO_OUT"
37
38 # Cleanup on exit
39 cleanup() {
40 echo ""
41 echo "Cleaning up..."
42 rm -f "$FIFO_IN" "$FIFO_OUT"
43 kill $WS_PID 2>/dev/null || true
44 kill $READER_PID 2>/dev/null || true
45 kill $PUBLISHER_PID 2>/dev/null || true
46 }
47 trap cleanup EXIT INT TERM
48
49 echo "Step 1: Connecting to relay..."
50
51 # Start WebSocket connection
52 websocat "$RELAY_URL" < "$FIFO_IN" > "$FIFO_OUT" &
53 WS_PID=$!
54
55 # Wait for connection
56 sleep 1
57
58 if ! kill -0 $WS_PID 2>/dev/null; then
59 echo "ERROR: Failed to connect to relay at $RELAY_URL"
60 exit 1
61 fi
62
63 echo "✓ Connected to relay"
64 echo ""
65
66 echo "Step 2: Creating subscription..."
67
68 # Send REQ message
69 SUB_ID="stability-test-$(date +%s)"
70 REQ_MSG='["REQ","'$SUB_ID'",{"kinds":[1]}]'
71 echo "$REQ_MSG" > "$FIFO_IN"
72
73 echo "✓ Sent REQ for subscription: $SUB_ID"
74 echo ""
75
76 # Variables for tracking
77 RECEIVED_COUNT=0
78 PUBLISHED_COUNT=0
79 EOSE_RECEIVED=0
80
81 echo "Step 3: Waiting for EOSE..."
82
83 # Read messages and count events
84 (
85 while IFS= read -r line; do
86 echo "[RECV] $line"
87
88 # Check for EOSE
89 if echo "$line" | jq -e '. | select(.[0] == "EOSE" and .[1] == "'$SUB_ID'")' > /dev/null 2>&1; then
90 EOSE_RECEIVED=1
91 echo "✓ Received EOSE"
92 break
93 fi
94 done < "$FIFO_OUT"
95 ) &
96 READER_PID=$!
97
98 # Wait up to 10 seconds for EOSE
99 for i in {1..10}; do
100 if [ $EOSE_RECEIVED -eq 1 ]; then
101 break
102 fi
103 sleep 1
104 done
105
106 echo ""
107 echo "Step 4: Starting long-running test..."
108 echo "Publishing events every ${EVENT_INTERVAL}s for ${TEST_DURATION}s..."
109 echo ""
110
111 # Start event counter
112 (
113 while IFS= read -r line; do
114 # Count EVENT messages for our subscription
115 if echo "$line" | jq -e '. | select(.[0] == "EVENT" and .[1] == "'$SUB_ID'")' > /dev/null 2>&1; then
116 RECEIVED_COUNT=$((RECEIVED_COUNT + 1))
117 EVENT_ID=$(echo "$line" | jq -r '.[2].id' 2>/dev/null || echo "unknown")
118 echo "[$(date +%H:%M:%S)] EVENT received #$RECEIVED_COUNT (id: ${EVENT_ID:0:8}...)"
119 fi
120 done < "$FIFO_OUT"
121 ) &
122 READER_PID=$!
123
124 # Publish events
125 START_TIME=$(date +%s)
126 END_TIME=$((START_TIME + TEST_DURATION))
127
128 while [ $(date +%s) -lt $END_TIME ]; do
129 PUBLISHED_COUNT=$((PUBLISHED_COUNT + 1))
130
131 # Create and publish event (you'll need to implement this part)
132 # This is a placeholder - replace with actual event publishing
133 EVENT_JSON='["EVENT",{"kind":1,"content":"Test event '$PUBLISHED_COUNT' for stability test","created_at":'$(date +%s)',"tags":[],"pubkey":"0000000000000000000000000000000000000000000000000000000000000000","id":"0000000000000000000000000000000000000000000000000000000000000000","sig":"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}]'
134
135 echo "[$(date +%H:%M:%S)] Publishing event #$PUBLISHED_COUNT"
136
137 # Sleep before next event
138 sleep "$EVENT_INTERVAL"
139 done
140
141 echo ""
142 echo "==================================="
143 echo "Test Complete"
144 echo "==================================="
145 echo "Duration: ${TEST_DURATION}s"
146 echo "Events published: $PUBLISHED_COUNT"
147 echo "Events received: $RECEIVED_COUNT"
148 echo ""
149
150 # Calculate success rate
151 if [ $PUBLISHED_COUNT -gt 0 ]; then
152 SUCCESS_RATE=$((RECEIVED_COUNT * 100 / PUBLISHED_COUNT))
153 echo "Success rate: ${SUCCESS_RATE}%"
154 echo ""
155
156 if [ $SUCCESS_RATE -ge 90 ]; then
157 echo "✓ TEST PASSED - Subscription remained stable"
158 exit 0
159 else
160 echo "✗ TEST FAILED - Subscription dropped events"
161 exit 1
162 fi
163 else
164 echo "✗ TEST FAILED - No events published"
165 exit 1
166 fi
167