#!/bin/bash # Test SUP-04: Delay and Jitter Verification # Tests: Timing requirements and jitter application set -e TEST_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$TEST_DIR/helpers/timing_utils.sh" source "$TEST_DIR/helpers/event_utils.sh" # Load test configuration KEYS_FILE="$TEST_DIR/fixtures/test_keys.json" RELAYS_FILE="$TEST_DIR/fixtures/test_relays.json" # Extract keys BUILDER_PRIVKEY=$(jq -r '.builder.privkey' "$KEYS_FILE") THROWER_A_PUBKEY=$(jq -r '.thrower_a.pubkey' "$KEYS_FILE") # Extract relays THROWER_RELAY=$(jq -r '.test_scenarios.single_hop.thrower_relay' "$RELAYS_FILE") FINAL_RELAY=$(jq -r '.test_scenarios.single_hop.final_relay' "$RELAYS_FILE") echo "=== SUP-04: Delay and Jitter Test ===" echo "Testing multiple delay values with jitter verification" echo "" # Test different delay values DELAY_VALUES=(0 2 2 2 2) AUDIT_TAG_BASE="test-delays-$(date +%s)" PASSED=0 FAILED=0 for DELAY in "${DELAY_VALUES[@]}"; do echo "----------------------------------------" echo "Test Case: ${DELAY}s delay" echo "----------------------------------------" AUDIT_TAG="${AUDIT_TAG_BASE}-${DELAY}" TEST_CONTENT="Delay test ${DELAY}s at $(date +%s)" # Create and publish event INNER_EVENT=$(create_test_event "$BUILDER_PRIVKEY" "$TEST_CONTENT") INNER_EVENT_ID=$(echo "$INNER_EVENT" | jq -r '.id') ROUTING_PAYLOAD=$(create_routing_payload "$INNER_EVENT" "$FINAL_RELAY" "$DELAY" "null" "$AUDIT_TAG") ENCRYPTED_CONTENT=$(encrypt_payload "$BUILDER_PRIVKEY" "$THROWER_A_PUBKEY" "$ROUTING_PAYLOAD") ROUTING_EVENT=$(create_routing_event "$BUILDER_PRIVKEY" "$THROWER_A_PUBKEY" "$ENCRYPTED_CONTENT") echo "Publishing event with ${DELAY}s delay..." PUBLISH_TIME=$(get_timestamp) publish_event "$ROUTING_EVENT" "$THROWER_RELAY" > /dev/null 2>&1 # Monitor for arrival TIMEOUT=$((DELAY + 30)) FOUND=false START_MONITOR=$(get_timestamp) while [ $(($(get_timestamp) - START_MONITOR)) -lt $TIMEOUT ]; do if query_event "$INNER_EVENT_ID" "$FINAL_RELAY" 2 2>/dev/null | grep -q "$INNER_EVENT_ID"; then ARRIVAL_TIME=$(get_timestamp) FOUND=true break fi sleep 1 done if [ "$FOUND" = false ]; then echo "✗ FAILED: Event not found within ${TIMEOUT}s" ((FAILED++)) echo "" continue fi # Calculate actual delay ACTUAL_DELAY=$((ARRIVAL_TIME - PUBLISH_TIME)) # Verify minimum delay if [ $ACTUAL_DELAY -lt $DELAY ]; then echo "✗ FAILED: Event arrived too early" echo " Expected: >= ${DELAY}s" echo " Actual: ${ACTUAL_DELAY}s" ((FAILED++)) echo "" continue fi # Calculate jitter if [ $DELAY -gt 0 ]; then JITTER_PCT=$(calculate_jitter "$DELAY" "$ACTUAL_DELAY") echo "Actual delay: ${ACTUAL_DELAY}s (jitter: ${JITTER_PCT}%)" # Verify jitter is reasonable (within 50% for testing) if [ $JITTER_PCT -gt 50 ]; then echo "⚠ WARNING: High jitter (${JITTER_PCT}% > 50%)" fi else echo "Actual delay: ${ACTUAL_DELAY}s (0s delay + processing time)" fi # Verify content FINAL_EVENT=$(query_event "$INNER_EVENT_ID" "$FINAL_RELAY" 5 2>/dev/null) FINAL_CONTENT=$(echo "$FINAL_EVENT" | jq -r '.content') if [ "$FINAL_CONTENT" != "$TEST_CONTENT" ]; then echo "✗ FAILED: Content mismatch" ((FAILED++)) echo "" continue fi echo "✓ PASSED: Delay constraint respected, content verified" ((PASSED++)) echo "" # Small delay between tests sleep 2 done echo "========================================" echo "Delay Test Summary" echo "========================================" echo "Passed: $PASSED / ${#DELAY_VALUES[@]}" echo "Failed: $FAILED / ${#DELAY_VALUES[@]}" echo "" if [ $FAILED -gt 0 ]; then echo "=== TEST FAILED ===" exit 1 fi echo "=== TEST PASSED ===" echo "✓ All delay values tested successfully" echo "✓ Minimum delay constraints respected" echo "✓ Jitter applied appropriately" echo "✓ Content preserved across all tests" echo "" exit 0