You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
4.4 KiB
166 lines
4.4 KiB
#!/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
|
|
|