#!/bin/bash # v1.10.0 Docker Validation Script # Validates all multi-protocol proxy features in isolated environment set -e echo "๐Ÿ” v1.10.0 Multi-Protocol Proxy Validation" echo "==========================================" echo "" # Colors GREEN='\033[0;32m' RED='\033[0;31m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Configuration DOCKER_IMAGE="agentic-flow-v1.10.0-test" TEST_API_KEY="test-api-key-$(date +%s)" # Cleanup function cleanup() { echo "" echo "๐Ÿงน Cleaning up..." docker ps -a | grep "$DOCKER_IMAGE" | awk '{print $1}' | xargs -r docker stop 2>/dev/null || true docker ps -a | grep "$DOCKER_IMAGE" | awk '{print $1}' | xargs -r docker rm 2>/dev/null || true } trap cleanup EXIT # Test results TESTS_PASSED=0 TESTS_FAILED=0 test_result() { local test_name=$1 local result=$2 if [ $result -eq 0 ]; then echo -e "${GREEN}โœ… PASS${NC}: $test_name" ((TESTS_PASSED++)) else echo -e "${RED}โŒ FAIL${NC}: $test_name" ((TESTS_FAILED++)) fi } # Step 1: Build Docker image echo "๐Ÿ“ฆ Step 1: Building Docker image..." docker build -f Dockerfile.multi-protocol -t $DOCKER_IMAGE . > /dev/null 2>&1 test_result "Docker image build" $? # Step 2: Test TypeScript compilation echo "" echo "๐Ÿ”ง Step 2: Validating TypeScript compilation..." docker run --rm $DOCKER_IMAGE npm run build > /tmp/docker-build.log 2>&1 if grep -q "error TS" /tmp/docker-build.log; then # Check if errors are only in unrelated files if grep -q "error TS" /tmp/docker-build.log | grep -v "federation\|memory/Shared\|onnx-local\|supabase-adapter"; then test_result "TypeScript compilation (proxy files)" 1 else test_result "TypeScript compilation (proxy files)" 0 fi else test_result "TypeScript compilation" 0 fi # Step 3: Test HTTP/1.1 Proxy echo "" echo "๐ŸŒ Step 3: Testing HTTP/1.1 Proxy..." docker run -d --name ${DOCKER_IMAGE}-http1 \ -e GOOGLE_GEMINI_API_KEY=test-key \ -p 3000:3000 \ $DOCKER_IMAGE \ node dist/proxy/anthropic-to-gemini.js > /dev/null 2>&1 sleep 3 # Check if proxy started if curl -s http://localhost:3000/health > /dev/null 2>&1; then test_result "HTTP/1.1 Proxy startup" 0 else test_result "HTTP/1.1 Proxy startup" 1 fi docker stop ${DOCKER_IMAGE}-http1 > /dev/null 2>&1 docker rm ${DOCKER_IMAGE}-http1 > /dev/null 2>&1 # Step 4: Test HTTP/2 Proxy echo "" echo "๐Ÿš€ Step 4: Testing HTTP/2 Proxy..." docker run -d --name ${DOCKER_IMAGE}-http2 \ -e GOOGLE_GEMINI_API_KEY=test-key \ -e PROXY_API_KEYS=$TEST_API_KEY \ -p 3001:3001 \ $DOCKER_IMAGE \ node dist/proxy/http2-proxy.js > /dev/null 2>&1 sleep 3 # Check if proxy started if docker logs ${DOCKER_IMAGE}-http2 2>&1 | grep -q "HTTP/2 Proxy running"; then test_result "HTTP/2 Proxy startup" 0 else test_result "HTTP/2 Proxy startup" 1 fi # Check security features if docker logs ${DOCKER_IMAGE}-http2 2>&1 | grep -q "Rate limiting enabled"; then test_result "HTTP/2 Rate limiting configuration" 0 else test_result "HTTP/2 Rate limiting configuration" 1 fi docker stop ${DOCKER_IMAGE}-http2 > /dev/null 2>&1 docker rm ${DOCKER_IMAGE}-http2 > /dev/null 2>&1 # Step 5: Test Optimized HTTP/2 Proxy echo "" echo "โšก Step 5: Testing Optimized HTTP/2 Proxy..." docker run -d --name ${DOCKER_IMAGE}-optimized \ -e GOOGLE_GEMINI_API_KEY=test-key \ -e PROXY_API_KEYS=$TEST_API_KEY \ -p 3002:3001 \ $DOCKER_IMAGE \ node dist/proxy/http2-proxy-optimized.js > /dev/null 2>&1 sleep 3 # Check if optimizations are enabled if docker logs ${DOCKER_IMAGE}-optimized 2>&1 | grep -q "Connection pooling enabled"; then test_result "Connection pooling enabled" 0 else test_result "Connection pooling enabled" 1 fi if docker logs ${DOCKER_IMAGE}-optimized 2>&1 | grep -q "Response caching enabled"; then test_result "Response caching enabled" 0 else test_result "Response caching enabled" 1 fi if docker logs ${DOCKER_IMAGE}-optimized 2>&1 | grep -q "Streaming optimization enabled"; then test_result "Streaming optimization enabled" 0 else test_result "Streaming optimization enabled" 1 fi if docker logs ${DOCKER_IMAGE}-optimized 2>&1 | grep -q "Compression enabled"; then test_result "Compression enabled" 0 else test_result "Compression enabled" 1 fi docker stop ${DOCKER_IMAGE}-optimized > /dev/null 2>&1 docker rm ${DOCKER_IMAGE}-optimized > /dev/null 2>&1 # Step 6: Test WebSocket Proxy echo "" echo "๐Ÿ”Œ Step 6: Testing WebSocket Proxy..." docker run -d --name ${DOCKER_IMAGE}-ws \ -e GOOGLE_GEMINI_API_KEY=test-key \ -p 8080:8080 \ $DOCKER_IMAGE \ node dist/proxy/websocket-proxy.js > /dev/null 2>&1 sleep 3 if docker logs ${DOCKER_IMAGE}-ws 2>&1 | grep -q "WebSocket proxy running"; then test_result "WebSocket Proxy startup" 0 else test_result "WebSocket Proxy startup" 1 fi # Check DoS protection if docker logs ${DOCKER_IMAGE}-ws 2>&1 | grep -q "DoS protection"; then test_result "WebSocket DoS protection" 0 else test_result "WebSocket DoS protection" 1 fi docker stop ${DOCKER_IMAGE}-ws > /dev/null 2>&1 docker rm ${DOCKER_IMAGE}-ws > /dev/null 2>&1 # Step 7: Test Adaptive Proxy echo "" echo "๐ŸŽฏ Step 7: Testing Adaptive Multi-Protocol Proxy..." docker run -d --name ${DOCKER_IMAGE}-adaptive \ -e GOOGLE_GEMINI_API_KEY=test-key \ -p 3003:3000 \ $DOCKER_IMAGE \ node dist/proxy/adaptive-proxy.js > /dev/null 2>&1 sleep 3 if docker logs ${DOCKER_IMAGE}-adaptive 2>&1 | grep -q "Adaptive"; then test_result "Adaptive Proxy startup" 0 else test_result "Adaptive Proxy startup" 1 fi docker stop ${DOCKER_IMAGE}-adaptive > /dev/null 2>&1 docker rm ${DOCKER_IMAGE}-adaptive > /dev/null 2>&1 # Step 8: Test Utility Files echo "" echo "๐Ÿ› ๏ธ Step 8: Testing Utility Files..." # Check if utility files were built docker run --rm $DOCKER_IMAGE ls dist/utils/ > /tmp/utils-files.txt 2>&1 if grep -q "connection-pool.js" /tmp/utils-files.txt; then test_result "Connection pool utility compiled" 0 else test_result "Connection pool utility compiled" 1 fi if grep -q "response-cache.js" /tmp/utils-files.txt; then test_result "Response cache utility compiled" 0 else test_result "Response cache utility compiled" 1 fi if grep -q "streaming-optimizer.js" /tmp/utils-files.txt; then test_result "Streaming optimizer utility compiled" 0 else test_result "Streaming optimizer utility compiled" 1 fi if grep -q "compression-middleware.js" /tmp/utils-files.txt; then test_result "Compression middleware utility compiled" 0 else test_result "Compression middleware utility compiled" 1 fi if grep -q "rate-limiter.js" /tmp/utils-files.txt; then test_result "Rate limiter utility compiled" 0 else test_result "Rate limiter utility compiled" 1 fi if grep -q "auth.js" /tmp/utils-files.txt; then test_result "Auth utility compiled" 0 else test_result "Auth utility compiled" 1 fi # Step 9: Test Documentation echo "" echo "๐Ÿ“š Step 9: Validating Documentation..." if [ -f "docs/OPTIMIZATIONS.md" ]; then test_result "OPTIMIZATIONS.md exists" 0 else test_result "OPTIMIZATIONS.md exists" 1 fi if grep -q "Connection Pooling" docs/OPTIMIZATIONS.md 2>/dev/null; then test_result "Documentation includes optimizations" 0 else test_result "Documentation includes optimizations" 1 fi # Step 10: Test CHANGELOG echo "" echo "๐Ÿ“ Step 10: Validating CHANGELOG..." if grep -q "1.10.0" CHANGELOG.md; then test_result "CHANGELOG includes v1.10.0" 0 else test_result "CHANGELOG includes v1.10.0" 1 fi if grep -q "Phase 1 Optimizations" CHANGELOG.md; then test_result "CHANGELOG includes optimization details" 0 else test_result "CHANGELOG includes optimization details" 1 fi # Summary echo "" echo "==========================================" echo "๐Ÿ“Š VALIDATION SUMMARY" echo "==========================================" echo -e "Total Tests: $((TESTS_PASSED + TESTS_FAILED))" echo -e "${GREEN}Passed: $TESTS_PASSED${NC}" echo -e "${RED}Failed: $TESTS_FAILED${NC}" echo "" if [ $TESTS_FAILED -eq 0 ]; then echo -e "${GREEN}โœ… ALL TESTS PASSED - Ready for v1.10.0 release!${NC}" exit 0 else echo -e "${YELLOW}โš ๏ธ Some tests failed - Review before publishing${NC}" exit 1 fi