tasq/node_modules/agentic-flow/validation/validate-v1.10.0-docker.sh

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