aboutsummaryrefslogtreecommitdiff
path: root/test/s3/sse/README.md
blob: 97d1b1530e433739987c3ecdcd68adafa0705648 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
# S3 Server-Side Encryption (SSE) Integration Tests

This directory contains comprehensive integration tests for SeaweedFS S3 API Server-Side Encryption functionality. These tests validate the complete end-to-end encryption/decryption pipeline from S3 API requests through filer metadata storage.

## Overview

The SSE integration tests cover three main encryption methods:

- **SSE-C (Customer-Provided Keys)**: Client provides encryption keys via request headers
- **SSE-KMS (Key Management Service)**: Server manages encryption keys through a KMS provider
- **SSE-S3 (Server-Managed Keys)**: Server automatically manages encryption keys

## Why Integration Tests Matter

These integration tests were created to address a **critical gap in test coverage** that previously existed. While the SeaweedFS codebase had comprehensive unit tests for SSE components, it lacked integration tests that validated the complete request flow:

```
Client Request → S3 API → Filer Storage → Metadata Persistence → Retrieval → Decryption
```

### The Bug These Tests Would Have Caught

A critical bug was discovered where:
- ✅ S3 API correctly encrypted data and sent metadata headers to the filer
-**Filer did not process SSE metadata headers**, losing all encryption metadata
- ❌ Objects could be encrypted but **never decrypted** (metadata was lost)

**Unit tests passed** because they tested components in isolation, but the **integration was broken**. These integration tests specifically validate that:

1. Encryption metadata is correctly sent to the filer
2. Filer properly processes and stores the metadata
3. Objects can be successfully retrieved and decrypted
4. Copy operations preserve encryption metadata
5. Multipart uploads maintain encryption consistency

## Test Structure

### Core Integration Tests

#### Basic Functionality
- `TestSSECIntegrationBasic` - Basic SSE-C PUT/GET cycle
- `TestSSEKMSIntegrationBasic` - Basic SSE-KMS PUT/GET cycle

#### Data Size Validation
- `TestSSECIntegrationVariousDataSizes` - SSE-C with various data sizes (0B to 1MB)
- `TestSSEKMSIntegrationVariousDataSizes` - SSE-KMS with various data sizes

#### Object Copy Operations
- `TestSSECObjectCopyIntegration` - SSE-C object copying (key rotation, encryption changes)
- `TestSSEKMSObjectCopyIntegration` - SSE-KMS object copying

#### Multipart Uploads
- `TestSSEMultipartUploadIntegration` - SSE multipart uploads for large objects

#### Error Conditions
- `TestSSEErrorConditions` - Invalid keys, malformed requests, error handling

### Performance Tests
- `BenchmarkSSECThroughput` - SSE-C performance benchmarking
- `BenchmarkSSEKMSThroughput` - SSE-KMS performance benchmarking

## Running Tests

### Prerequisites

1. **Build SeaweedFS**: Ensure the `weed` binary is built and available in PATH
   ```bash
   cd /path/to/seaweedfs
   make
   ```

2. **Dependencies**: Tests use AWS SDK Go v2 and testify - these are handled by Go modules

### Quick Test

Run basic SSE integration tests:
```bash
make test-basic
```

### Comprehensive Testing

Run all SSE integration tests:
```bash
make test
```

### Specific Test Categories

```bash
make test-ssec      # SSE-C tests only
make test-ssekms    # SSE-KMS tests only  
make test-copy      # Copy operation tests
make test-multipart # Multipart upload tests
make test-errors    # Error condition tests
```

### Performance Testing

```bash
make benchmark      # Performance benchmarks
make perf          # Various data size performance tests
```

### Development Testing

```bash
make manual-start   # Start SeaweedFS for manual testing
# ... run manual tests ...
make manual-stop    # Stop and cleanup
```

## Test Configuration

### Default Configuration

The tests use these default settings:
- **S3 Endpoint**: `http://127.0.0.1:8333`
- **Access Key**: `some_access_key1`
- **Secret Key**: `some_secret_key1`
- **Region**: `us-east-1`
- **Bucket Prefix**: `test-sse-`

### Custom Configuration

Override defaults via environment variables:
```bash
S3_PORT=8444 FILER_PORT=8889 make test
```

### Test Environment

Each test run:
1. Starts a complete SeaweedFS cluster (master, volume, filer, s3)
2. Configures KMS support for SSE-KMS tests
3. Creates temporary buckets with unique names
4. Runs tests with real HTTP requests
5. Cleans up all test artifacts

## Test Data Coverage

### Data Sizes Tested
- **0 bytes**: Empty files (edge case)
- **1 byte**: Minimal data
- **16 bytes**: Single AES block
- **31 bytes**: Just under two blocks
- **32 bytes**: Exactly two blocks
- **100 bytes**: Small file
- **1 KB**: Small text file
- **8 KB**: Medium file
- **64 KB**: Large file
- **1 MB**: Very large file

### Encryption Key Scenarios
- **SSE-C**: Random 256-bit keys, key rotation, wrong keys
- **SSE-KMS**: Various key IDs, encryption contexts, bucket keys
- **Copy Operations**: Same key, different keys, encryption transitions

## Critical Test Scenarios

### Metadata Persistence Validation

The integration tests specifically validate scenarios that would catch metadata storage bugs:

```go
// 1. Upload with SSE-C
client.PutObject(..., SSECustomerKey: key)  // ← Metadata sent to filer

// 2. Retrieve with SSE-C  
client.GetObject(..., SSECustomerKey: key)  // ← Metadata retrieved from filer

// 3. Verify decryption works
assert.Equal(originalData, decryptedData)    // ← Would fail if metadata lost
```

### Content-Length Validation

Tests verify that Content-Length headers are correct, which would catch bugs related to IV handling:

```go
assert.Equal(int64(originalSize), resp.ContentLength)  // ← Would catch IV-in-stream bugs
```

## Debugging

### View Logs
```bash
make debug-logs     # Show recent log entries
make debug-status   # Show process and port status
```

### Manual Testing
```bash
make manual-start   # Start SeaweedFS
# Test with S3 clients, curl, etc.
make manual-stop    # Cleanup
```

## Integration Test Benefits

These integration tests provide:

1. **End-to-End Validation**: Complete request pipeline testing
2. **Metadata Persistence**: Validates filer storage/retrieval of encryption metadata
3. **Real Network Communication**: Uses actual HTTP requests and responses
4. **Production-Like Environment**: Full SeaweedFS cluster with all components
5. **Regression Protection**: Prevents critical integration bugs
6. **Performance Baselines**: Benchmarking for performance monitoring

## Continuous Integration

For CI/CD pipelines, use:
```bash
make ci-test        # Quick tests suitable for CI
make stress         # Stress testing for stability validation
```

## Key Differences from Unit Tests

| Aspect | Unit Tests | Integration Tests |
|--------|------------|------------------|
| **Scope** | Individual functions | Complete request pipeline |
| **Dependencies** | Mocked/simulated | Real SeaweedFS cluster |
| **Network** | None | Real HTTP requests |
| **Storage** | In-memory | Real filer database |
| **Metadata** | Manual simulation | Actual storage/retrieval |
| **Speed** | Fast (milliseconds) | Slower (seconds) |
| **Coverage** | Component logic | System integration |

## Conclusion

These integration tests ensure that SeaweedFS SSE functionality works correctly in production-like environments. They complement the existing unit tests by validating that all components work together properly, providing confidence that encryption/decryption operations will succeed for real users.

**Most importantly**, these tests would have immediately caught the critical filer metadata storage bug that was previously undetected, demonstrating the crucial importance of integration testing for distributed systems.