.PHONY: help build test test-basic test-performance test-failover test-agent clean up down logs # Detect architecture and Docker platform compatibility ARCH := $(shell uname -m) OS := $(shell uname -s) ifeq ($(ARCH),arm64) ifeq ($(OS),Darwin) # On Apple Silicon macOS, use native arm64 for better performance DOCKER_PLATFORM := linux/arm64 else DOCKER_PLATFORM := linux/arm64 endif else DOCKER_PLATFORM := linux/amd64 endif # Default target help: @echo "SeaweedMQ Integration Test Suite" @echo "" @echo "Available targets:" @echo " build - Build SeaweedFS Docker images" @echo " test - Run all integration tests (in Docker)" @echo " test-basic - Run basic pub/sub tests (in Docker)" @echo " test-native - Run all tests natively (no Docker test container)" @echo " test-basic-native - Run basic tests natively (recommended for Apple Silicon)" @echo " test-performance - Run performance tests" @echo " test-failover - Run failover tests" @echo " test-agent - Run agent tests" @echo " up - Start test environment (local build)" @echo " up-prod - Start test environment (production images)" @echo " up-cluster - Start cluster only (no test runner)" @echo " down - Stop test environment" @echo " clean - Clean up test environment and results" @echo " logs - Show container logs" # Build SeaweedFS Docker images build: @echo "Building SeaweedFS Docker image for $(DOCKER_PLATFORM)..." cd ../.. && docker build --platform $(DOCKER_PLATFORM) -f docker/Dockerfile.go_build -t chrislusf/seaweedfs:local . @echo "Building test runner image for $(DOCKER_PLATFORM)..." cd ../.. && docker build --platform $(DOCKER_PLATFORM) -f test/mq/Dockerfile.test -t seaweedfs-test-runner . # Start the test environment up: build @echo "Starting SeaweedMQ test environment..." docker-compose -f docker-compose.test.yml up -d master0 master1 master2 @echo "Waiting for masters to be ready..." sleep 10 docker-compose -f docker-compose.test.yml up -d volume1 volume2 volume3 @echo "Waiting for volumes to be ready..." sleep 10 docker-compose -f docker-compose.test.yml up -d filer1 filer2 @echo "Waiting for filers to be ready..." sleep 15 docker-compose -f docker-compose.test.yml up -d broker1 broker2 broker3 @echo "Waiting for brokers to be ready..." sleep 20 @echo "Test environment is ready!" # Start the test environment with production images (no build required) up-prod: build-test-runner @echo "Starting SeaweedMQ test environment with production images..." docker-compose -f docker-compose.production.yml up -d master0 master1 master2 @echo "Waiting for masters to be ready..." sleep 10 docker-compose -f docker-compose.production.yml up -d volume1 volume2 volume3 @echo "Waiting for volumes to be ready..." sleep 10 docker-compose -f docker-compose.production.yml up -d filer1 filer2 @echo "Waiting for filers to be ready..." sleep 15 docker-compose -f docker-compose.production.yml up -d broker1 broker2 broker3 @echo "Waiting for brokers to be ready..." sleep 20 @echo "Test environment is ready!" # Build only the test runner image (for production setup) build-test-runner: @echo "Building test runner image for $(DOCKER_PLATFORM)..." cd ../.. && docker build --platform $(DOCKER_PLATFORM) -f test/mq/Dockerfile.test -t seaweedfs-test-runner . # Start cluster only (no test runner, no build required) up-cluster: @echo "Starting SeaweedMQ cluster only..." docker-compose -f docker-compose.cluster.yml up -d master0 master1 master2 @echo "Waiting for masters to be ready..." sleep 10 docker-compose -f docker-compose.cluster.yml up -d volume1 volume2 volume3 @echo "Waiting for volumes to be ready..." sleep 10 docker-compose -f docker-compose.cluster.yml up -d filer1 filer2 @echo "Waiting for filers to be ready..." sleep 15 docker-compose -f docker-compose.cluster.yml up -d broker1 broker2 broker3 @echo "Waiting for brokers to be ready..." sleep 20 @echo "SeaweedMQ cluster is ready!" @echo "Masters: http://localhost:19333, http://localhost:19334, http://localhost:19335" @echo "Filers: http://localhost:18888, http://localhost:18889" @echo "Brokers: localhost:17777, localhost:17778, localhost:17779" # Stop the test environment down: @echo "Stopping SeaweedMQ test environment..." docker-compose -f docker-compose.test.yml down docker-compose -f docker-compose.production.yml down docker-compose -f docker-compose.cluster.yml down # Clean up everything clean: @echo "Cleaning up test environment..." docker-compose -f docker-compose.test.yml down -v docker system prune -f sudo rm -rf /tmp/test-results/* # Show container logs logs: docker-compose -f docker-compose.test.yml logs -f # Run all integration tests test: @echo "Running all integration tests..." docker-compose -f docker-compose.test.yml run --rm test-runner \ sh -c "go test -v -timeout=30m ./test/mq/integration/... -args -test.parallel=4" # Run basic pub/sub tests test-basic: @echo "Running basic pub/sub tests natively (no container restart)..." cd ../.. && SEAWEED_MASTERS="localhost:19333,localhost:19334,localhost:19335" \ SEAWEED_BROKERS="localhost:17777,localhost:17778,localhost:17779" \ SEAWEED_FILERS="localhost:18888,localhost:18889" \ go test -v -timeout=10m ./test/mq/integration/ -run TestBasic # Run performance tests test-performance: @echo "Running performance tests..." docker-compose -f docker-compose.test.yml run --rm test-runner \ sh -c "go test -v -timeout=20m ./test/mq/integration/ -run TestPerformance" # Run failover tests test-failover: @echo "Running failover tests..." docker-compose -f docker-compose.test.yml run --rm test-runner \ sh -c "go test -v -timeout=15m ./test/mq/integration/ -run TestFailover" # Run agent tests test-agent: @echo "Running agent tests..." docker-compose -f docker-compose.test.yml run --rm test-runner \ sh -c "go test -v -timeout=10m ./test/mq/integration/ -run TestAgent" # Development targets (run tests natively without Docker container) test-dev: @echo "Running tests in development mode (using local binaries)..." SEAWEED_MASTERS="localhost:19333,localhost:19334,localhost:19335" \ SEAWEED_BROKERS="localhost:17777,localhost:17778,localhost:17779" \ SEAWEED_FILERS="localhost:18888,localhost:18889" \ go test -v -timeout=10m ./integration/... # Native test running (no Docker container for tests) test-native: @echo "Running tests natively (without Docker container for tests)..." cd ../.. && SEAWEED_MASTERS="localhost:19333,localhost:19334,localhost:19335" \ SEAWEED_BROKERS="localhost:17777,localhost:17778,localhost:17779" \ SEAWEED_FILERS="localhost:18888,localhost:18889" \ go test -v -timeout=10m ./test/mq/integration/... # Basic native tests test-basic-native: @echo "Running basic tests natively..." cd ../.. && SEAWEED_MASTERS="localhost:19333,localhost:19334,localhost:19335" \ SEAWEED_BROKERS="localhost:17777,localhost:17778,localhost:17779" \ SEAWEED_FILERS="localhost:18888,localhost:18889" \ go test -v -timeout=10m ./test/mq/integration/ -run TestBasic # Quick smoke test smoke-test: @echo "Running smoke test..." docker-compose -f docker-compose.test.yml run --rm test-runner \ sh -c "go test -v -timeout=5m ./test/mq/integration/ -run TestBasicPublishSubscribe" # Performance benchmarks benchmark: @echo "Running performance benchmarks..." docker-compose -f docker-compose.test.yml run --rm test-runner \ sh -c "go test -v -timeout=30m -bench=. ./test/mq/integration/..." # Check test environment health health: @echo "Checking test environment health..." @echo "Masters:" @curl -s http://localhost:19333/cluster/status || echo "Master 0 not accessible" @curl -s http://localhost:19334/cluster/status || echo "Master 1 not accessible" @curl -s http://localhost:19335/cluster/status || echo "Master 2 not accessible" @echo "" @echo "Filers:" @curl -s http://localhost:18888/ || echo "Filer 1 not accessible" @curl -s http://localhost:18889/ || echo "Filer 2 not accessible" @echo "" @echo "Brokers:" @nc -z localhost 17777 && echo "Broker 1 accessible" || echo "Broker 1 not accessible" @nc -z localhost 17778 && echo "Broker 2 accessible" || echo "Broker 2 not accessible" @nc -z localhost 17779 && echo "Broker 3 accessible" || echo "Broker 3 not accessible" # Generate test reports report: @echo "Generating test reports..." docker-compose -f docker-compose.test.yml run --rm test-runner \ sh -c "go test -v -timeout=30m ./test/mq/integration/... -json > /test-results/test-report.json" # Load testing load-test: @echo "Running load tests..." docker-compose -f docker-compose.test.yml run --rm test-runner \ sh -c "go test -v -timeout=45m ./test/mq/integration/ -run TestLoad" # View monitoring dashboards monitoring: @echo "Starting monitoring stack..." docker-compose -f docker-compose.test.yml up -d prometheus grafana @echo "Prometheus: http://localhost:19090" @echo "Grafana: http://localhost:13000 (admin/admin)"