9.1 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	CORS Integration Tests for SeaweedFS S3 API
This directory contains comprehensive integration tests for the CORS (Cross-Origin Resource Sharing) functionality in SeaweedFS S3 API.
Overview
The CORS integration tests validate the complete CORS implementation including:
- CORS configuration management (PUT/GET/DELETE)
- CORS rule validation
- CORS middleware behavior
- Caching functionality
- Error handling
- Real-world CORS scenarios
Prerequisites
- Go 1.19+: For building SeaweedFS and running tests
- Network Access: Tests use localhost:8333by default
- System Dependencies: curlandnetstatfor health checks
Quick Start
The tests now automatically start their own SeaweedFS server, so you don't need to manually start one.
1. Run All Tests with Managed Server
# Run all tests with automatic server management
make test-with-server
# Run core CORS tests only
make test-cors-quick
# Run comprehensive CORS tests
make test-cors-comprehensive
2. Manual Server Management
If you prefer to manage the server manually:
# Start server
make start-server
# Run tests (assuming server is running)
make test-cors-simple
# Stop server
make stop-server
3. Individual Test Categories
# Run specific test types
make test-basic-cors           # Basic CORS configuration
make test-preflight-cors       # Preflight OPTIONS requests
make test-actual-cors          # Actual CORS request handling
make test-origin-matching      # Origin matching logic
make test-header-matching      # Header matching logic
make test-method-matching      # Method matching logic
make test-multiple-rules       # Multiple CORS rules
make test-validation           # CORS validation
make test-caching              # CORS caching behavior
make test-error-handling       # Error handling
Test Server Management
The tests use a comprehensive server management system similar to other SeaweedFS integration tests:
Server Configuration
- S3 Port: 8333 (configurable via S3_PORT)
- Master Port: 9333
- Volume Port: 8080
- Filer Port: 8888
- Metrics Port: 9324
- Data Directory: ./test-volume-data(auto-created)
- Log File: weed-test.log
Server Lifecycle
- Build: Automatically builds ../../../weed/weed_binary
- Start: Launches SeaweedFS with S3 API enabled
- Health Check: Waits up to 90 seconds for server to be ready
- Test: Runs the requested tests
- Stop: Gracefully shuts down the server
- Cleanup: Removes temporary files and data
Available Commands
# Server management
make start-server              # Start SeaweedFS server
make stop-server               # Stop SeaweedFS server
make health-check              # Check server health
make logs                      # View server logs
# Test execution
make test-with-server          # Full test cycle with server management
make test-cors-simple          # Run tests without server management
make test-cors-quick           # Run core tests only
make test-cors-comprehensive   # Run all tests
# Development
make dev-start                 # Start server for development
make dev-test                  # Run development tests
make build-weed                # Build SeaweedFS binary
make check-deps                # Check dependencies
# Maintenance
make clean                     # Clean up all artifacts
make coverage                  # Generate coverage report
make fmt                       # Format code
make lint                      # Run linter
Test Configuration
Default Configuration
The tests use these default settings (configurable via environment variables):
WEED_BINARY=../../../weed/weed_binary
S3_PORT=8333
TEST_TIMEOUT=10m
TEST_PATTERN=TestCORS
Configuration File
The test_config.json file contains S3 client configuration:
{
  "endpoint": "http://localhost:8333",
  "access_key": "some_access_key1",
  "secret_key": "some_secret_key1",
  "region": "us-east-1",
  "bucket_prefix": "test-cors-",
  "use_ssl": false,
  "skip_verify_ssl": true
}
Troubleshooting
Compilation Issues
If you encounter compilation errors, the most common issues are:
- 
AWS SDK v2 Type Mismatches: The MaxAgeSecondsfield intypes.CORSRuleexpectsint32, not*int32. Use direct values like3600instead ofaws.Int32(3600).
- 
Field Name Issues: The GetBucketCorsOutputtype has aCORSRulesfield directly, not aCORSConfigurationfield.
Example fix:
// ❌ Incorrect
MaxAgeSeconds: aws.Int32(3600),
assert.Len(t, getResp.CORSConfiguration.CORSRules, 1)
// ✅ Correct
MaxAgeSeconds: 3600,
assert.Len(t, getResp.CORSRules, 1)
Server Issues
- 
Server Won't Start # Check for port conflicts netstat -tlnp | grep 8333 # View server logs make logs # Force cleanup make clean
- 
Test Failures # Run with server management make test-with-server # Run specific test make test-basic-cors # Check server health make health-check
- 
Connection Issues # Verify server is running curl -s http://localhost:8333 # Check server logs tail -f weed-test.log
Performance Issues
If tests are slow or timing out:
# Increase timeout
export TEST_TIMEOUT=30m
make test-with-server
# Run quick tests only
make test-cors-quick
# Check server resources
make debug-status
Test Coverage
Core Functionality Tests
1. CORS Configuration Management (TestCORSConfigurationManagement)
- PUT CORS configuration
- GET CORS configuration
- DELETE CORS configuration
- Configuration updates
- Error handling for non-existent configurations
2. Multiple CORS Rules (TestCORSMultipleRules)
- Multiple rules in single configuration
- Rule precedence and ordering
- Complex rule combinations
3. CORS Validation (TestCORSValidation)
- Invalid HTTP methods
- Empty origins validation
- Negative MaxAge validation
- Rule limit validation
4. Wildcard Support (TestCORSWithWildcards)
- Wildcard origins (*,https://*.example.com)
- Wildcard headers (*)
- Wildcard expose headers
5. Rule Limits (TestCORSRuleLimit)
- Maximum 100 rules per configuration
- Rule limit enforcement
- Large configuration handling
6. Error Handling (TestCORSErrorHandling)
- Non-existent bucket operations
- Invalid configurations
- Malformed requests
HTTP-Level Tests
1. Preflight Requests (TestCORSPreflightRequest)
- OPTIONS request handling
- CORS headers in preflight responses
- Access-Control-Request-Method validation
- Access-Control-Request-Headers validation
2. Actual Requests (TestCORSActualRequest)
- CORS headers in actual responses
- Origin validation for real requests
- Proper expose headers handling
3. Origin Matching (TestCORSOriginMatching)
- Exact origin matching
- Wildcard origin matching (*)
- Subdomain wildcard matching (https://*.example.com)
- Non-matching origins (should be rejected)
4. Header Matching (TestCORSHeaderMatching)
- Wildcard header matching (*)
- Specific header matching
- Case-insensitive matching
- Disallowed headers
5. Method Matching (TestCORSMethodMatching)
- Allowed methods verification
- Disallowed methods rejection
- Method-specific CORS behavior
6. Multiple Rules (TestCORSMultipleRulesMatching)
- Rule precedence and selection
- Multiple rules with different configurations
- Complex rule interactions
Integration Tests
1. Caching (TestCORSCaching)
- CORS configuration caching
- Cache invalidation
- Cache performance
2. Object Operations (TestCORSObjectOperations)
- CORS with actual S3 operations
- PUT/GET/DELETE objects with CORS
- CORS headers in object responses
3. Without Configuration (TestCORSWithoutConfiguration)
- Behavior when no CORS configuration exists
- Default CORS behavior
- Graceful degradation
Development
Running Tests During Development
# Start server for development
make dev-start
# Run quick test
make dev-test
# View logs in real-time
make logs
Adding New Tests
- Follow the existing naming convention (TestCORSXxxYyy)
- Use the helper functions (getS3Client,createTestBucket, etc.)
- Add cleanup with defer cleanupTestBucket(t, client, bucketName)
- Include proper error checking with require.NoError(t, err)
- Use assertions with assert.Equal(t, expected, actual)
- Add the test to the appropriate Makefile target
Code Quality
# Format code
make fmt
# Run linter
make lint
# Generate coverage report
make coverage
Performance Notes
- Tests create and destroy buckets for each test case
- Large configuration tests may take several minutes
- Server startup typically takes 15-30 seconds
- Tests run in parallel where possible for efficiency
Integration with SeaweedFS
These tests validate the CORS implementation in:
- weed/s3api/cors/- Core CORS package
- weed/s3api/s3api_bucket_cors_handlers.go- HTTP handlers
- weed/s3api/s3api_server.go- Router integration
- weed/s3api/s3api_bucket_config.go- Configuration management
The tests ensure AWS S3 API compatibility and proper CORS behavior across all supported scenarios.