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." | |
| 
 |