You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							312 lines
						
					
					
						
							9.6 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							312 lines
						
					
					
						
							9.6 KiB
						
					
					
				| # SeaweedFS FUSE Integration Testing Makefile | |
|  | |
| # Configuration | |
| WEED_BINARY := weed | |
| GO_VERSION := 1.21 | |
| TEST_TIMEOUT := 30m | |
| COVERAGE_FILE := coverage.out | |
| 
 | |
| # Default target | |
| .DEFAULT_GOAL := help | |
| 
 | |
| # Check if weed binary exists | |
| check-binary: | |
| 	@if [ ! -f "$(WEED_BINARY)" ]; then \ | |
| 		echo "❌ SeaweedFS binary not found at $(WEED_BINARY)"; \ | |
| 		echo "   Please run 'make' in the root directory first"; \ | |
| 		exit 1; \ | |
| 	fi | |
| 	@echo "✅ SeaweedFS binary found" | |
| 
 | |
| # Check FUSE installation | |
| check-fuse: | |
| 	@if command -v fusermount >/dev/null 2>&1; then \ | |
| 		echo "✅ FUSE is installed (Linux)"; \ | |
| 	elif command -v umount >/dev/null 2>&1 && [ "$$(uname)" = "Darwin" ]; then \ | |
| 		echo "✅ FUSE is available (macOS)"; \ | |
| 	else \ | |
| 		echo "❌ FUSE not found. Please install:"; \ | |
| 		echo "   Ubuntu/Debian: sudo apt-get install fuse"; \ | |
| 		echo "   CentOS/RHEL:   sudo yum install fuse"; \ | |
| 		echo "   macOS:         brew install macfuse"; \ | |
| 		exit 1; \ | |
| 	fi | |
| 
 | |
| # Check Go version | |
| check-go: | |
| 	@go version | grep -q "go1\.[2-9][0-9]" || \ | |
| 	go version | grep -q "go1\.2[1-9]" || \ | |
| 	(echo "❌ Go $(GO_VERSION)+ required. Current: $$(go version)" && exit 1) | |
| 	@echo "✅ Go version check passed" | |
| 
 | |
| # Verify all prerequisites | |
| check-prereqs: check-go check-fuse | |
| 	@echo "✅ All prerequisites satisfied" | |
| 
 | |
| # Build the SeaweedFS binary (if needed) | |
| build: | |
| 	@echo "🔨 Building SeaweedFS..." | |
| 	cd ../.. && make | |
| 	@echo "✅ Build complete" | |
| 
 | |
| # Initialize go module (if needed) | |
| init-module: | |
| 	@if [ ! -f go.mod ]; then \ | |
| 		echo "📦 Initializing Go module..."; \ | |
| 		go mod init seaweedfs-fuse-tests; \ | |
| 		go mod tidy; \ | |
| 	fi | |
| 
 | |
| # Run all tests | |
| test: check-prereqs init-module | |
| 	@echo "🧪 Running all FUSE integration tests..." | |
| 	go test -v -timeout $(TEST_TIMEOUT) ./... | |
| 
 | |
| # Run tests with coverage | |
| test-coverage: check-prereqs init-module | |
| 	@echo "🧪 Running tests with coverage..." | |
| 	go test -v -timeout $(TEST_TIMEOUT) -coverprofile=$(COVERAGE_FILE) ./... | |
| 	go tool cover -html=$(COVERAGE_FILE) -o coverage.html | |
| 	@echo "📊 Coverage report generated: coverage.html" | |
| 
 | |
| # Run specific test categories | |
| test-basic: check-prereqs init-module | |
| 	@echo "🧪 Running basic file operations tests..." | |
| 	go test -v -timeout $(TEST_TIMEOUT) -run TestBasicFileOperations | |
| 
 | |
| test-directory: check-prereqs init-module | |
| 	@echo "🧪 Running directory operations tests..." | |
| 	go test -v -timeout $(TEST_TIMEOUT) -run TestDirectoryOperations | |
| 
 | |
| test-concurrent: check-prereqs init-module | |
| 	@echo "🧪 Running concurrent operations tests..." | |
| 	go test -v -timeout $(TEST_TIMEOUT) -run TestConcurrentFileOperations | |
| 
 | |
| test-stress: check-prereqs init-module | |
| 	@echo "🧪 Running stress tests..." | |
| 	go test -v -timeout $(TEST_TIMEOUT) -run TestStressOperations | |
| 
 | |
| test-large-files: check-prereqs init-module | |
| 	@echo "🧪 Running large file tests..." | |
| 	go test -v -timeout $(TEST_TIMEOUT) -run TestLargeFileOperations | |
| 
 | |
| # Run tests with debugging enabled | |
| test-debug: check-prereqs init-module | |
| 	@echo "🔍 Running tests with debug output..." | |
| 	go test -v -timeout $(TEST_TIMEOUT) -args -debug | |
| 
 | |
| # Run tests and keep temp files for inspection | |
| test-no-cleanup: check-prereqs init-module | |
| 	@echo "🧪 Running tests without cleanup (for debugging)..." | |
| 	go test -v -timeout $(TEST_TIMEOUT) -args -no-cleanup | |
| 
 | |
| # Quick smoke test | |
| test-smoke: check-prereqs init-module | |
| 	@echo "💨 Running smoke tests..." | |
| 	go test -v -timeout 5m -run TestBasicFileOperations/CreateAndReadFile | |
| 
 | |
| # Run benchmarks | |
| benchmark: check-prereqs init-module | |
| 	@echo "📈 Running benchmarks..." | |
| 	go test -v -timeout $(TEST_TIMEOUT) -bench=. -benchmem | |
| 
 | |
| # Validate test files compile | |
| validate: init-module | |
| 	@echo "✅ Validating test files..." | |
| 	go build -o /dev/null ./... | |
| 	@echo "✅ All test files compile successfully" | |
| 
 | |
| # Clean up generated files | |
| clean: | |
| 	@echo "🧹 Cleaning up..." | |
| 	rm -f $(COVERAGE_FILE) coverage.html | |
| 	rm -rf /tmp/seaweedfs_fuse_test_* | |
| 	go clean -testcache | |
| 	@echo "✅ Cleanup complete" | |
| 
 | |
| # Format Go code | |
| fmt: | |
| 	@echo "🎨 Formatting Go code..." | |
| 	go fmt ./... | |
| 
 | |
| # Run linter | |
| lint: | |
| 	@echo "🔍 Running linter..." | |
| 	@if command -v golangci-lint >/dev/null 2>&1; then \ | |
| 		golangci-lint run; \ | |
| 	else \ | |
| 		echo "⚠️  golangci-lint not found, running go vet instead"; \ | |
| 		go vet ./...; \ | |
| 	fi | |
| 
 | |
| # Run all quality checks | |
| check: validate lint fmt | |
| 	@echo "✅ All quality checks passed" | |
| 
 | |
| # Install development dependencies | |
| install-deps: | |
| 	@echo "📦 Installing development dependencies..." | |
| 	go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest | |
| 	go mod download | |
| 	go mod tidy | |
| 
 | |
| # Quick development setup | |
| setup: install-deps build check-prereqs | |
| 	@echo "🚀 Development environment ready!" | |
| 
 | |
| # Docker-based testing | |
| test-docker: | |
| 	@echo "🐳 Running tests in Docker..." | |
| 	docker build -t seaweedfs-fuse-tests -f Dockerfile.test ../.. | |
| 	docker run --rm --privileged seaweedfs-fuse-tests | |
| 
 | |
| # Create Docker test image | |
| docker-build: | |
| 	@echo "🐳 Building Docker test image..." | |
| 	@cat > Dockerfile.test << 'EOF' ;\ | |
| FROM golang:$(GO_VERSION) ;\ | |
| RUN apt-get update && apt-get install -y fuse ;\ | |
| WORKDIR /seaweedfs ;\ | |
| COPY . . ;\ | |
| RUN make ;\ | |
| WORKDIR /seaweedfs/test/fuse ;\ | |
| RUN go mod init seaweedfs-fuse-tests && go mod tidy ;\ | |
| CMD ["make", "test"] ;\ | |
| EOF | |
| 
 | |
| # GitHub Actions workflow | |
| generate-workflow: | |
| 	@echo "📝 Generating GitHub Actions workflow..." | |
| 	@mkdir -p ../../.github/workflows | |
| 	@cat > ../../.github/workflows/fuse-integration.yml << 'EOF' ;\ | |
| name: FUSE Integration Tests ;\ | |
|  ;\ | |
| on: ;\ | |
|   push: ;\ | |
|     branches: [ master, main ] ;\ | |
|   pull_request: ;\ | |
|     branches: [ master, main ] ;\ | |
|  ;\ | |
| jobs: ;\ | |
|   fuse-integration: ;\ | |
|     runs-on: ubuntu-latest ;\ | |
|     timeout-minutes: 45 ;\ | |
|      ;\ | |
|     steps: ;\ | |
|     - name: Checkout code ;\ | |
|       uses: actions/checkout@v4 ;\ | |
|        ;\ | |
|     - name: Set up Go ;\ | |
|       uses: actions/setup-go@v4 ;\ | |
|       with: ;\ | |
|         go-version: '$(GO_VERSION)' ;\ | |
|          ;\ | |
|     - name: Install FUSE ;\ | |
|       run: sudo apt-get update && sudo apt-get install -y fuse ;\ | |
|        ;\ | |
|     - name: Build SeaweedFS ;\ | |
|       run: make ;\ | |
|        ;\ | |
|     - name: Run FUSE Integration Tests ;\ | |
|       run: | ;\ | |
|         cd test/fuse ;\ | |
|         make test ;\ | |
|          ;\ | |
|     - name: Upload test artifacts ;\ | |
|       if: failure() ;\ | |
|       uses: actions/upload-artifact@v3 ;\ | |
|       with: ;\ | |
|         name: test-logs ;\ | |
|         path: /tmp/seaweedfs_fuse_test_* ;\ | |
| EOF | |
| 	@echo "✅ GitHub Actions workflow generated" | |
| 
 | |
| # Performance profiling | |
| profile: check-prereqs init-module | |
| 	@echo "📊 Running performance profiling..." | |
| 	go test -v -timeout $(TEST_TIMEOUT) -cpuprofile cpu.prof -memprofile mem.prof -bench=. | |
| 	@echo "📊 Profiles generated: cpu.prof, mem.prof" | |
| 	@echo "📊 View with: go tool pprof cpu.prof" | |
| 
 | |
| # Memory leak detection | |
| test-memory: check-prereqs init-module | |
| 	@echo "🔍 Running memory leak detection..." | |
| 	go test -v -timeout $(TEST_TIMEOUT) -race -test.memprofile mem.prof | |
| 
 | |
| # List available test functions | |
| list-tests: | |
| 	@echo "📋 Available test functions:" | |
| 	@grep -r "^func Test" *.go | sed 's/.*func \(Test[^(]*\).*/  \1/' | sort | |
| 
 | |
| # Get test status and statistics | |
| test-stats: check-prereqs init-module | |
| 	@echo "📊 Test statistics:" | |
| 	@go test -v ./... | grep -E "(PASS|FAIL|RUN)" | \ | |
| 		awk '{ \ | |
| 			if ($$1 == "RUN") tests++; \ | |
| 			else if ($$1 == "PASS") passed++; \ | |
| 			else if ($$1 == "FAIL") failed++; \ | |
| 		} END { \ | |
| 			printf "  Total tests: %d\n", tests; \ | |
| 			printf "  Passed: %d\n", passed; \ | |
| 			printf "  Failed: %d\n", failed; \ | |
| 			printf "  Success rate: %.1f%%\n", (passed/tests)*100; \ | |
| 		}' | |
| 
 | |
| # Watch for file changes and run tests | |
| watch: | |
| 	@echo "👀 Watching for changes..." | |
| 	@if command -v entr >/dev/null 2>&1; then \ | |
| 		find . -name "*.go" | entr -c make test-smoke; \ | |
| 	else \ | |
| 		echo "⚠️  'entr' not found. Install with: apt-get install entr"; \ | |
| 		echo "   Falling back to manual test run"; \ | |
| 		make test-smoke; \ | |
| 	fi | |
| 
 | |
| # Show help | |
| help: | |
| 	@echo "SeaweedFS FUSE Integration Testing" | |
| 	@echo "==================================" | |
| 	@echo "" | |
| 	@echo "Prerequisites:" | |
| 	@echo "  make check-prereqs    - Check all prerequisites" | |
| 	@echo "  make setup           - Complete development setup" | |
| 	@echo "  make build           - Build SeaweedFS binary" | |
| 	@echo "" | |
| 	@echo "Testing:" | |
| 	@echo "  make test            - Run all tests" | |
| 	@echo "  make test-basic      - Run basic file operations tests" | |
| 	@echo "  make test-directory  - Run directory operations tests" | |
| 	@echo "  make test-concurrent - Run concurrent operations tests" | |
| 	@echo "  make test-stress     - Run stress tests" | |
| 	@echo "  make test-smoke      - Quick smoke test" | |
| 	@echo "  make test-coverage   - Run tests with coverage report" | |
| 	@echo "" | |
| 	@echo "Debugging:" | |
| 	@echo "  make test-debug      - Run tests with debug output" | |
| 	@echo "  make test-no-cleanup - Keep temp files for inspection" | |
| 	@echo "  make profile         - Performance profiling" | |
| 	@echo "  make test-memory     - Memory leak detection" | |
| 	@echo "" | |
| 	@echo "Quality:" | |
| 	@echo "  make validate        - Validate test files compile" | |
| 	@echo "  make lint            - Run linter" | |
| 	@echo "  make fmt             - Format code" | |
| 	@echo "  make check           - Run all quality checks" | |
| 	@echo "" | |
| 	@echo "Utilities:" | |
| 	@echo "  make clean           - Clean up generated files" | |
| 	@echo "  make list-tests      - List available test functions" | |
| 	@echo "  make test-stats      - Show test statistics" | |
| 	@echo "  make watch           - Watch files and run smoke tests" | |
| 	@echo "" | |
| 	@echo "Docker & CI:" | |
| 	@echo "  make test-docker     - Run tests in Docker" | |
| 	@echo "  make generate-workflow - Generate GitHub Actions workflow" | |
| 
 | |
| .PHONY: help check-prereqs check-binary check-fuse check-go build init-module \ | |
|         test test-coverage test-basic test-directory test-concurrent test-stress \ | |
|         test-large-files test-debug test-no-cleanup test-smoke benchmark validate \ | |
|         clean fmt lint check install-deps setup test-docker docker-build \ | |
|         generate-workflow profile test-memory list-tests test-stats watch
 |