mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-10-06 06:22:05 +02:00
192 lines
5.1 KiB
Markdown
192 lines
5.1 KiB
Markdown
# S3 Integration Tests Modernization - Complete Summary
|
|
|
|
## Overview
|
|
Modernized all S3 integration tests to use **weed mini** - a single optimized binary for simplified testing infrastructure. This eliminates the need to manually manage separate master, volume, and filer server processes.
|
|
|
|
## Feature Branch
|
|
- **Branch**: `feature/modernize-s3-tests`
|
|
- **PR**: #7876
|
|
- **Status**: ✅ Complete - All changes committed and pushed
|
|
|
|
## Infrastructure Changes
|
|
|
|
### 1. Shared Server Management (`test/s3/testutil/server.go`)
|
|
**Purpose**: Centralized server lifecycle management for all test suites
|
|
|
|
**Key Features**:
|
|
- Auto-discovers weed binary at runtime
|
|
- Creates isolated test data directory (`/tmp/weed-test-data`)
|
|
- Configurable S3 port (default 8333)
|
|
- HTTP health check polling for startup verification
|
|
- Graceful shutdown with process cleanup
|
|
|
|
**API**:
|
|
```go
|
|
type ServerConfig struct {
|
|
DataDir string
|
|
S3Port int
|
|
AccessKey string
|
|
SecretKey string
|
|
StartupWait time.Duration
|
|
}
|
|
|
|
func StartServer(config ServerConfig) (*Server, error)
|
|
func (s *Server) Stop() error
|
|
func (s *Server) WaitForReady() error
|
|
```
|
|
|
|
**Usage**: All test suites import and use `testutil.StartServer()`
|
|
|
|
### 2. TestMain Pattern (13 test suites)
|
|
**File**: `test/s3/{suite}/s3_test_main.go`
|
|
|
|
**Pattern**:
|
|
```go
|
|
package {suite_package}
|
|
|
|
import (
|
|
"os"
|
|
"testing"
|
|
"github.com/seaweedfs/seaweedfs/test/s3/testutil"
|
|
)
|
|
|
|
var testServer *testutil.Server
|
|
|
|
func TestMain(m *testing.M) {
|
|
// Skip if using external server (CI/CD)
|
|
if os.Getenv("USE_EXTERNAL_SERVER") == "true" {
|
|
os.Exit(m.Run())
|
|
}
|
|
|
|
// Start auto-managed server
|
|
var err error
|
|
testServer, err = testutil.StartServer(testutil.ServerConfig{
|
|
S3Port: 8333,
|
|
// ... other config
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer testServer.Stop()
|
|
|
|
// Run all tests
|
|
os.Exit(m.Run())
|
|
}
|
|
```
|
|
|
|
**Benefits**:
|
|
- ✅ Automatic server lifecycle management
|
|
- ✅ Backward compatible with external servers (USE_EXTERNAL_SERVER env var)
|
|
- ✅ Per-suite isolation
|
|
- ✅ No code changes needed in existing tests
|
|
|
|
## Test Suites Modernized
|
|
|
|
| Suite | Package | Tests | Status |
|
|
|-------|---------|-------|--------|
|
|
| acl | `acl` | 1 | ✅ |
|
|
| basic | `basic` | 3 | ✅ |
|
|
| copying | `copying_test` | 1 | ✅ |
|
|
| cors | `cors` | 2 | ✅ |
|
|
| delete | `delete` | 1 | ✅ |
|
|
| etag | `s3api` | 1 | ✅ |
|
|
| filer_group | `filer_group` | 1 | ✅ |
|
|
| iam | `iam` | 3 | ✅ |
|
|
| remote_cache | `remote_cache` | 1 | ✅ |
|
|
| retention | `retention` | 7 | ✅ |
|
|
| sse | `sse_test` | 7 | ✅ |
|
|
| tagging | `tagging` | 2 | ✅ |
|
|
| versioning | `s3api` | 9 | ✅ |
|
|
|
|
**Total**: 13 test suites, 39 test files, all modernized ✅
|
|
|
|
## Build Status
|
|
All test directories compile successfully:
|
|
```
|
|
✓ test/s3/acl builds
|
|
✓ test/s3/basic builds
|
|
✓ test/s3/copying builds
|
|
✓ test/s3/cors builds
|
|
✓ test/s3/delete builds
|
|
✓ test/s3/etag builds
|
|
✓ test/s3/filer_group builds
|
|
✓ test/s3/iam builds
|
|
✓ test/s3/remote_cache builds
|
|
✓ test/s3/retention builds
|
|
✓ test/s3/sse builds
|
|
✓ test/s3/tagging builds
|
|
✓ test/s3/versioning builds
|
|
```
|
|
|
|
## Test Execution Modes
|
|
|
|
### Mode 1: Auto-Managed (Development)
|
|
```bash
|
|
cd test/s3/basic
|
|
go test -v ./...
|
|
```
|
|
- Server auto-starts before tests
|
|
- Isolated to test directory
|
|
- No setup required
|
|
|
|
### Mode 2: External Server (CI/CD)
|
|
```bash
|
|
# Start weed mini once
|
|
cd /tmp && weed -v=2 server -s3
|
|
|
|
# Run all tests in any order
|
|
USE_EXTERNAL_SERVER=true go test ./...
|
|
```
|
|
- Reusable server for multiple test suites
|
|
- Parallel test execution
|
|
- CI/CD optimized
|
|
|
|
## Weed Mini Configuration
|
|
```
|
|
Master: Port 9333 (default)
|
|
Volume: Port 8080 (default)
|
|
Filer: Port 8888 (default)
|
|
S3 API: Port 8333 (configurable)
|
|
```
|
|
|
|
## Related Bug Fixes
|
|
- Fixed S3 object key normalization (NormalizeObjectKey)
|
|
- Fixed directory marker path construction
|
|
- Fixed explicit directory handling in GetPrefix
|
|
- Fixed S3LIST trailing slash issues
|
|
|
|
## Files Modified
|
|
- `test/s3/testutil/server.go` (183 lines) - New shared utilities
|
|
- `test/s3/testutil/server_test.go` (27 lines) - Utilities tests
|
|
- `test/s3/{13 suites}/s3_test_main.go` (42 lines each) - TestMain implementations
|
|
- `test/s3/versioning/Makefile` (349 → 76 lines) - Simplified
|
|
|
|
## Next Steps (Optional)
|
|
1. Create simplified Makefiles for other test suites (like versioning)
|
|
2. Add documentation to CONTRIBUTING.md
|
|
3. Integrate with CI/CD pipelines
|
|
4. Run complete test suite to validate at scale
|
|
5. Consider performance benchmarking
|
|
|
|
## Verified Test Results
|
|
✅ `versioning/TestBucketListReturnDataVersioning` - PASS
|
|
✅ `basic/TestPutObject` - PASS (5.54s)
|
|
✅ `tagging/TestPutObjectTaggingAPI` - PASS (0.31s)
|
|
✅ `cors/TestCorsSimple` - PASS (0.268s)
|
|
|
|
## Migration Guide for Other Tests
|
|
|
|
To add weed mini support to any other S3 test suite:
|
|
|
|
1. Create `s3_test_main.go` with correct package name
|
|
2. Implement TestMain() function
|
|
3. Call `testutil.StartServer()` if `USE_EXTERNAL_SERVER != "true"`
|
|
4. Run tests: `go test -v ./...`
|
|
|
|
See `test/s3/versioning/s3_test_main.go` as template.
|
|
|
|
---
|
|
**Status**: ✅ Complete and validated
|
|
**Last Updated**: 2024-12-24
|
|
**Branch**: feature/modernize-s3-tests (PR #7876)
|