# SeaweedFS POSIX Compliance Testing Makefile # Configuration WEED_BINARY := $(shell which weed 2>/dev/null || echo "../../weed") GO_VERSION := 1.21 TEST_TIMEOUT := 45m COVERAGE_FILE := posix_coverage.out REPORT_DIR := reports EXTERNAL_TOOLS_DIR := external_tools # Test categories POSIX_BASIC_TESTS := posix_compliance_test.go POSIX_EXTENDED_TESTS := posix_extended_test.go POSIX_EXTERNAL_TESTS := posix_external_test.go # Colors for output RED := \033[31m GREEN := \033[32m YELLOW := \033[33m BLUE := \033[34m MAGENTA := \033[35m CYAN := \033[36m WHITE := \033[37m RESET := \033[0m .DEFAULT_GOAL := help # Prerequisites checks check-binary: @if [ ! -f "$(WEED_BINARY)" ]; then \ echo "$(RED)❌ SeaweedFS binary not found at $(WEED_BINARY)$(RESET)"; \ echo " Please run 'make' in the root directory first"; \ exit 1; \ fi @echo "$(GREEN)✅ SeaweedFS binary found at $(WEED_BINARY)$(RESET)" check-fuse: @if command -v fusermount >/dev/null 2>&1; then \ echo "$(GREEN)✅ FUSE is installed (Linux)$(RESET)"; \ elif command -v umount >/dev/null 2>&1 && [ "$$(uname)" = "Darwin" ]; then \ echo "$(GREEN)✅ FUSE is available (macOS)$(RESET)"; \ else \ echo "$(RED)❌ FUSE not found. Please install:$(RESET)"; \ 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: @go version | grep -q "go1\.[2-9][0-9]" || \ go version | grep -q "go1\.2[1-9]" || \ (echo "$(RED)❌ Go $(GO_VERSION)+ required. Current: $$(go version)$(RESET)" && exit 1) @echo "$(GREEN)✅ Go version check passed$(RESET)" check-prereqs: check-go check-fuse check-binary @echo "$(GREEN)✅ All prerequisites satisfied$(RESET)" # Setup and initialization init-module: @if [ ! -f go.mod ]; then \ echo "$(BLUE)📦 Initializing Go module...$(RESET)"; \ go mod init seaweedfs-posix-tests; \ go mod tidy; \ fi setup-reports: @mkdir -p $(REPORT_DIR) @mkdir -p $(EXTERNAL_TOOLS_DIR) setup-external-tools: setup-reports @echo "$(BLUE)🛠️ Setting up external POSIX test tools...$(RESET)" @$(MAKE) setup-pjdfstest @$(MAKE) setup-nfstest @$(MAKE) setup-fio # External tools setup setup-pjdfstest: @if [ ! -d "$(EXTERNAL_TOOLS_DIR)/pjdfstest" ]; then \ echo "$(BLUE)📥 Setting up pjdfstest...$(RESET)"; \ cd $(EXTERNAL_TOOLS_DIR) && \ git clone https://github.com/pjd/pjdfstest.git && \ cd pjdfstest && \ autoreconf -ifs && \ ./configure && \ make; \ else \ echo "$(GREEN)✅ pjdfstest already setup$(RESET)"; \ fi setup-nfstest: @echo "$(BLUE)📥 Installing nfstest...$(RESET)" @pip3 install --user nfstest 2>/dev/null || \ echo "$(YELLOW)⚠️ nfstest installation failed. Install manually: pip3 install nfstest$(RESET)" setup-fio: @if ! command -v fio >/dev/null 2>&1; then \ echo "$(BLUE)📥 Installing FIO...$(RESET)"; \ if command -v apt-get >/dev/null 2>&1; then \ sudo apt-get update && sudo apt-get install -y fio; \ elif command -v yum >/dev/null 2>&1; then \ sudo yum install -y fio; \ elif command -v brew >/dev/null 2>&1; then \ brew install fio; \ else \ echo "$(YELLOW)⚠️ Please install FIO manually$(RESET)"; \ fi; \ else \ echo "$(GREEN)✅ FIO already installed$(RESET)"; \ fi # Core test execution test-posix-basic: check-prereqs init-module setup-reports @echo "$(CYAN)🧪 Running basic POSIX compliance tests...$(RESET)" @if [ -n "$(TEST_MOUNT_POINT)" ]; then \ echo "$(BLUE)Using external mount point: $(TEST_MOUNT_POINT)$(RESET)"; \ TEST_MOUNT_POINT="$(TEST_MOUNT_POINT)" TEST_SKIP_CLUSTER_SETUP="true" \ go test -v -timeout $(TEST_TIMEOUT) -run TestPOSIXCompliance $(POSIX_BASIC_TESTS) 2>&1 | \ tee $(REPORT_DIR)/posix_basic_results.log; \ else \ go test -v -timeout $(TEST_TIMEOUT) -run TestPOSIXCompliance $(POSIX_BASIC_TESTS) 2>&1 | \ tee $(REPORT_DIR)/posix_basic_results.log; \ fi test-posix-extended: check-prereqs init-module setup-reports @echo "$(CYAN)🧪 Running extended POSIX compliance tests...$(RESET)" @if [ -n "$(TEST_MOUNT_POINT)" ]; then \ echo "$(BLUE)Using external mount point: $(TEST_MOUNT_POINT)$(RESET)"; \ TEST_MOUNT_POINT="$(TEST_MOUNT_POINT)" TEST_SKIP_CLUSTER_SETUP="true" \ go test -v -timeout $(TEST_TIMEOUT) -run TestPOSIXExtended $(POSIX_EXTENDED_TESTS) 2>&1 | \ tee $(REPORT_DIR)/posix_extended_results.log; \ else \ go test -v -timeout $(TEST_TIMEOUT) -run TestPOSIXExtended $(POSIX_EXTENDED_TESTS) 2>&1 | \ tee $(REPORT_DIR)/posix_extended_results.log; \ fi test-posix-external: check-prereqs init-module setup-reports setup-external-tools @echo "$(CYAN)🧪 Running external POSIX test suite integration...$(RESET)" @if [ -n "$(TEST_MOUNT_POINT)" ]; then \ echo "$(BLUE)Using external mount point: $(TEST_MOUNT_POINT)$(RESET)"; \ TEST_MOUNT_POINT="$(TEST_MOUNT_POINT)" TEST_SKIP_CLUSTER_SETUP="true" \ go test -v -timeout $(TEST_TIMEOUT) -run TestExternalPOSIXSuites $(POSIX_EXTERNAL_TESTS) 2>&1 | \ tee $(REPORT_DIR)/posix_external_results.log; \ else \ go test -v -timeout $(TEST_TIMEOUT) -run TestExternalPOSIXSuites $(POSIX_EXTERNAL_TESTS) 2>&1 | \ tee $(REPORT_DIR)/posix_external_results.log; \ fi # Comprehensive test suites test-posix-full: test-posix-basic test-posix-extended test-posix-external @echo "$(GREEN)✅ Full POSIX compliance test suite completed$(RESET)" @$(MAKE) generate-report test-posix-critical: check-prereqs init-module setup-reports @echo "$(CYAN)🧪 Running critical POSIX compliance tests...$(RESET)" @if [ -n "$(TEST_MOUNT_POINT)" ]; then \ echo "$(BLUE)Using external mount point: $(TEST_MOUNT_POINT)$(RESET)"; \ TEST_MOUNT_POINT="$(TEST_MOUNT_POINT)" TEST_SKIP_CLUSTER_SETUP="true" \ go test -v -timeout 15m \ -run "TestPOSIXCompliance/(FileOperations|DirectoryOperations|PermissionTests|IOOperations)" \ $(POSIX_BASIC_TESTS) 2>&1 | tee $(REPORT_DIR)/posix_critical_results.log; \ else \ go test -v -timeout 15m \ -run "TestPOSIXCompliance/(FileOperations|DirectoryOperations|PermissionTests|IOOperations)" \ $(POSIX_BASIC_TESTS) 2>&1 | tee $(REPORT_DIR)/posix_critical_results.log; \ fi test-posix-stress: check-prereqs init-module setup-reports @echo "$(CYAN)🧪 Running POSIX stress tests...$(RESET)" @go test -v -timeout $(TEST_TIMEOUT) \ -run "TestExternalPOSIXSuites/CustomPOSIXTests" \ $(POSIX_EXTERNAL_TESTS) 2>&1 | tee $(REPORT_DIR)/posix_stress_results.log # Performance and benchmarks benchmark-posix: check-prereqs init-module setup-reports @echo "$(CYAN)📈 Running POSIX performance benchmarks...$(RESET)" @go test -v -timeout $(TEST_TIMEOUT) -bench=. -benchmem \ $(POSIX_BASIC_TESTS) $(POSIX_EXTENDED_TESTS) 2>&1 | \ tee $(REPORT_DIR)/posix_benchmark_results.log profile-posix: check-prereqs init-module setup-reports @echo "$(CYAN)📊 Running POSIX tests with profiling...$(RESET)" @go test -v -timeout $(TEST_TIMEOUT) -cpuprofile $(REPORT_DIR)/posix.cpu.prof \ -memprofile $(REPORT_DIR)/posix.mem.prof -run TestPOSIXCompliance $(POSIX_BASIC_TESTS) @echo "$(GREEN)📊 Profiles generated:$(RESET)" @echo " CPU: $(REPORT_DIR)/posix.cpu.prof" @echo " Memory: $(REPORT_DIR)/posix.mem.prof" @echo "$(BLUE)View with: go tool pprof $(REPORT_DIR)/posix.cpu.prof$(RESET)" # Coverage analysis coverage-posix: check-prereqs init-module setup-reports @echo "$(CYAN)📊 Running POSIX tests with coverage analysis...$(RESET)" @go test -v -timeout $(TEST_TIMEOUT) -coverprofile=$(REPORT_DIR)/$(COVERAGE_FILE) \ $(POSIX_BASIC_TESTS) $(POSIX_EXTENDED_TESTS) $(POSIX_EXTERNAL_TESTS) @go tool cover -html=$(REPORT_DIR)/$(COVERAGE_FILE) -o $(REPORT_DIR)/posix_coverage.html @echo "$(GREEN)📊 Coverage report generated: $(REPORT_DIR)/posix_coverage.html$(RESET)" # External tool tests test-pjdfstest: setup-external-tools @echo "$(CYAN)🧪 Running pjdfstest suite...$(RESET)" @if [ -d "$(EXTERNAL_TOOLS_DIR)/pjdfstest" ]; then \ cd $(EXTERNAL_TOOLS_DIR)/pjdfstest && \ prove -r tests/ 2>&1 | tee ../../$(REPORT_DIR)/pjdfstest_results.log; \ else \ echo "$(RED)❌ pjdfstest not setup$(RESET)"; \ exit 1; \ fi test-nfstest-posix: @echo "$(CYAN)🧪 Running nfstest_posix...$(RESET)" @if command -v nfstest_posix >/dev/null 2>&1; then \ mkdir -p /tmp/nfstest_mount; \ nfstest_posix --path /tmp/nfstest_mount --verbose 2>&1 | \ tee $(REPORT_DIR)/nfstest_results.log; \ else \ echo "$(YELLOW)⚠️ nfstest_posix not available$(RESET)"; \ fi # FIO-based performance tests test-fio-posix: setup-reports @echo "$(CYAN)🧪 Running FIO-based POSIX I/O tests...$(RESET)" @$(MAKE) create-fio-configs @if command -v fio >/dev/null 2>&1; then \ for config in $(REPORT_DIR)/fio_*.conf; do \ echo "$(BLUE)Running FIO config: $$config$(RESET)"; \ fio $$config --output=$(REPORT_DIR)/$$(basename $$config .conf)_results.log; \ done; \ else \ echo "$(YELLOW)⚠️ FIO not available$(RESET)"; \ fi create-fio-configs: setup-reports @echo "$(BLUE)📝 Creating FIO test configurations...$(RESET)" @cat > $(REPORT_DIR)/fio_random_rw.conf << 'EOF' [global] name=posix_random_rw ioengine=sync iodepth=1 rw=randrw bs=4k direct=0 size=100m numjobs=4 runtime=30 time_based [random_rw_test] directory=/tmp/seaweedfs_mount EOF @cat > $(REPORT_DIR)/fio_sequential.conf << 'EOF' [global] name=posix_sequential ioengine=sync iodepth=1 bs=1m direct=0 size=500m runtime=60 time_based [seq_write] rw=write directory=/tmp/seaweedfs_mount [seq_read] rw=read directory=/tmp/seaweedfs_mount EOF # Reporting and analysis generate-report: setup-reports @echo "$(BLUE)📋 Generating comprehensive POSIX compliance report...$(RESET)" @$(MAKE) generate-html-report @$(MAKE) generate-text-report @$(MAKE) generate-json-report generate-html-report: @echo "$(BLUE)📄 Generating HTML report...$(RESET)" @cat > $(REPORT_DIR)/posix_compliance_report.html << 'EOF' SeaweedFS POSIX Compliance Report

SeaweedFS POSIX Compliance Report

Generated: $(shell date)

SeaweedFS Version: $(shell $(WEED_BINARY) version 2>/dev/null || echo "Unknown")

Executive Summary

This report provides a comprehensive analysis of SeaweedFS FUSE mount POSIX compliance.

Test Categories

CategoryStatusDetails
Basic File OperationsSee detailed resultsCreate, read, write, delete operations
Directory OperationsSee detailed resultsDirectory lifecycle management
Extended AttributesSee detailed resultsxattr support and operations
File LockingSee detailed resultsAdvisory and mandatory locking
Advanced I/OSee detailed resultsreadv/writev, pread/pwrite, mmap
External Test SuitesSee detailed resultspjdfstest, nfstest integration

Detailed Results

See individual log files for detailed test results:

EOF @echo "$(GREEN)📄 HTML report generated: $(REPORT_DIR)/posix_compliance_report.html$(RESET)" generate-text-report: @echo "$(BLUE)📄 Generating text report...$(RESET)" @cat > $(REPORT_DIR)/posix_compliance_summary.txt << 'EOF' SeaweedFS POSIX Compliance Report ================================= Generated: $(shell date) SeaweedFS Version: $(shell $(WEED_BINARY) version 2>/dev/null || echo "Unknown") Test Summary: ------------ Basic File Operations: [See posix_basic_results.log] Directory Operations: [See posix_basic_results.log] Symlink Operations: [See posix_basic_results.log] Permission Tests: [See posix_basic_results.log] Timestamp Tests: [See posix_basic_results.log] Extended Attributes: [See posix_extended_results.log] File Locking: [See posix_extended_results.log] Advanced I/O: [See posix_extended_results.log] Memory Mapping: [See posix_extended_results.log] External Test Suites: [See posix_external_results.log] Performance Benchmarks: ---------------------- [See posix_benchmark_results.log] Coverage Analysis: ----------------- [See posix_coverage.html] Recommendations: --------------- 1. Review any test failures in the detailed logs 2. Consider implementing missing POSIX features if critical for your use case 3. Monitor performance characteristics for your specific workload 4. Re-run tests periodically to catch regressions For questions or issues, please refer to the SeaweedFS documentation or open an issue at https://github.com/seaweedfs/seaweedfs/issues EOF @echo "$(GREEN)📄 Text report generated: $(REPORT_DIR)/posix_compliance_summary.txt$(RESET)" generate-json-report: @echo "$(BLUE)📄 Generating JSON report...$(RESET)" @cat > $(REPORT_DIR)/posix_compliance_report.json << 'EOF' { "report_type": "posix_compliance", "timestamp": "$(shell date -u +"%Y-%m-%dT%H:%M:%SZ")", "seaweedfs_version": "$(shell $(WEED_BINARY) version 2>/dev/null | head -n1 || echo "Unknown")", "test_environment": { "os": "$(shell uname -s)", "arch": "$(shell uname -m)", "go_version": "$(shell go version)" }, "test_categories": { "basic_file_operations": { "status": "executed", "log_file": "posix_basic_results.log" }, "extended_attributes": { "status": "executed", "log_file": "posix_extended_results.log" }, "external_test_suites": { "status": "executed", "log_file": "posix_external_results.log" } }, "summary": { "total_categories": 3, "executed_categories": 3, "success_rate": "See individual logs for details" } } EOF @echo "$(GREEN)📄 JSON report generated: $(REPORT_DIR)/posix_compliance_report.json$(RESET)" # Cleanup and maintenance clean: @echo "$(YELLOW)🧹 Cleaning up test artifacts...$(RESET)" @rm -rf $(REPORT_DIR) @rm -rf /tmp/seaweedfs_*_test_* @go clean -testcache @echo "$(GREEN)✅ Cleanup complete$(RESET)" clean-external-tools: @echo "$(YELLOW)🧹 Cleaning up external tools...$(RESET)" @rm -rf $(EXTERNAL_TOOLS_DIR) clean-all: clean clean-external-tools # Development and debugging validate: @echo "$(BLUE)✅ Validating test files...$(RESET)" @go build -o /dev/null ./... @echo "$(GREEN)✅ All test files compile successfully$(RESET)" fmt: @echo "$(BLUE)🎨 Formatting Go code...$(RESET)" @go fmt ./... lint: @echo "$(BLUE)🔍 Running linter...$(RESET)" @if command -v golangci-lint >/dev/null 2>&1; then \ golangci-lint run; \ else \ echo "$(YELLOW)⚠️ golangci-lint not found, running go vet instead$(RESET)"; \ go vet ./...; \ fi # CI/CD integration ci-posix-tests: check-prereqs init-module setup-external-tools @echo "$(CYAN)🚀 Running POSIX tests for CI/CD...$(RESET)" @$(MAKE) test-posix-critical @$(MAKE) generate-report # Docker-based testing docker-test-posix: @echo "$(BLUE)🐳 Running POSIX tests in Docker...$(RESET)" @docker build -f Dockerfile.posix -t seaweedfs-posix-tests ../.. @docker run --rm --privileged -v $(PWD)/$(REPORT_DIR):/reports seaweedfs-posix-tests # Documentation and help list-tests: @echo "$(BLUE)📋 Available POSIX test functions:$(RESET)" @grep -r "^func Test" *.go 2>/dev/null | sed 's/.*func \(Test[^(]*\).*/ \1/' | sort || echo "No test files found" test-info: @echo "$(BLUE)📊 POSIX Test Information:$(RESET)" @echo "Test files:" @echo " - $(POSIX_BASIC_TESTS): Core POSIX compliance tests" @echo " - $(POSIX_EXTENDED_TESTS): Extended POSIX feature tests" @echo " - $(POSIX_EXTERNAL_TESTS): External test suite integration" @echo "" @echo "External tools:" @echo " - pjdfstest: Comprehensive POSIX filesystem test suite" @echo " - nfstest: Network filesystem POSIX API verification" @echo " - FIO: Flexible I/O performance testing" help: @echo "$(CYAN)SeaweedFS POSIX Compliance Testing$(RESET)" @echo "==================================" @echo "" @echo "$(WHITE)Prerequisites:$(RESET)" @echo " $(GREEN)make check-prereqs$(RESET) - Check all prerequisites" @echo " $(GREEN)make setup-external-tools$(RESET) - Setup external POSIX test tools" @echo "" @echo "$(WHITE)Core POSIX Tests:$(RESET)" @echo " $(GREEN)make test-posix-basic$(RESET) - Run basic POSIX compliance tests" @echo " $(GREEN)make test-posix-extended$(RESET) - Run extended POSIX feature tests" @echo " $(GREEN)make test-posix-external$(RESET) - Run external test suite integration" @echo " $(GREEN)make test-posix-full$(RESET) - Run complete POSIX test suite" @echo "" @echo "$(WHITE)Focused Tests:$(RESET)" @echo " $(GREEN)make test-posix-critical$(RESET) - Run critical POSIX compliance tests" @echo " $(GREEN)make test-posix-stress$(RESET) - Run POSIX stress tests" @echo "" @echo "$(WHITE)Performance & Analysis:$(RESET)" @echo " $(GREEN)make benchmark-posix$(RESET) - Run POSIX performance benchmarks" @echo " $(GREEN)make profile-posix$(RESET) - Run tests with performance profiling" @echo " $(GREEN)make coverage-posix$(RESET) - Run tests with coverage analysis" @echo " $(GREEN)make test-fio-posix$(RESET) - Run FIO-based I/O performance tests" @echo "" @echo "$(WHITE)External Test Suites:$(RESET)" @echo " $(GREEN)make test-pjdfstest$(RESET) - Run pjdfstest suite" @echo " $(GREEN)make test-nfstest-posix$(RESET) - Run nfstest_posix" @echo "" @echo "$(WHITE)Reporting:$(RESET)" @echo " $(GREEN)make generate-report$(RESET) - Generate comprehensive compliance report" @echo "" @echo "$(WHITE)Development:$(RESET)" @echo " $(GREEN)make validate$(RESET) - Validate test file compilation" @echo " $(GREEN)make fmt$(RESET) - Format Go code" @echo " $(GREEN)make lint$(RESET) - Run linter" @echo " $(GREEN)make list-tests$(RESET) - List available test functions" @echo "" @echo "$(WHITE)Maintenance:$(RESET)" @echo " $(GREEN)make clean$(RESET) - Clean up test artifacts" @echo " $(GREEN)make clean-all$(RESET) - Clean everything including external tools" @echo "" @echo "$(WHITE)CI/CD Integration:$(RESET)" @echo " $(GREEN)make ci-posix-tests$(RESET) - Run POSIX tests optimized for CI/CD" @echo " $(GREEN)make docker-test-posix$(RESET) - Run tests in Docker container" .PHONY: help check-prereqs check-binary check-fuse check-go init-module setup-reports \ setup-external-tools setup-pjdfstest setup-nfstest setup-fio \ test-posix-basic test-posix-extended test-posix-external test-posix-full \ test-posix-critical test-posix-stress benchmark-posix profile-posix coverage-posix \ test-pjdfstest test-nfstest-posix test-fio-posix create-fio-configs \ generate-report generate-html-report generate-text-report generate-json-report \ clean clean-external-tools clean-all validate fmt lint ci-posix-tests \ docker-test-posix list-tests test-info