# Flamenco Test Environment # Provides isolated test environment with optimized settings for testing # # Usage: # docker compose -f tests/docker/compose.test.yml up -d # docker compose -f tests/docker/compose.test.yml --profile performance up -d services: # ============================================================================= # Test Database - Isolated PostgreSQL for advanced testing # ============================================================================= test-postgres: image: postgres:15-alpine container_name: flamenco-test-postgres environment: POSTGRES_DB: flamenco_test POSTGRES_USER: flamenco_test POSTGRES_PASSWORD: test_password_123 POSTGRES_INITDB_ARGS: "--encoding=UTF8 --lc-collate=C --lc-ctype=C" volumes: - test-postgres-data:/var/lib/postgresql/data - ./init-test-db.sql:/docker-entrypoint-initdb.d/init-test-db.sql ports: - "5433:5432" # Different port to avoid conflicts command: > postgres -c max_connections=200 -c shared_buffers=256MB -c effective_cache_size=1GB -c maintenance_work_mem=64MB -c checkpoint_completion_target=0.9 -c random_page_cost=1.1 -c effective_io_concurrency=200 -c min_wal_size=1GB -c max_wal_size=4GB -c max_worker_processes=8 -c max_parallel_workers_per_gather=4 -c max_parallel_workers=8 -c max_parallel_maintenance_workers=4 healthcheck: test: ["CMD-SHELL", "pg_isready -U flamenco_test"] interval: 10s timeout: 5s retries: 5 networks: - test-network # ============================================================================= # Test Manager - Manager configured for testing # ============================================================================= test-manager: build: context: ../../ dockerfile: Dockerfile.dev target: development container_name: flamenco-test-manager environment: # Test environment configuration - ENVIRONMENT=test - LOG_LEVEL=debug # Database configuration (SQLite for most tests, PostgreSQL for advanced) - DATABASE_FILE=/tmp/flamenco-test-manager.sqlite - DATABASE_DSN=postgres://flamenco_test:test_password_123@test-postgres:5432/flamenco_test?sslmode=disable # Test-optimized settings - MANAGER_HOST=0.0.0.0 - MANAGER_PORT=8080 - MANAGER_DATABASE_CHECK_PERIOD=5s - SHARED_STORAGE_PATH=/shared-storage # Testing features - ENABLE_PPROF=true - TEST_MODE=true - DISABLE_WORKER_TIMEOUT=false - TASK_TIMEOUT=30s # Shaman configuration for testing - SHAMAN_ENABLED=true - SHAMAN_CHECKOUT_PATH=/shared-storage/shaman-checkouts - SHAMAN_STORAGE_PATH=/tmp/shaman-storage volumes: - ../../:/app - test-shared-storage:/shared-storage - test-manager-data:/tmp ports: - "8080:8080" # Manager API - "8082:8082" # pprof debugging depends_on: test-postgres: condition: service_healthy healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8080/api/v3/version"] interval: 15s timeout: 5s retries: 3 start_period: 30s command: > sh -c " echo 'Starting Test Manager...' && flamenco-manager -database-auto-migrate -pprof " networks: - test-network # ============================================================================= # Test Workers - Multiple workers for load testing # ============================================================================= test-worker-1: build: context: ../../ dockerfile: Dockerfile.dev target: development container_name: flamenco-test-worker-1 environment: - ENVIRONMENT=test - LOG_LEVEL=info - WORKER_NAME=test-worker-1 - MANAGER_URL=http://test-manager:8080 - DATABASE_FILE=/tmp/flamenco-worker-1.sqlite - SHARED_STORAGE_PATH=/shared-storage - TASK_TIMEOUT=30s - WORKER_TAGS=test,docker,performance volumes: - ../../:/app - test-shared-storage:/shared-storage - test-worker-1-data:/tmp depends_on: test-manager: condition: service_healthy networks: - test-network test-worker-2: build: context: ../../ dockerfile: Dockerfile.dev target: development container_name: flamenco-test-worker-2 environment: - ENVIRONMENT=test - LOG_LEVEL=info - WORKER_NAME=test-worker-2 - MANAGER_URL=http://test-manager:8080 - DATABASE_FILE=/tmp/flamenco-worker-2.sqlite - SHARED_STORAGE_PATH=/shared-storage - TASK_TIMEOUT=30s - WORKER_TAGS=test,docker,performance volumes: - ../../:/app - test-shared-storage:/shared-storage - test-worker-2-data:/tmp depends_on: test-manager: condition: service_healthy networks: - test-network test-worker-3: build: context: ../../ dockerfile: Dockerfile.dev target: development container_name: flamenco-test-worker-3 environment: - ENVIRONMENT=test - LOG_LEVEL=info - WORKER_NAME=test-worker-3 - MANAGER_URL=http://test-manager:8080 - DATABASE_FILE=/tmp/flamenco-worker-3.sqlite - SHARED_STORAGE_PATH=/shared-storage - TASK_TIMEOUT=30s - WORKER_TAGS=test,docker,performance volumes: - ../../:/app - test-shared-storage:/shared-storage - test-worker-3-data:/tmp depends_on: test-manager: condition: service_healthy networks: - test-network # ============================================================================= # Performance Testing Services # ============================================================================= # Additional workers for performance testing perf-worker-4: extends: test-worker-1 container_name: flamenco-perf-worker-4 environment: - WORKER_NAME=perf-worker-4 - DATABASE_FILE=/tmp/flamenco-worker-4.sqlite - WORKER_TAGS=performance,stress-test volumes: - ../../:/app - test-shared-storage:/shared-storage - test-worker-4-data:/tmp profiles: - performance networks: - test-network perf-worker-5: extends: test-worker-1 container_name: flamenco-perf-worker-5 environment: - WORKER_NAME=perf-worker-5 - DATABASE_FILE=/tmp/flamenco-worker-5.sqlite - WORKER_TAGS=performance,stress-test volumes: - ../../:/app - test-shared-storage:/shared-storage - test-worker-5-data:/tmp profiles: - performance networks: - test-network # ============================================================================= # Test Monitoring and Debugging # ============================================================================= # Redis for caching and test coordination test-redis: image: redis:7-alpine container_name: flamenco-test-redis command: > redis-server --maxmemory 128mb --maxmemory-policy allkeys-lru --save "" --appendonly no ports: - "6379:6379" profiles: - monitoring networks: - test-network # Prometheus for metrics collection during testing test-prometheus: image: prom/prometheus:latest container_name: flamenco-test-prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--storage.tsdb.retention.time=1h' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' - '--web.enable-lifecycle' volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml ports: - "9090:9090" profiles: - monitoring networks: - test-network # ============================================================================= # Test Data and Utilities # ============================================================================= # Test data preparation service test-data-setup: build: context: ../../ dockerfile: Dockerfile.dev target: development container_name: flamenco-test-data-setup environment: - SHARED_STORAGE_PATH=/shared-storage volumes: - test-shared-storage:/shared-storage - ./test-data:/test-data command: > sh -c " echo 'Setting up test data...' && mkdir -p /shared-storage/projects /shared-storage/renders /shared-storage/assets && cp -r /test-data/* /shared-storage/ 2>/dev/null || true && echo 'Test data setup complete' " profiles: - setup networks: - test-network # ============================================================================= # Test Runner Service # ============================================================================= test-runner: build: context: ../../ dockerfile: Dockerfile.dev target: development container_name: flamenco-test-runner environment: - ENVIRONMENT=test - TEST_MANAGER_URL=http://test-manager:8080 - TEST_DATABASE_DSN=postgres://flamenco_test:test_password_123@test-postgres:5432/flamenco_test?sslmode=disable - SHARED_STORAGE_PATH=/shared-storage - GO_TEST_TIMEOUT=30m volumes: - ../../:/app - test-shared-storage:/shared-storage - test-results:/test-results working_dir: /app depends_on: test-manager: condition: service_healthy command: > sh -c " echo 'Waiting for system to stabilize...' && sleep 10 && echo 'Running test suite...' && go test -v -timeout 30m ./tests/... -coverpkg=./... -coverprofile=/test-results/coverage.out && go tool cover -html=/test-results/coverage.out -o /test-results/coverage.html && echo 'Test results available in /test-results/' " profiles: - test-runner networks: - test-network # ============================================================================= # Networks # ============================================================================= networks: test-network: driver: bridge name: flamenco-test-network ipam: config: - subnet: 172.20.0.0/16 # ============================================================================= # Volumes # ============================================================================= volumes: # Database volumes test-postgres-data: name: flamenco-test-postgres-data # Application data test-manager-data: name: flamenco-test-manager-data test-worker-1-data: name: flamenco-test-worker-1-data test-worker-2-data: name: flamenco-test-worker-2-data test-worker-3-data: name: flamenco-test-worker-3-data test-worker-4-data: name: flamenco-test-worker-4-data test-worker-5-data: name: flamenco-test-worker-5-data # Shared storage test-shared-storage: name: flamenco-test-shared-storage # Test results test-results: name: flamenco-test-results