diff options
Diffstat (limited to 'weed/s3api/s3api_object_handlers_test.go')
| -rw-r--r-- | weed/s3api/s3api_object_handlers_test.go | 109 |
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") + } + }) + } +} |
