aboutsummaryrefslogtreecommitdiff
path: root/weed/s3api/s3api_object_handlers_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/s3api/s3api_object_handlers_test.go')
-rw-r--r--weed/s3api/s3api_object_handlers_test.go109
1 files changed, 109 insertions, 0 deletions
diff --git a/weed/s3api/s3api_object_handlers_test.go b/weed/s3api/s3api_object_handlers_test.go
index 950dd45f8..cf650a36e 100644
--- a/weed/s3api/s3api_object_handlers_test.go
+++ b/weed/s3api/s3api_object_handlers_test.go
@@ -147,3 +147,112 @@ func TestS3ApiServer_toFilerUrl(t *testing.T) {
})
}
}
+
+func TestPartNumberWithRangeHeader(t *testing.T) {
+ tests := []struct {
+ name string
+ partStartOffset int64 // Part's start offset in the object
+ partEndOffset int64 // Part's end offset in the object
+ clientRangeHeader string
+ expectedStart int64 // Expected absolute start offset
+ expectedEnd int64 // Expected absolute end offset
+ expectError bool
+ }{
+ {
+ name: "No client range - full part",
+ partStartOffset: 1000,
+ partEndOffset: 1999,
+ clientRangeHeader: "",
+ expectedStart: 1000,
+ expectedEnd: 1999,
+ expectError: false,
+ },
+ {
+ name: "Range within part - start and end",
+ partStartOffset: 1000,
+ partEndOffset: 1999, // Part size: 1000 bytes
+ clientRangeHeader: "bytes=0-99",
+ expectedStart: 1000, // 1000 + 0
+ expectedEnd: 1099, // 1000 + 99
+ expectError: false,
+ },
+ {
+ name: "Range within part - start to end",
+ partStartOffset: 1000,
+ partEndOffset: 1999,
+ clientRangeHeader: "bytes=100-",
+ expectedStart: 1100, // 1000 + 100
+ expectedEnd: 1999, // 1000 + 999 (end of part)
+ expectError: false,
+ },
+ {
+ name: "Range suffix - last 100 bytes",
+ partStartOffset: 1000,
+ partEndOffset: 1999, // Part size: 1000 bytes
+ clientRangeHeader: "bytes=-100",
+ expectedStart: 1900, // 1000 + (1000 - 100)
+ expectedEnd: 1999, // 1000 + 999
+ expectError: false,
+ },
+ {
+ name: "Range suffix larger than part",
+ partStartOffset: 1000,
+ partEndOffset: 1999, // Part size: 1000 bytes
+ clientRangeHeader: "bytes=-2000",
+ expectedStart: 1000, // Start of part (clamped)
+ expectedEnd: 1999, // End of part
+ expectError: false,
+ },
+ {
+ name: "Range start beyond part size",
+ partStartOffset: 1000,
+ partEndOffset: 1999,
+ clientRangeHeader: "bytes=1000-1100",
+ expectedStart: 0,
+ expectedEnd: 0,
+ expectError: true,
+ },
+ {
+ name: "Range end clamped to part size",
+ partStartOffset: 1000,
+ partEndOffset: 1999,
+ clientRangeHeader: "bytes=0-2000",
+ expectedStart: 1000, // 1000 + 0
+ expectedEnd: 1999, // Clamped to end of part
+ expectError: false,
+ },
+ {
+ name: "Single byte range at start",
+ partStartOffset: 5000,
+ partEndOffset: 9999, // Part size: 5000 bytes
+ clientRangeHeader: "bytes=0-0",
+ expectedStart: 5000,
+ expectedEnd: 5000,
+ expectError: false,
+ },
+ {
+ name: "Single byte range in middle",
+ partStartOffset: 5000,
+ partEndOffset: 9999,
+ clientRangeHeader: "bytes=100-100",
+ expectedStart: 5100,
+ expectedEnd: 5100,
+ expectError: false,
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ // Test the actual range adjustment logic from GetObjectHandler
+ startOffset, endOffset, err := adjustRangeForPart(tt.partStartOffset, tt.partEndOffset, tt.clientRangeHeader)
+
+ if tt.expectError {
+ assert.Error(t, err, "Expected error for range %s", tt.clientRangeHeader)
+ } else {
+ assert.NoError(t, err, "Unexpected error for range %s: %v", tt.clientRangeHeader, err)
+ assert.Equal(t, tt.expectedStart, startOffset, "Start offset mismatch")
+ assert.Equal(t, tt.expectedEnd, endOffset, "End offset mismatch")
+ }
+ })
+ }
+}