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.
151 lines
4.2 KiB
151 lines
4.2 KiB
#!/bin/bash
|
|
|
|
# Test script to verify the retry logic works correctly
|
|
# Simulates Schema Registry eventual consistency behavior
|
|
|
|
set -euo pipefail
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[0;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
log_info() {
|
|
echo -e "${BLUE}[TEST]${NC} $1"
|
|
}
|
|
|
|
log_success() {
|
|
echo -e "${GREEN}[PASS]${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[FAIL]${NC} $1"
|
|
}
|
|
|
|
# Mock function that simulates Schema Registry eventual consistency
|
|
# First N attempts fail, then succeeds
|
|
mock_schema_registry_query() {
|
|
local subject=$1
|
|
local min_attempts_to_succeed=$2
|
|
local current_attempt=$3
|
|
|
|
if [[ $current_attempt -ge $min_attempts_to_succeed ]]; then
|
|
# Simulate successful response
|
|
echo '{"id":1,"version":1,"schema":"test"}'
|
|
return 0
|
|
else
|
|
# Simulate 404 Not Found
|
|
echo '{"error_code":40401,"message":"Subject not found"}'
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Simulate verify_schema_with_retry logic
|
|
test_verify_with_retry() {
|
|
local subject=$1
|
|
local min_attempts_to_succeed=$2
|
|
local max_attempts=5
|
|
local attempt=1
|
|
|
|
log_info "Testing $subject (should succeed after $min_attempts_to_succeed attempts)"
|
|
|
|
while [[ $attempt -le $max_attempts ]]; do
|
|
local response
|
|
if response=$(mock_schema_registry_query "$subject" "$min_attempts_to_succeed" "$attempt"); then
|
|
if echo "$response" | grep -q '"id"'; then
|
|
if [[ $attempt -gt 1 ]]; then
|
|
log_success "$subject verified after $attempt attempts"
|
|
else
|
|
log_success "$subject verified on first attempt"
|
|
fi
|
|
return 0
|
|
fi
|
|
fi
|
|
|
|
# Schema not found, wait and retry
|
|
if [[ $attempt -lt $max_attempts ]]; then
|
|
# Exponential backoff: 0.1s, 0.2s, 0.4s, 0.8s
|
|
local wait_time=$(echo "scale=3; 0.1 * (2 ^ ($attempt - 1))" | bc)
|
|
log_info " Attempt $attempt failed, waiting ${wait_time}s before retry..."
|
|
sleep "$wait_time"
|
|
attempt=$((attempt + 1))
|
|
else
|
|
log_error "$subject verification failed after $max_attempts attempts"
|
|
return 1
|
|
fi
|
|
done
|
|
|
|
return 1
|
|
}
|
|
|
|
# Run tests
|
|
log_info "=========================================="
|
|
log_info "Testing Schema Registry Retry Logic"
|
|
log_info "=========================================="
|
|
echo ""
|
|
|
|
# Test 1: Schema available immediately
|
|
log_info "Test 1: Schema available immediately"
|
|
if test_verify_with_retry "immediate-schema" 1; then
|
|
log_success "✓ Test 1 passed"
|
|
else
|
|
log_error "✗ Test 1 failed"
|
|
exit 1
|
|
fi
|
|
echo ""
|
|
|
|
# Test 2: Schema available after 2 attempts (200ms delay)
|
|
log_info "Test 2: Schema available after 2 attempts"
|
|
if test_verify_with_retry "delayed-schema-2" 2; then
|
|
log_success "✓ Test 2 passed"
|
|
else
|
|
log_error "✗ Test 2 failed"
|
|
exit 1
|
|
fi
|
|
echo ""
|
|
|
|
# Test 3: Schema available after 3 attempts (600ms delay)
|
|
log_info "Test 3: Schema available after 3 attempts"
|
|
if test_verify_with_retry "delayed-schema-3" 3; then
|
|
log_success "✓ Test 3 passed"
|
|
else
|
|
log_error "✗ Test 3 failed"
|
|
exit 1
|
|
fi
|
|
echo ""
|
|
|
|
# Test 4: Schema available after 4 attempts (1400ms delay)
|
|
log_info "Test 4: Schema available after 4 attempts"
|
|
if test_verify_with_retry "delayed-schema-4" 4; then
|
|
log_success "✓ Test 4 passed"
|
|
else
|
|
log_error "✗ Test 4 failed"
|
|
exit 1
|
|
fi
|
|
echo ""
|
|
|
|
# Test 5: Schema never available (should fail)
|
|
log_info "Test 5: Schema never available (should fail gracefully)"
|
|
if test_verify_with_retry "missing-schema" 10; then
|
|
log_error "✗ Test 5 failed (should have failed but passed)"
|
|
exit 1
|
|
else
|
|
log_success "✓ Test 5 passed (correctly failed after max attempts)"
|
|
fi
|
|
echo ""
|
|
|
|
log_success "=========================================="
|
|
log_success "All tests passed! ✓"
|
|
log_success "=========================================="
|
|
log_info ""
|
|
log_info "Summary:"
|
|
log_info "- Immediate availability: works ✓"
|
|
log_info "- 2-4 retry attempts: works ✓"
|
|
log_info "- Max attempts handling: works ✓"
|
|
log_info "- Exponential backoff: works ✓"
|
|
log_info ""
|
|
log_info "Total retry time budget: ~1.5 seconds (0.1+0.2+0.4+0.8)"
|
|
log_info "This should handle Schema Registry consumer lag gracefully."
|
|
|