Spaces:
Running
on
Zero
Running
on
Zero
| # Comprehensive Testing Suite for Secure AI Agents Suite | |
| # Validates all components and integrations | |
| set -e | |
| # Color codes for output | |
| RED='\033[0;31m' | |
| GREEN='\033[0;32m' | |
| YELLOW='\033[1;33m' | |
| BLUE='\033[0;34m' | |
| NC='\033[0m' # No Color | |
| # Test results tracking | |
| TOTAL_TESTS=0 | |
| PASSED_TESTS=0 | |
| FAILED_TESTS=0 | |
| # Logging functions | |
| log_info() { | |
| echo -e "${BLUE}[INFO]${NC} $1" | |
| } | |
| log_success() { | |
| echo -e "${GREEN}[PASS]${NC} $1" | |
| ((PASSED_TESTS++)) | |
| } | |
| log_failure() { | |
| echo -e "${RED}[FAIL]${NC} $1" | |
| ((FAILED_TESTS++)) | |
| } | |
| log_warning() { | |
| echo -e "${YELLOW}[WARN]${NC} $1" | |
| } | |
| # Test framework | |
| run_test() { | |
| local test_name="$1" | |
| local test_command="$2" | |
| ((TOTAL_TESTS++)) | |
| log_info "Running test: $test_name" | |
| if eval "$test_command"; then | |
| log_success "$test_name" | |
| return 0 | |
| else | |
| log_failure "$test_name" | |
| return 1 | |
| fi | |
| } | |
| # Test: Environment Setup | |
| test_environment() { | |
| log_info "Testing environment setup..." | |
| # Check Python version | |
| run_test "Python version check" \ | |
| "python3 --version | grep -E '3\.[8-9]|3\.1[0-9]'" | |
| # Check required system tools | |
| run_test "Git availability" \ | |
| "command -v git" | |
| run_test "Docker availability" \ | |
| "command -v docker" | |
| # Check memory availability | |
| memory_gb=$(free -g | awk '/^Mem:/{print $2}') | |
| if [[ ${memory_gb} -ge 2 ]]; then | |
| run_test "Memory check" \ | |
| "true" | |
| else | |
| run_test "Memory check" \ | |
| "echo 'Insufficient memory: ${memory_gb}GB'; exit 1" | |
| fi | |
| } | |
| # Test: Dependencies Installation | |
| test_dependencies() { | |
| log_info "Testing dependencies..." | |
| # Test pip installation | |
| run_test "Pip functionality" \ | |
| "python3 -m pip --version" | |
| # Test required Python packages | |
| local packages=("gradio" "pandas" "numpy" "plotly" "requests") | |
| for package in "${packages[@]}"; do | |
| run_test "Package availability: $package" \ | |
| "python3 -c \"import $package; print('Available')\"" | |
| done | |
| } | |
| # Test: Application Structure | |
| test_application_structure() { | |
| log_info "Testing application structure..." | |
| # Check required files | |
| local required_files=("app.py" "autonomous_engine_fixed.py" "requirements.txt" "Dockerfile") | |
| for file in "${required_files[@]}"; do | |
| run_test "Required file exists: $file" \ | |
| "test -f '$file'" | |
| done | |
| # Check directory structure | |
| run_test "Directory structure" \ | |
| "test -d 'logs' && test -d 'cache' && test -d 'docs'" | |
| } | |
| # Test: Code Quality | |
| test_code_quality() { | |
| log_info "Testing code quality..." | |
| # Install quality tools if not available | |
| python3 -m pip install black flake8 mypy bandit || true | |
| # Test Python syntax | |
| run_test "Python syntax check" \ | |
| "python3 -m py_compile app.py autonomous_engine_fixed.py" | |
| # Test code formatting (if black is available) | |
| if command -v black >/dev/null 2>&1; then | |
| run_test "Code formatting (Black)" \ | |
| "black --check app.py autonomous_engine_fixed.py" | |
| fi | |
| # Test linting (if flake8 is available) | |
| if command -v flake8 >/dev/null 2>&1; then | |
| run_test "Code linting (Flake8)" \ | |
| "flake8 app.py autonomous_engine_fixed.py --count --select=E9,F63,F7,F82 --show-source --statistics" | |
| fi | |
| # Security scan (if bandit is available) | |
| if command -v bandit >/dev/null 2>&1; then | |
| run_test "Security scan (Bandit)" \ | |
| "bandit app.py autonomous_engine_fixed.py -r" | |
| fi | |
| } | |
| # Test: Application Functionality | |
| test_application_functionality() { | |
| log_info "Testing application functionality..." | |
| # Test import of main modules | |
| run_test "Import autonomous engine" \ | |
| "python3 -c 'from autonomous_engine_fixed import RefactoredAutonomousAgent; print(\"Imported successfully\")'" | |
| run_test "Import application classes" \ | |
| "python3 -c 'from app import SpacesApp, AgentManager, RequestValidator; print(\"Imported successfully\")'" | |
| # Test application initialization | |
| run_test "Application initialization" \ | |
| "python3 -c 'from app import SpacesApp; app = SpacesApp(); print(\"App initialized\")'" | |
| # Test agent creation | |
| run_test "Agent manager initialization" \ | |
| "python3 -c 'from app import SpacesApp; app = SpacesApp(); agents = app.agent_manager.agents; print(f\"Created {len(agents)} agents\")' && test \$(python3 -c 'from app import SpacesApp; app = SpacesApp(); print(len(app.agent_manager.agents))') -ge 1" | |
| } | |
| # Test: Configuration Files | |
| test_configuration() { | |
| log_info "Testing configuration files..." | |
| # Test requirements.txt | |
| run_test "Requirements file validity" \ | |
| "python3 -c 'import pkg_resources; pkg_resources.require([line.split(\"==\")[0] for line in open(\"requirements.txt\") if line.strip() and not line.startswith(\"#\")])'" | |
| # Test YAML configuration files | |
| if command -v yamllint >/dev/null 2>&1; then | |
| run_test "YAML configuration validation" \ | |
| "yamllint spaces.yaml security_config.yaml" | |
| fi | |
| # Test Docker configuration | |
| run_test "Dockerfile syntax" \ | |
| "docker build --dry-run -f Dockerfile . > /dev/null 2>&1" | |
| } | |
| # Test: Security Features | |
| test_security() { | |
| log_info "Testing security features..." | |
| # Test input validation | |
| run_test "Input validation functionality" \ | |
| "python3 -c 'from app import RequestValidator; validator = RequestValidator(); valid, msg = validator.validate_input(\"test input\"); assert valid'" | |
| # Test rate limiting | |
| run_test "Rate limiting configuration" \ | |
| "python3 -c 'from security_config import *; print(\"Security config loaded\")'" | |
| # Test environment variable handling | |
| run_test "Environment configuration" \ | |
| "python3 -c 'from app import SpacesConfig; config = SpacesConfig(); print(f\"Loaded {len(config.config)} config items\")'" | |
| } | |
| # Test: Performance Benchmarks | |
| test_performance() { | |
| log_info "Testing performance benchmarks..." | |
| # Test agent response time | |
| run_test "Agent response time benchmark" \ | |
| "python3 -c 'import time; from app import SpacesApp; app = SpacesApp(); start = time.time(); agent = app.agent_manager.get_agent(\"GeneralAgent\"); print(f\"Response time: {time.time() - start:.3f}s\"); assert (time.time() - start) < 1.0'" | |
| # Test memory usage | |
| run_test "Memory usage check" \ | |
| "python3 -c 'import psutil; import os; process = psutil.Process(os.getpid()); memory_mb = process.memory_info().rss / 1024 / 1024; print(f\"Memory usage: {memory_mb:.1f}MB\"); assert memory_mb < 500'" | |
| # Test concurrent request handling | |
| run_test "Concurrent request handling" \ | |
| "python3 -c 'from app import SpacesApp; import threading; app = SpacesApp(); results = []; def test_request(): results.append(len(app.agent_manager.agents)); threads = [threading.Thread(target=test_request) for _ in range(5)]; [t.start() for t in threads]; [t.join() for t in threads]; print(f\"Concurrent requests: {len(results)}\"); assert len(results) == 5'" | |
| } | |
| # Test: API Endpoints | |
| test_api_endpoints() { | |
| log_info "Testing API endpoints..." | |
| # Start application in background | |
| log_info "Starting test server..." | |
| timeout 30s python3 app.py & | |
| SERVER_PID=$! | |
| sleep 10 # Wait for server to start | |
| # Test health endpoint | |
| run_test "Health endpoint" \ | |
| "curl -f http://localhost:7860/health > /dev/null 2>&1" | |
| # Test main interface | |
| run_test "Main interface" \ | |
| "curl -f http://localhost:7860 > /dev/null 2>&1" | |
| # Stop test server | |
| kill $SERVER_PID 2>/dev/null || true | |
| wait $SERVER_PID 2>/dev/null || true | |
| } | |
| # Test: Documentation | |
| test_documentation() { | |
| log_info "Testing documentation..." | |
| # Check README exists and has content | |
| run_test "README documentation" \ | |
| "test -f README.md && wc -l README.md | awk '{print \$1}' | xargs -I {} test {} -gt 100" | |
| # Check API documentation | |
| run_test "API documentation" \ | |
| "test -f docs/api_reference.md" | |
| # Check that documentation is comprehensive | |
| run_test "Documentation completeness" \ | |
| "python3 -c 'with open(\"README.md\") as f: content = f.read(); sections = [\"Installation\", \"Usage\", \"API\", \"Configuration\"]; missing = [s for s in sections if s not in content]; print(f\"Missing sections: {missing}\"); assert len(missing) == 0'" | |
| } | |
| # Test: Deployment Readiness | |
| test_deployment_readiness() { | |
| log_info "Testing deployment readiness..." | |
| # Test setup script | |
| run_test "Setup script functionality" \ | |
| "test -f setup.sh && chmod +x setup.sh" | |
| # Test GitHub Actions workflow | |
| run_test "CI/CD workflow" \ | |
| "test -f .github/workflows/ci-cd.yml" | |
| # Test HuggingFace Spaces configuration | |
| run_test "Spaces configuration" \ | |
| "test -f spaces.yaml && python3 -c 'import yaml; yaml.safe_load(open(\"spaces.yaml\"))'" | |
| # Test Docker build | |
| if command -v docker >/dev/null 2>&1; then | |
| run_test "Docker image build" \ | |
| "docker build -t secure-ai-agents-test -f Dockerfile . > /dev/null 2>&1" | |
| # Clean up test image | |
| docker rmi secure-ai-agents-test >/dev/null 2>&1 || true | |
| fi | |
| } | |
| # Test: Error Handling | |
| test_error_handling() { | |
| log_info "Testing error handling..." | |
| # Test invalid input handling | |
| run_test "Invalid input handling" \ | |
| "python3 -c 'from app import RequestValidator; validator = RequestValidator(); valid, msg = validator.validate_input(\"\"); assert not valid'" | |
| # Test empty context handling | |
| run_test "Empty context handling" \ | |
| "python3 -c 'from app import RequestValidator; validator = RequestValidator(); valid, msg = validator.validate_context({}); assert valid'" | |
| # Test oversized input handling | |
| run_test "Oversized input handling" \ | |
| "python3 -c 'from app import RequestValidator; validator = RequestValidator(); large_input = \"a\" * 15000; valid, msg = validator.validate_input(large_input); assert not valid'" | |
| } | |
| # Test: Integration Testing | |
| test_integration() { | |
| log_info "Running integration tests..." | |
| # Test end-to-end workflow | |
| run_test "End-to-end workflow" \ | |
| "python3 -c 'from app import SpacesApp; app = SpacesApp(); agent = app.agent_manager.get_agent(\"GeneralAgent\"); print(f\"Agent type: {type(agent).__name__}\"); assert agent is not None'" | |
| # Test configuration loading | |
| run_test "Configuration loading" \ | |
| "python3 -c 'from app import SpacesConfig; config = SpacesConfig(); print(f\"Config items: {len(config.config)}\"); assert len(config.config) > 0'" | |
| # Test logging setup | |
| run_test "Logging configuration" \ | |
| "python3 -c 'import logging; logging.basicConfig(level=logging.INFO); print(\"Logging configured\")'" | |
| } | |
| # Main test execution | |
| main() { | |
| echo "==========================================" | |
| echo "Secure AI Agents Suite - Test Suite" | |
| echo "==========================================" | |
| echo | |
| # Run all test categories | |
| test_environment | |
| echo | |
| test_dependencies | |
| echo | |
| test_application_structure | |
| echo | |
| test_code_quality | |
| echo | |
| test_application_functionality | |
| echo | |
| test_configuration | |
| echo | |
| test_security | |
| echo | |
| test_performance | |
| echo | |
| test_api_endpoints | |
| echo | |
| test_documentation | |
| echo | |
| test_deployment_readiness | |
| echo | |
| test_error_handling | |
| echo | |
| test_integration | |
| echo | |
| # Generate test report | |
| echo "==========================================" | |
| echo "Test Summary" | |
| echo "==========================================" | |
| echo "Total tests run: $TOTAL_TESTS" | |
| echo -e "${GREEN}Passed: $PASSED_TESTS${NC}" | |
| echo -e "${RED}Failed: $FAILED_TESTS${NC}" | |
| if [[ $FAILED_TESTS -eq 0 ]]; then | |
| echo -e "${GREEN}🎉 All tests passed! Application is ready for deployment.${NC}" | |
| exit 0 | |
| else | |
| echo -e "${RED}❌ Some tests failed. Please review and fix issues before deployment.${NC}" | |
| exit 1 | |
| fi | |
| } | |
| # Script entry point | |
| if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then | |
| main "$@" | |
| fi |