1 changed files with 100 additions and 0 deletions
@ -0,0 +1,100 @@ |
|||||
|
package sse_test |
||||
|
|
||||
|
import ( |
||||
|
"bytes" |
||||
|
"context" |
||||
|
"fmt" |
||||
|
"io" |
||||
|
"testing" |
||||
|
|
||||
|
"github.com/aws/aws-sdk-go-v2/aws" |
||||
|
"github.com/aws/aws-sdk-go-v2/service/s3" |
||||
|
"github.com/stretchr/testify/assert" |
||||
|
"github.com/stretchr/testify/require" |
||||
|
) |
||||
|
|
||||
|
// TestPlainObjectRangeAndHeadHeaders ensures non-SSE objects advertise correct
|
||||
|
// Content-Length and Content-Range information for both HEAD and ranged GETs.
|
||||
|
func TestPlainObjectRangeAndHeadHeaders(t *testing.T) { |
||||
|
ctx := context.Background() |
||||
|
|
||||
|
client, err := createS3Client(ctx, defaultConfig) |
||||
|
require.NoError(t, err, "failed to create S3 client") |
||||
|
|
||||
|
bucketName, err := createTestBucket(ctx, client, defaultConfig.BucketPrefix+"range-plain-") |
||||
|
require.NoError(t, err, "failed to create test bucket") |
||||
|
defer cleanupTestBucket(ctx, client, bucketName) |
||||
|
|
||||
|
const objectSize = 12 * 1024 * 1024 // 12MiB to force multiple SeaweedFS chunks
|
||||
|
objectKey := "plain-range-validation" |
||||
|
testData := generateTestData(objectSize) |
||||
|
|
||||
|
_, err = client.PutObject(ctx, &s3.PutObjectInput{ |
||||
|
Bucket: aws.String(bucketName), |
||||
|
Key: aws.String(objectKey), |
||||
|
Body: bytes.NewReader(testData), |
||||
|
}) |
||||
|
require.NoError(t, err, "failed to upload test object") |
||||
|
|
||||
|
t.Run("HeadObject reports accurate Content-Length", func(t *testing.T) { |
||||
|
resp, err := client.HeadObject(ctx, &s3.HeadObjectInput{ |
||||
|
Bucket: aws.String(bucketName), |
||||
|
Key: aws.String(objectKey), |
||||
|
}) |
||||
|
require.NoError(t, err, "HeadObject request failed") |
||||
|
assert.Equal(t, int64(objectSize), resp.ContentLength, "Content-Length mismatch on HEAD") |
||||
|
assert.Equal(t, "bytes", aws.ToString(resp.AcceptRanges), "Accept-Ranges should advertise bytes") |
||||
|
}) |
||||
|
|
||||
|
t.Run("Range request across chunk boundary", func(t *testing.T) { |
||||
|
rangeStart := int64(8*1024*1024 - 1024) |
||||
|
rangeEnd := rangeStart + 4096 - 1 |
||||
|
rangeHeader := fmt.Sprintf("bytes=%d-%d", rangeStart, rangeEnd) |
||||
|
|
||||
|
resp, err := client.GetObject(ctx, &s3.GetObjectInput{ |
||||
|
Bucket: aws.String(bucketName), |
||||
|
Key: aws.String(objectKey), |
||||
|
Range: aws.String(rangeHeader), |
||||
|
}) |
||||
|
require.NoError(t, err, "GetObject range request failed") |
||||
|
defer resp.Body.Close() |
||||
|
|
||||
|
expectedLen := rangeEnd - rangeStart + 1 |
||||
|
assert.Equal(t, expectedLen, resp.ContentLength, "Content-Length must match requested range size") |
||||
|
assert.Equal(t, |
||||
|
fmt.Sprintf("bytes %d-%d/%d", rangeStart, rangeEnd, objectSize), |
||||
|
aws.ToString(resp.ContentRange), |
||||
|
"Content-Range header mismatch") |
||||
|
|
||||
|
body, err := io.ReadAll(resp.Body) |
||||
|
require.NoError(t, err, "failed to read range response body") |
||||
|
assert.Equal(t, int(expectedLen), len(body), "actual bytes read mismatch") |
||||
|
assert.Equal(t, testData[rangeStart:rangeEnd+1], body, "range payload mismatch") |
||||
|
}) |
||||
|
|
||||
|
t.Run("Suffix range request", func(t *testing.T) { |
||||
|
const suffixSize = 2048 |
||||
|
resp, err := client.GetObject(ctx, &s3.GetObjectInput{ |
||||
|
Bucket: aws.String(bucketName), |
||||
|
Key: aws.String(objectKey), |
||||
|
Range: aws.String(fmt.Sprintf("bytes=-%d", suffixSize)), |
||||
|
}) |
||||
|
require.NoError(t, err, "GetObject suffix range request failed") |
||||
|
defer resp.Body.Close() |
||||
|
|
||||
|
expectedStart := int64(objectSize - suffixSize) |
||||
|
expectedEnd := int64(objectSize - 1) |
||||
|
expectedLen := expectedEnd - expectedStart + 1 |
||||
|
|
||||
|
assert.Equal(t, expectedLen, resp.ContentLength, "suffix Content-Length mismatch") |
||||
|
assert.Equal(t, |
||||
|
fmt.Sprintf("bytes %d-%d/%d", expectedStart, expectedEnd, objectSize), |
||||
|
aws.ToString(resp.ContentRange), |
||||
|
"suffix Content-Range mismatch") |
||||
|
|
||||
|
body, err := io.ReadAll(resp.Body) |
||||
|
require.NoError(t, err, "failed to read suffix range response body") |
||||
|
assert.Equal(t, int(expectedLen), len(body), "suffix range byte count mismatch") |
||||
|
assert.Equal(t, testData[expectedStart:expectedEnd+1], body, "suffix range payload mismatch") |
||||
|
}) |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue