zai-proxy/proxy/scripts/run-regression-tests.sh
jedarden e7c24a0c08 feat: initial zai-proxy ecosystem repo
Extracted from ardenone-cluster/containers/zai-proxy and
ardenone-cluster/containers/zai-proxy-dashboard.

- proxy/: OpenAI-compatible ZAI reverse proxy (Go, v1.10.0)
  - Token counting, rate limiting, Prometheus metrics, canary support
- dashboard/: Metrics dashboard backend + React frontend (Go, v1.0.0)
  - Prometheus collector, SQLite storage, SSE live updates
- docs/: Operational notes, research, and plan subdirs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 15:53:52 -04:00

306 lines
8.3 KiB
Bash
Executable file

#!/bin/bash
# Automated Regression Test Runner
# Purpose: Run comprehensive regression test suite for token counting
# Usage: ./scripts/run-regression-tests.sh [--docker] [--coverage] [--race]
# Bead: bd-10d
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Parse command line arguments
USE_DOCKER=false
GENERATE_COVERAGE=false
USE_RACE_DETECTOR=false
while [[ $# -gt 0 ]]; do
case $1 in
--docker)
USE_DOCKER=true
shift
;;
--coverage)
GENERATE_COVERAGE=true
shift
;;
--race)
USE_RACE_DETECTOR=true
shift
;;
-h|--help)
echo "Usage: $0 [OPTIONS]"
echo ""
echo "Options:"
echo " --docker Run tests in Docker container"
echo " --coverage Generate coverage report"
echo " --race Enable race detector"
echo " -h, --help Show this help message"
echo ""
echo "Examples:"
echo " $0 # Run tests locally"
echo " $0 --docker # Run tests in Docker"
echo " $0 --coverage --race # Run with coverage and race detection"
exit 0
;;
*)
echo "Unknown option: $1"
echo "Use -h or --help for usage information"
exit 1
;;
esac
done
# Function to print section headers
print_section() {
echo ""
echo -e "${CYAN}=================================${NC}"
echo -e "${CYAN}$1${NC}"
echo -e "${CYAN}=================================${NC}"
echo ""
}
# Function to print test status
print_status() {
if [ $1 -eq 0 ]; then
echo -e "${GREEN}$2${NC}"
else
echo -e "${RED}$2${NC}"
return 1
fi
}
# Function to run go test with optional flags
run_test() {
local test_name=$1
local test_pattern=$2
local extra_flags=$3
echo -e "${YELLOW}Running: $test_name${NC}"
if [ "$USE_RACE_DETECTOR" = true ] && [[ "$test_name" == *"Concurrent"* ]]; then
extra_flags="$extra_flags -race"
fi
if go test -v -run "$test_pattern" $extra_flags; then
print_status 0 "$test_name passed"
return 0
else
print_status 1 "$test_name FAILED"
return 1
fi
}
# Start test suite
print_section "🧪 Regression Test Suite for Token Counting"
echo "Configuration:"
echo " Docker mode: $USE_DOCKER"
echo " Coverage: $GENERATE_COVERAGE"
echo " Race detector: $USE_RACE_DETECTOR"
echo ""
# Check if running in Docker mode
if [ "$USE_DOCKER" = true ]; then
print_section "🐳 Running Tests in Docker"
# Build Docker image
echo "Building Docker image..."
if ! docker build -t zai-proxy:regression-test .; then
print_status 1 "Docker build failed"
exit 1
fi
print_status 0 "Docker image built"
# Run tests in container
echo ""
echo "Running regression tests in container..."
if docker run --rm zai-proxy:regression-test go test -v -run TestRegression; then
print_status 0 "All Docker regression tests passed"
exit 0
else
print_status 1 "Docker regression tests failed"
exit 1
fi
fi
# Check Go installation
if ! command -v go &> /dev/null; then
echo -e "${RED}❌ Go not found. Install Go or use --docker flag.${NC}"
exit 1
fi
echo "Go version: $(go version)"
echo ""
# Track test results
TOTAL_TESTS=0
PASSED_TESTS=0
FAILED_TESTS=0
# Test 1: Basic Token Counts
print_section "📊 Test 1: Basic Token Counts (Golden Test Cases)"
if run_test "Basic Token Counts" "TestRegression_BasicTokenCounts"; then
((PASSED_TESTS++))
else
((FAILED_TESTS++))
fi
((TOTAL_TESTS++))
# Test 2: Edge Cases
print_section "🔍 Test 2: Edge Cases"
if run_test "Edge Cases" "TestRegression_EdgeCases"; then
((PASSED_TESTS++))
else
((FAILED_TESTS++))
fi
((TOTAL_TESTS++))
# Test 3: Request Parsing
print_section "📥 Test 3: Request Parsing"
if run_test "Request Parsing" "TestRegression_RequestParsing"; then
((PASSED_TESTS++))
else
((FAILED_TESTS++))
fi
((TOTAL_TESTS++))
# Test 4: Streaming Responses
print_section "📡 Test 4: Streaming Responses (SSE)"
if run_test "Streaming Responses" "TestRegression_StreamingResponses"; then
((PASSED_TESTS++))
else
((FAILED_TESTS++))
fi
((TOTAL_TESTS++))
# Test 5: JSON Responses
print_section "📄 Test 5: JSON Responses"
if run_test "JSON Responses" "TestRegression_JSONResponses"; then
((PASSED_TESTS++))
else
((FAILED_TESTS++))
fi
((TOTAL_TESTS++))
# Test 6: Usage Injection
print_section "💉 Test 6: Usage Injection"
if run_test "Usage Injection" "TestRegression_UsageInjection"; then
((PASSED_TESTS++))
else
((FAILED_TESTS++))
fi
((TOTAL_TESTS++))
# Test 7: Concurrent Access (with race detector)
print_section "🔀 Test 7: Concurrent Access (Thread Safety)"
if [ "$USE_RACE_DETECTOR" = true ]; then
echo -e "${YELLOW}Running with race detector enabled${NC}"
if run_test "Concurrent Access" "TestRegression_ConcurrentAccess" "-race"; then
((PASSED_TESTS++))
else
((FAILED_TESTS++))
fi
else
if run_test "Concurrent Access" "TestRegression_ConcurrentAccess"; then
((PASSED_TESTS++))
else
((FAILED_TESTS++))
fi
fi
((TOTAL_TESTS++))
# Test 8: Fallback Counter
print_section "🔄 Test 8: Fallback Counter (SimpleTokenCounter)"
if run_test "Fallback Counter" "TestRegression_FallbackCounter"; then
((PASSED_TESTS++))
else
((FAILED_TESTS++))
fi
((TOTAL_TESTS++))
# Test 9: Streaming Preservation
print_section "📺 Test 9: Streaming Preservation"
if run_test "Streaming Preservation" "TestRegression_StreamingPreservation"; then
((PASSED_TESTS++))
else
((FAILED_TESTS++))
fi
((TOTAL_TESTS++))
# Generate coverage report if requested
if [ "$GENERATE_COVERAGE" = true ]; then
print_section "📈 Generating Coverage Report"
echo "Generating coverage profile..."
if go test -coverprofile=regression_coverage.out -run TestRegression; then
print_status 0 "Coverage profile generated"
echo ""
echo "Coverage summary:"
go tool cover -func=regression_coverage.out | tail -10
echo ""
echo "Generating HTML coverage report..."
go tool cover -html=regression_coverage.out -o regression_coverage.html
print_status 0 "HTML coverage report generated: regression_coverage.html"
# Calculate overall coverage percentage
COVERAGE=$(go tool cover -func=regression_coverage.out | grep total | awk '{print $3}')
echo ""
echo -e "${BLUE}Overall Coverage: $COVERAGE${NC}"
# Check if coverage meets target
COVERAGE_NUM=$(echo $COVERAGE | sed 's/%//')
if (( $(echo "$COVERAGE_NUM >= 90" | bc -l) )); then
echo -e "${GREEN}✅ Coverage target met (≥90%)${NC}"
else
echo -e "${YELLOW}⚠️ Coverage below target: $COVERAGE_NUM% < 90%${NC}"
fi
else
print_status 1 "Coverage generation failed"
fi
fi
# Print summary
print_section "📋 Test Summary"
echo "Total test suites: $TOTAL_TESTS"
echo -e "Passed: ${GREEN}$PASSED_TESTS${NC}"
echo -e "Failed: ${RED}$FAILED_TESTS${NC}"
echo ""
# Calculate percentage
if [ $TOTAL_TESTS -gt 0 ]; then
PASS_PERCENTAGE=$((PASSED_TESTS * 100 / TOTAL_TESTS))
echo "Success rate: $PASS_PERCENTAGE%"
fi
echo ""
# Final status
if [ $FAILED_TESTS -eq 0 ]; then
print_section "✅ All Regression Tests Passed!"
echo -e "${GREEN}Token counting code is stable and regression-free.${NC}"
echo ""
echo "Next steps:"
echo " • Commit changes with: git commit -m 'test: regression suite validated'"
echo " • Run integration tests: ./test_api_requests.sh"
echo " • Deploy with confidence!"
exit 0
else
print_section "❌ Some Tests Failed"
echo -e "${RED}$FAILED_TESTS out of $TOTAL_TESTS test suite(s) failed.${NC}"
echo ""
echo "Troubleshooting:"
echo " • Check test output above for error details"
echo " • Review docs/REGRESSION_TESTING.md for guidance"
echo " • Run failed tests individually: go test -v -run TestRegression_<Name>"
echo " • Check if tiktoken-go is installed: go mod download"
exit 1
fi