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