| 
				
					
						 | 
			4 months ago | |
|---|---|---|
| .. | ||
| Makefile | 4 months ago | |
| README.md | 4 months ago | |
| s3_copying_test.go | 4 months ago | |
| test_config.json | 4 months ago | |
		
			
				
				README.md
			
		
		
	
	SeaweedFS S3 Copying Tests
This directory contains comprehensive Go tests for SeaweedFS S3 copying functionality, converted from the failing Python tests in the s3-tests repository.
Overview
These tests verify that SeaweedFS correctly implements S3 operations, starting with basic put/get operations and progressing to advanced copy operations, including:
- Basic S3 Operations: Put/Get operations, bucket management, and metadata handling
 - Basic object copying: within the same bucket
 - Cross-bucket copying: across different buckets
 - Multipart copy operations: for large files
 - Conditional copy operations: ETag-based conditional copying
 - Metadata handling: during copy operations
 - ACL handling: during copy operations
 
Test Coverage
Basic S3 Operations (Run First)
- TestBasicPutGet: Tests fundamental S3 put/get operations with various object types
 - TestBasicBucketOperations: Tests bucket creation, listing, and deletion
 - TestBasicLargeObject: Tests handling of larger objects (up to 10MB)
 
Basic Copy Operations
- TestObjectCopySameBucket: Tests copying objects within the same bucket
 - TestObjectCopyDiffBucket: Tests copying objects to different buckets
 - TestObjectCopyCannedAcl: Tests copying with ACL settings
 - TestObjectCopyRetainingMetadata: Tests metadata preservation during copy
 
Multipart Copy Operations
- TestMultipartCopySmall: Tests multipart copying of small files
 - TestMultipartCopyWithoutRange: Tests multipart copying without range specification
 - TestMultipartCopySpecialNames: Tests multipart copying with special character names
 - TestMultipartCopyMultipleSizes: Tests multipart copying with various file sizes
 
Conditional Copy Operations
- TestCopyObjectIfMatchGood: Tests copying with matching ETag condition
 - TestCopyObjectIfMatchFailed: Tests copying with non-matching ETag condition (should fail)
 - TestCopyObjectIfNoneMatchFailed: Tests copying with non-matching ETag condition (should succeed)
 - TestCopyObjectIfNoneMatchGood: Tests copying with matching ETag condition (should fail)
 
Requirements
- Go 1.19+: Required for AWS SDK v2 and modern Go features
 - SeaweedFS Binary: Built from source (
../../../weed/weed) - Free Ports: 8333 (S3), 8888 (Filer), 8080 (Volume), 9333 (Master)
 - Dependencies: Uses the main repository's go.mod with existing AWS SDK v2 and testify dependencies
 
Quick Start
1. Build SeaweedFS
cd ../../../
make
2. Run Tests
# Run basic S3 operations first (recommended)
make test-basic
# Run all tests (starts with basic, then copy tests)
make test
# Run quick tests only
make test-quick
# Run multipart tests only
make test-multipart
# Run conditional tests only
make test-conditional
Available Make Targets
Basic Test Execution
make test-basic- Run basic S3 put/get operations (recommended first)make test- Run all S3 tests (starts with basic, then copying)make test-quick- Run quick tests only (basic copying)make test-full- Run full test suite including large filesmake test-multipart- Run multipart copying tests onlymake test-conditional- Run conditional copying tests only
Server Management
make start-seaweedfs- Start SeaweedFS server for testingmake stop-seaweedfs- Stop SeaweedFS servermake manual-start- Start server for manual testingmake manual-stop- Stop server and clean up
Debugging
make debug-logs- Show recent log entries from all servicesmake debug-status- Show process and port statusmake check-binary- Verify SeaweedFS binary exists
Performance Testing
make benchmark- Run performance benchmarksmake stress- Run stress tests with multiple iterationsmake perf- Run performance tests with large files
Cleanup
make clean- Clean up test artifacts and temporary files
Configuration
The tests use the following default configuration:
{
  "endpoint": "http://localhost:8333",
  "access_key": "some_access_key1",
  "secret_key": "some_secret_key1",
  "region": "us-east-1",
  "bucket_prefix": "test-copying-",
  "use_ssl": false,
  "skip_verify_ssl": true
}
You can modify these values in test_config.json or by setting environment variables:
export SEAWEEDFS_BINARY=/path/to/weed
export S3_PORT=8333
export FILER_PORT=8888
export VOLUME_PORT=8080
export MASTER_PORT=9333
export TEST_TIMEOUT=10m
export VOLUME_MAX_SIZE_MB=50
Note: The volume size limit is set to 50MB to ensure proper testing of volume boundaries and multipart operations.
Test Details
TestBasicPutGet
- Tests fundamental S3 put/get operations with various object types:
- Simple text objects
 - Empty objects
 - Binary objects (1KB random data)
 - Objects with metadata and content-type
 
 - Verifies ETag consistency between put and get operations
 - Tests metadata preservation
 
TestBasicBucketOperations
- Tests bucket creation and existence verification
 - Tests object listing in buckets
 - Tests object creation and listing with directory-like prefixes
 - Tests bucket deletion and cleanup
 - Verifies proper error handling for operations on non-existent buckets
 
TestBasicLargeObject
- Tests handling of progressively larger objects:
- 1KB, 10KB, 100KB, 1MB, 5MB, 10MB
 
 - Verifies data integrity for large objects
 - Tests memory handling and streaming for large files
 - Ensures proper handling up to the 50MB volume limit
 
TestObjectCopySameBucket
- Creates a bucket with a source object
 - Copies the object to a different key within the same bucket
 - Verifies the copied object has the same content
 
TestObjectCopyDiffBucket
- Creates source and destination buckets
 - Copies an object from source to destination bucket
 - Verifies the copied object has the same content
 
TestObjectCopyCannedAcl
- Tests copying with ACL settings (
public-read) - Tests metadata replacement during copy with ACL
 - Verifies both basic copying and metadata handling
 
TestObjectCopyRetainingMetadata
- Tests with different file sizes (3 bytes, 1MB)
 - Verifies metadata and content-type preservation
 - Checks that all metadata is correctly copied
 
TestMultipartCopySmall
- Tests multipart copy with 1-byte files
 - Uses range-based copying (
bytes=0-0) - Verifies multipart upload completion
 
TestMultipartCopyWithoutRange
- Tests multipart copy without specifying range
 - Should copy entire source object
 - Verifies correct content length and data
 
TestMultipartCopySpecialNames
- Tests with special character names: 
" ","_","__","?versionId" - Verifies proper URL encoding and handling
 - Each special name is tested in isolation
 
TestMultipartCopyMultipleSizes
- Tests with various copy sizes:
- 5MB (single part)
 - 5MB + 100KB (multi-part)
 - 5MB + 600KB (multi-part)
 - 10MB + 100KB (multi-part)
 - 10MB + 600KB (multi-part)
 - 10MB (exact multi-part boundary)
 
 - Uses 5MB part size for all copies
 - Verifies data integrity across all sizes
 
TestCopyObjectIfMatchGood
- Tests conditional copy with matching ETag
 - Should succeed when ETag matches
 - Verifies successful copy operation
 
TestCopyObjectIfMatchFailed
- Tests conditional copy with non-matching ETag
 - Should fail with precondition error
 - Verifies proper error handling
 
TestCopyObjectIfNoneMatchFailed
- Tests conditional copy with non-matching ETag for IfNoneMatch
 - Should succeed when ETag doesn't match
 - Verifies successful copy operation
 
TestCopyObjectIfNoneMatchGood
- Tests conditional copy with matching ETag for IfNoneMatch
 - Should fail with precondition error
 - Verifies proper error handling
 
Expected Behavior
These tests verify that SeaweedFS correctly implements:
- Basic S3 Operations: Standard 
PutObject,GetObject,ListBuckets,ListObjectsAPIs - Bucket Management: Bucket creation, deletion, and listing
 - Object Storage: Binary and text data storage with metadata
 - Large Object Handling: Efficient storage and retrieval of large files
 - Basic S3 Copy Operations: Standard 
CopyObjectAPI - Multipart Copy Operations: 
UploadPartCopyAPI with range support - Conditional Operations: ETag-based conditional copying
 - Metadata Handling: Proper metadata preservation and replacement
 - ACL Handling: Access control list management during copy
 - Error Handling: Proper error responses for invalid operations
 
Troubleshooting
Common Issues
- 
Port Already in Use
make stop-seaweedfs make clean - 
SeaweedFS Binary Not Found
cd ../../../ make - 
Test Timeouts
export TEST_TIMEOUT=30m make test - 
Permission Denied
sudo make clean 
Debug Information
# Check server status
make debug-status
# View recent logs
make debug-logs
# Manual server start for investigation
make manual-start
# ... perform manual testing ...
make manual-stop
Log Locations
When running tests, logs are stored in:
- Master: 
/tmp/seaweedfs-master.log - Volume: 
/tmp/seaweedfs-volume.log - Filer: 
/tmp/seaweedfs-filer.log - S3: 
/tmp/seaweedfs-s3.log 
Contributing
When adding new tests:
- Follow the existing naming convention (
TestXxxYyy) - Use the helper functions for common operations
 - Add cleanup with 
defer deleteBucket(t, client, bucketName) - Include error checking with 
require.NoError(t, err) - Use assertions with 
assert.Equal(t, expected, actual) - Add the test to the appropriate Make target
 
Performance Notes
- TestMultipartCopyMultipleSizes is the most resource-intensive test
 - Large file tests may take several minutes to complete
 - Memory usage scales with file sizes being tested
 - Network latency affects multipart copy performance
 
Integration with CI/CD
For automated testing:
# Basic validation (recommended first)
make test-basic
# Quick validation
make ci-test
# Full validation
make test-full
# Performance validation
make perf
The tests are designed to be self-contained and can run in containerized environments.