name: "NFS Integration Tests" on: push: branches: [ master, main ] paths: - 'weed/server/nfs/**' - 'weed/command/nfs.go' - 'weed/filer/filer_inode.go' - 'weed/filer/filer_inode_index.go' - 'weed/filer/filerstore_wrapper.go' - 'weed/server/filer_grpc_server_rename.go' - 'test/nfs/**' - '.github/workflows/nfs-tests.yml' pull_request: branches: [ master, main ] paths: - 'weed/server/nfs/**' - 'weed/command/nfs.go' - 'weed/filer/filer_inode.go' - 'weed/filer/filer_inode_index.go' - 'weed/filer/filerstore_wrapper.go' - 'weed/server/filer_grpc_server_rename.go' - 'test/nfs/**' - '.github/workflows/nfs-tests.yml' concurrency: group: ${{ github.head_ref }}/nfs-tests cancel-in-progress: true permissions: contents: read env: TEST_TIMEOUT: '15m' jobs: nfs-integration: name: NFS Integration Testing runs-on: ubuntu-22.04 timeout-minutes: 20 steps: - name: Checkout code uses: actions/checkout@v6 - name: Set up Go uses: actions/setup-go@v6 with: go-version-file: 'go.mod' - name: Build SeaweedFS run: | cd weed go build -o weed . chmod +x weed ./weed version - name: Run NFS Integration Tests run: | cd test/nfs echo "Running NFS integration tests..." echo "============================================" # Install test dependencies go mod download # Run all NFS tests go test -v -timeout=${{ env.TEST_TIMEOUT }} ./... echo "============================================" echo "NFS integration tests completed" - name: Test Summary if: always() run: | echo "## NFS Integration Test Summary" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### Test Coverage" >> $GITHUB_STEP_SUMMARY echo "- **Read/Write Round Trip**: Basic file create + read" >> $GITHUB_STEP_SUMMARY echo "- **Directory Operations**: Mkdir, ReadDirPlus, RmDir" >> $GITHUB_STEP_SUMMARY echo "- **Nested Directories**: Deep tree creation and leaf I/O" >> $GITHUB_STEP_SUMMARY echo "- **Rename**: Content preserved across rename" >> $GITHUB_STEP_SUMMARY echo "- **Overwrite + Truncate**: Setattr(size=0) + shorter write" >> $GITHUB_STEP_SUMMARY echo "- **Large Files**: 3 MiB binary round trip" >> $GITHUB_STEP_SUMMARY echo "- **Edge Payloads**: All 256 byte values + empty files" >> $GITHUB_STEP_SUMMARY echo "- **Symlinks**: Symlink + Lookup" >> $GITHUB_STEP_SUMMARY echo "- **Missing Path**: Remove on missing entry errors cleanly" >> $GITHUB_STEP_SUMMARY echo "- **FSINFO**: Non-zero rtpref/wtpref advertised" >> $GITHUB_STEP_SUMMARY echo "- **Sequential Append**: Two-part concatenation" >> $GITHUB_STEP_SUMMARY echo "- **ReadDir After Remove**: Meta cache does not serve stale entries" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "### Harness" >> $GITHUB_STEP_SUMMARY echo "Each test boots its own master + volume + filer + nfs subprocess" >> $GITHUB_STEP_SUMMARY echo "stack on loopback and drives it via the NFSv3 RPC protocol using" >> $GITHUB_STEP_SUMMARY echo "go-nfs-client. No kernel NFS mount or privileged port is required." >> $GITHUB_STEP_SUMMARY