# SeaweedFS S3 IAM Integration Tests Makefile .PHONY: all test clean setup start-services stop-services wait-for-services help # Default target all: test # Test configuration WEED_BINARY ?= $(shell go env GOPATH)/bin/weed LOG_LEVEL ?= 2 S3_PORT ?= 8333 FILER_PORT ?= 8888 MASTER_PORT ?= 9333 VOLUME_PORT ?= 8081 TEST_TIMEOUT ?= 30m # Service PIDs MASTER_PID_FILE = /tmp/weed-master.pid VOLUME_PID_FILE = /tmp/weed-volume.pid FILER_PID_FILE = /tmp/weed-filer.pid S3_PID_FILE = /tmp/weed-s3.pid help: ## Show this help message @echo "SeaweedFS S3 IAM Integration Tests" @echo "" @echo "Usage:" @echo " make [target]" @echo "" @echo "Standard Targets:" @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " %-25s %s\n", $$1, $$2}' $(MAKEFILE_LIST) | head -20 @echo "" @echo "New Test Targets (Previously Skipped):" @echo " test-distributed Run distributed IAM tests" @echo " test-performance Run performance tests" @echo " test-stress Run stress tests" @echo " test-versioning-stress Run S3 versioning stress tests" @echo " test-keycloak-full Run complete Keycloak integration tests" @echo " test-all-previously-skipped Run all previously skipped tests" @echo " setup-all-tests Setup environment for all tests" @echo "" @echo "Docker Compose Targets:" @echo " docker-test Run tests with Docker Compose including Keycloak" @echo " docker-up Start all services with Docker Compose" @echo " docker-down Stop all Docker Compose services" @echo " docker-logs Show logs from all services" test: clean setup start-services run-tests stop-services ## Run complete IAM integration test suite test-quick: run-tests ## Run tests assuming services are already running run-tests: ## Execute the Go tests @echo "๐Ÿงช Running S3 IAM Integration Tests..." go test -v -timeout $(TEST_TIMEOUT) ./... setup: ## Setup test environment @echo "๐Ÿ”ง Setting up test environment..." @mkdir -p test-volume-data/filerldb2 @mkdir -p test-volume-data/m9333 start-services: ## Start SeaweedFS services for testing @echo "๐Ÿš€ Starting SeaweedFS services..." @echo "Starting master server..." @$(WEED_BINARY) master -port=$(MASTER_PORT) \ -mdir=test-volume-data/m9333 > weed-master.log 2>&1 & \ echo $$! > $(MASTER_PID_FILE) @echo "Waiting for master server to be ready..." @timeout 60 bash -c 'until curl -s http://localhost:$(MASTER_PORT)/cluster/status > /dev/null 2>&1; do echo "Waiting for master server..."; sleep 2; done' || (echo "โŒ Master failed to start, checking logs..." && tail -20 weed-master.log && exit 1) @echo "โœ… Master server is ready" @echo "Starting volume server..." @$(WEED_BINARY) volume -port=$(VOLUME_PORT) \ -ip=localhost \ -dataCenter=dc1 -rack=rack1 \ -dir=test-volume-data \ -max=100 \ -mserver=localhost:$(MASTER_PORT) > weed-volume.log 2>&1 & \ echo $$! > $(VOLUME_PID_FILE) @echo "Waiting for volume server to be ready..." @timeout 60 bash -c 'until curl -s http://localhost:$(VOLUME_PORT)/status > /dev/null 2>&1; do echo "Waiting for volume server..."; sleep 2; done' || (echo "โŒ Volume server failed to start, checking logs..." && tail -20 weed-volume.log && exit 1) @echo "โœ… Volume server is ready" @echo "Starting filer server..." @$(WEED_BINARY) filer -port=$(FILER_PORT) \ -defaultStoreDir=test-volume-data/filerldb2 \ -master=localhost:$(MASTER_PORT) > weed-filer.log 2>&1 & \ echo $$! > $(FILER_PID_FILE) @echo "Waiting for filer server to be ready..." @timeout 60 bash -c 'until curl -s http://localhost:$(FILER_PORT)/status > /dev/null 2>&1; do echo "Waiting for filer server..."; sleep 2; done' || (echo "โŒ Filer failed to start, checking logs..." && tail -20 weed-filer.log && exit 1) @echo "โœ… Filer server is ready" @echo "Starting S3 API server with IAM..." @$(WEED_BINARY) -v=3 s3 -port=$(S3_PORT) \ -filer=localhost:$(FILER_PORT) \ -config=test_config.json \ -iam.config=$(CURDIR)/iam_config.json > weed-s3.log 2>&1 & \ echo $$! > $(S3_PID_FILE) @echo "Waiting for S3 API server to be ready..." @timeout 60 bash -c 'until curl -s http://localhost:$(S3_PORT) > /dev/null 2>&1; do echo "Waiting for S3 API server..."; sleep 2; done' || (echo "โŒ S3 API failed to start, checking logs..." && tail -20 weed-s3.log && exit 1) @echo "โœ… S3 API server is ready" @echo "โœ… All services started and ready" wait-for-services: ## Wait for all services to be ready @echo "โณ Waiting for services to be ready..." @echo "Checking master server..." @timeout 30 bash -c 'until curl -s http://localhost:$(MASTER_PORT)/cluster/status > /dev/null; do sleep 1; done' || (echo "โŒ Master failed to start" && exit 1) @echo "Checking filer server..." @timeout 30 bash -c 'until curl -s http://localhost:$(FILER_PORT)/status > /dev/null; do sleep 1; done' || (echo "โŒ Filer failed to start" && exit 1) @echo "Checking S3 API server..." @timeout 30 bash -c 'until curl -s http://localhost:$(S3_PORT) > /dev/null 2>&1; do sleep 1; done' || (echo "โŒ S3 API failed to start" && exit 1) @echo "Pre-allocating volumes for concurrent operations..." @curl -s "http://localhost:$(MASTER_PORT)/vol/grow?collection=default&count=10&replication=000" > /dev/null || echo "โš ๏ธ Volume pre-allocation failed, but continuing..." @sleep 3 @echo "โœ… All services are ready" stop-services: ## Stop all SeaweedFS services @echo "๐Ÿ›‘ Stopping SeaweedFS services..." @if [ -f $(S3_PID_FILE) ]; then \ echo "Stopping S3 API server..."; \ kill $$(cat $(S3_PID_FILE)) 2>/dev/null || true; \ rm -f $(S3_PID_FILE); \ fi @if [ -f $(FILER_PID_FILE) ]; then \ echo "Stopping filer server..."; \ kill $$(cat $(FILER_PID_FILE)) 2>/dev/null || true; \ rm -f $(FILER_PID_FILE); \ fi @if [ -f $(VOLUME_PID_FILE) ]; then \ echo "Stopping volume server..."; \ kill $$(cat $(VOLUME_PID_FILE)) 2>/dev/null || true; \ rm -f $(VOLUME_PID_FILE); \ fi @if [ -f $(MASTER_PID_FILE) ]; then \ echo "Stopping master server..."; \ kill $$(cat $(MASTER_PID_FILE)) 2>/dev/null || true; \ rm -f $(MASTER_PID_FILE); \ fi @echo "โœ… All services stopped" clean: stop-services ## Clean up test environment @echo "๐Ÿงน Cleaning up test environment..." @rm -rf test-volume-data @rm -f weed-*.log @rm -f *.test @echo "โœ… Cleanup complete" logs: ## Show service logs @echo "๐Ÿ“‹ Service Logs:" @echo "=== Master Log ===" @tail -20 weed-master.log 2>/dev/null || echo "No master log" @echo "" @echo "=== Volume Log ===" @tail -20 weed-volume.log 2>/dev/null || echo "No volume log" @echo "" @echo "=== Filer Log ===" @tail -20 weed-filer.log 2>/dev/null || echo "No filer log" @echo "" @echo "=== S3 API Log ===" @tail -20 weed-s3.log 2>/dev/null || echo "No S3 log" status: ## Check service status @echo "๐Ÿ“Š Service Status:" @echo -n "Master: "; curl -s http://localhost:$(MASTER_PORT)/cluster/status > /dev/null 2>&1 && echo "โœ… Running" || echo "โŒ Not running" @echo -n "Filer: "; curl -s http://localhost:$(FILER_PORT)/status > /dev/null 2>&1 && echo "โœ… Running" || echo "โŒ Not running" @echo -n "S3 API: "; curl -s http://localhost:$(S3_PORT) > /dev/null 2>&1 && echo "โœ… Running" || echo "โŒ Not running" debug: start-services wait-for-services ## Start services and keep them running for debugging @echo "๐Ÿ› Services started in debug mode. Press Ctrl+C to stop..." @trap 'make stop-services' INT; \ while true; do \ sleep 1; \ done # Test specific scenarios test-auth: ## Test only authentication scenarios go test -v -run TestS3IAMAuthentication ./... test-policy: ## Test only policy enforcement go test -v -run TestS3IAMPolicyEnforcement ./... test-expiration: ## Test only session expiration go test -v -run TestS3IAMSessionExpiration ./... test-multipart: ## Test only multipart upload IAM integration go test -v -run TestS3IAMMultipartUploadPolicyEnforcement ./... test-bucket-policy: ## Test only bucket policy integration go test -v -run TestS3IAMBucketPolicyIntegration ./... test-context: ## Test only contextual policy enforcement go test -v -run TestS3IAMContextualPolicyEnforcement ./... test-presigned: ## Test only presigned URL integration go test -v -run TestS3IAMPresignedURLIntegration ./... # Performance testing benchmark: setup start-services wait-for-services ## Run performance benchmarks @echo "๐Ÿ Running IAM performance benchmarks..." go test -bench=. -benchmem -timeout $(TEST_TIMEOUT) ./... @make stop-services # Continuous integration ci: ## Run tests suitable for CI environment @echo "๐Ÿ”„ Running CI tests..." @export CGO_ENABLED=0; make test # Development helpers watch: ## Watch for file changes and re-run tests @echo "๐Ÿ‘€ Watching for changes..." @command -v entr >/dev/null 2>&1 || (echo "entr is required for watch mode. Install with: brew install entr" && exit 1) @find . -name "*.go" | entr -r make test-quick install-deps: ## Install test dependencies @echo "๐Ÿ“ฆ Installing test dependencies..." go mod tidy go get -u github.com/stretchr/testify go get -u github.com/aws/aws-sdk-go go get -u github.com/golang-jwt/jwt/v5 # Docker support docker-test-legacy: ## Run tests in Docker container (legacy) @echo "๐Ÿณ Running tests in Docker..." docker build -f Dockerfile.test -t seaweedfs-s3-iam-test . docker run --rm -v $(PWD)/../../../:/app seaweedfs-s3-iam-test # Docker Compose support with Keycloak docker-up: ## Start all services with Docker Compose (including Keycloak) @echo "๐Ÿณ Starting services with Docker Compose including Keycloak..." @docker compose up -d @echo "โณ Waiting for services to be healthy..." @timeout 120 bash -c 'until curl -s http://localhost:8080/health/ready > /dev/null 2>&1; do sleep 2; done' || (echo "โŒ Keycloak failed to become ready" && exit 1) @timeout 60 bash -c 'until curl -s http://localhost:8333 > /dev/null 2>&1; do sleep 2; done' || (echo "โŒ S3 API failed to become ready" && exit 1) @timeout 60 bash -c 'until curl -s http://localhost:8888 > /dev/null 2>&1; do sleep 2; done' || (echo "โŒ Filer failed to become ready" && exit 1) @timeout 60 bash -c 'until curl -s http://localhost:9333 > /dev/null 2>&1; do sleep 2; done' || (echo "โŒ Master failed to become ready" && exit 1) @echo "โœ… All services are healthy and ready" docker-down: ## Stop all Docker Compose services @echo "๐Ÿณ Stopping Docker Compose services..." @docker compose down -v @echo "โœ… All services stopped" docker-logs: ## Show logs from all services @docker compose logs -f docker-test: docker-up ## Run tests with Docker Compose including Keycloak @echo "๐Ÿงช Running Keycloak integration tests..." @export KEYCLOAK_URL="http://localhost:8080" && \ export S3_ENDPOINT="http://localhost:8333" && \ go test -v -timeout $(TEST_TIMEOUT) -run "TestKeycloak" ./... @echo "๐Ÿณ Stopping services after tests..." @make docker-down docker-build: ## Build custom SeaweedFS image for Docker tests @echo "๐Ÿ—๏ธ Building custom SeaweedFS image..." @docker build -f Dockerfile.s3 -t seaweedfs-iam:latest ../../.. @echo "โœ… Image built successfully" # All PHONY targets .PHONY: test test-quick run-tests setup start-services stop-services wait-for-services clean logs status debug .PHONY: test-auth test-policy test-expiration test-multipart test-bucket-policy test-context test-presigned .PHONY: benchmark ci watch install-deps docker-test docker-up docker-down docker-logs docker-build .PHONY: test-distributed test-performance test-stress test-versioning-stress test-keycloak-full test-all-previously-skipped setup-all-tests help-advanced # New test targets for previously skipped tests test-distributed: ## Run distributed IAM tests @echo "๐ŸŒ Running distributed IAM tests..." @export ENABLE_DISTRIBUTED_TESTS=true && go test -v -timeout $(TEST_TIMEOUT) -run "TestS3IAMDistributedTests" ./... test-performance: ## Run performance tests @echo "๐Ÿ Running performance tests..." @export ENABLE_PERFORMANCE_TESTS=true && go test -v -timeout $(TEST_TIMEOUT) -run "TestS3IAMPerformanceTests" ./... test-stress: ## Run stress tests @echo "๐Ÿ’ช Running stress tests..." @export ENABLE_STRESS_TESTS=true && ./run_stress_tests.sh test-versioning-stress: ## Run S3 versioning stress tests @echo "๐Ÿ“š Running versioning stress tests..." @cd ../versioning && ./enable_stress_tests.sh test-keycloak-full: docker-up ## Run complete Keycloak integration tests @echo "๐Ÿ” Running complete Keycloak integration tests..." @export KEYCLOAK_URL="http://localhost:8080" && \ export S3_ENDPOINT="http://localhost:8333" && \ go test -v -timeout $(TEST_TIMEOUT) -run "TestKeycloak" ./... @make docker-down test-all-previously-skipped: ## Run all previously skipped tests @echo "๐ŸŽฏ Running all previously skipped tests..." @./run_all_tests.sh setup-all-tests: ## Setup environment for all tests (including Keycloak) @echo "๐Ÿš€ Setting up complete test environment..." @./setup_all_tests.sh