297 lines
8.1 KiB
Bash
297 lines
8.1 KiB
Bash
#!/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
|