diff options
Diffstat (limited to 'test/s3/sse/simple_sse_test.go')
| -rw-r--r-- | test/s3/sse/simple_sse_test.go | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/test/s3/sse/simple_sse_test.go b/test/s3/sse/simple_sse_test.go new file mode 100644 index 000000000..665837f82 --- /dev/null +++ b/test/s3/sse/simple_sse_test.go @@ -0,0 +1,115 @@ +package sse_test + +import ( + "bytes" + "context" + "crypto/md5" + "crypto/rand" + "encoding/base64" + "fmt" + "io" + "testing" + "time" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// TestSimpleSSECIntegration tests basic SSE-C with a fixed bucket name +func TestSimpleSSECIntegration(t *testing.T) { + ctx := context.Background() + + // Create S3 client + customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { + return aws.Endpoint{ + URL: "http://127.0.0.1:8333", + HostnameImmutable: true, + }, nil + }) + + awsCfg, err := config.LoadDefaultConfig(ctx, + config.WithRegion("us-east-1"), + config.WithEndpointResolverWithOptions(customResolver), + config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider( + "some_access_key1", + "some_secret_key1", + "", + )), + ) + require.NoError(t, err) + + client := s3.NewFromConfig(awsCfg, func(o *s3.Options) { + o.UsePathStyle = true + }) + + bucketName := "test-debug-bucket" + objectKey := fmt.Sprintf("test-object-prefixed-%d", time.Now().UnixNano()) + + // Generate SSE-C key + key := make([]byte, 32) + rand.Read(key) + keyB64 := base64.StdEncoding.EncodeToString(key) + keyMD5Hash := md5.Sum(key) + keyMD5 := base64.StdEncoding.EncodeToString(keyMD5Hash[:]) + + testData := []byte("Hello, simple SSE-C integration test!") + + // Ensure bucket exists + _, err = client.CreateBucket(ctx, &s3.CreateBucketInput{ + Bucket: aws.String(bucketName), + }) + if err != nil { + t.Logf("Bucket creation result: %v (might be OK if exists)", err) + } + + // Wait a moment for bucket to be ready + time.Sleep(1 * time.Second) + + t.Run("PUT with SSE-C", func(t *testing.T) { + _, err := client.PutObject(ctx, &s3.PutObjectInput{ + Bucket: aws.String(bucketName), + Key: aws.String(objectKey), + Body: bytes.NewReader(testData), + SSECustomerAlgorithm: aws.String("AES256"), + SSECustomerKey: aws.String(keyB64), + SSECustomerKeyMD5: aws.String(keyMD5), + }) + require.NoError(t, err, "Failed to upload SSE-C object") + t.Log("✅ SSE-C PUT succeeded!") + }) + + t.Run("GET with SSE-C", func(t *testing.T) { + resp, err := client.GetObject(ctx, &s3.GetObjectInput{ + Bucket: aws.String(bucketName), + Key: aws.String(objectKey), + SSECustomerAlgorithm: aws.String("AES256"), + SSECustomerKey: aws.String(keyB64), + SSECustomerKeyMD5: aws.String(keyMD5), + }) + require.NoError(t, err, "Failed to retrieve SSE-C object") + defer resp.Body.Close() + + retrievedData, err := io.ReadAll(resp.Body) + require.NoError(t, err, "Failed to read retrieved data") + assert.Equal(t, testData, retrievedData, "Retrieved data doesn't match original") + + // Verify SSE-C headers + assert.Equal(t, "AES256", aws.ToString(resp.SSECustomerAlgorithm)) + assert.Equal(t, keyMD5, aws.ToString(resp.SSECustomerKeyMD5)) + + t.Log("✅ SSE-C GET succeeded and data matches!") + }) + + t.Run("GET without key should fail", func(t *testing.T) { + _, err := client.GetObject(ctx, &s3.GetObjectInput{ + Bucket: aws.String(bucketName), + Key: aws.String(objectKey), + }) + assert.Error(t, err, "Should fail to retrieve SSE-C object without key") + t.Log("✅ GET without key correctly failed") + }) +} |
