* chore: execute goimports to format the code Signed-off-by: promalert <promalert@outlook.com> * goimports -w . --------- Signed-off-by: promalert <promalert@outlook.com> Co-authored-by: Chris Lu <chris.lu@gmail.com>
86 lines
2.7 KiB
Go
86 lines
2.7 KiB
Go
package s3api
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants"
|
|
)
|
|
|
|
// TestPrefixNormalizationInList verifies that prefixes are normalized consistently in list operations
|
|
func TestPrefixNormalizationInList(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
inputPrefix string
|
|
expectedPrefix string
|
|
description string
|
|
}{
|
|
{
|
|
name: "simple prefix",
|
|
inputPrefix: "parquet-tests/abc123/",
|
|
expectedPrefix: "parquet-tests/abc123/",
|
|
description: "Normal prefix with trailing slash",
|
|
},
|
|
{
|
|
name: "leading slash",
|
|
inputPrefix: "/parquet-tests/abc123/",
|
|
expectedPrefix: "parquet-tests/abc123/",
|
|
description: "Prefix with leading slash should be stripped",
|
|
},
|
|
{
|
|
name: "duplicate slashes",
|
|
inputPrefix: "parquet-tests//abc123/",
|
|
expectedPrefix: "parquet-tests/abc123/",
|
|
description: "Prefix with duplicate slashes should be cleaned",
|
|
},
|
|
{
|
|
name: "backslashes",
|
|
inputPrefix: "parquet-tests\\abc123\\",
|
|
expectedPrefix: "parquet-tests/abc123/",
|
|
description: "Backslashes should be converted to forward slashes",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// Normalize using NormalizeObjectKey (same as object keys)
|
|
normalizedPrefix := s3_constants.NormalizeObjectKey(tt.inputPrefix)
|
|
|
|
if normalizedPrefix != tt.expectedPrefix {
|
|
t.Errorf("Prefix normalization mismatch:\n Input: %q\n Expected: %q\n Got: %q\n Desc: %s",
|
|
tt.inputPrefix, tt.expectedPrefix, normalizedPrefix, tt.description)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// TestListPrefixConsistency verifies that objects written and listed use consistent key formats
|
|
func TestListPrefixConsistency(t *testing.T) {
|
|
// When an object is written to "parquet-tests/123/data.parquet",
|
|
// and we list with prefix "parquet-tests/123/",
|
|
// we should find that object
|
|
|
|
objectKey := "parquet-tests/123/data.parquet"
|
|
listPrefix := "parquet-tests/123/"
|
|
|
|
// Normalize as would happen in PUT
|
|
normalizedObjectKey := s3_constants.NormalizeObjectKey(objectKey)
|
|
|
|
// Check that the list prefix would match the object path
|
|
if !startsWithPrefix(normalizedObjectKey, listPrefix) {
|
|
t.Errorf("List prefix mismatch:\n Object: %q\n Prefix: %q\n Object doesn't start with prefix",
|
|
normalizedObjectKey, listPrefix)
|
|
}
|
|
}
|
|
|
|
func startsWithPrefix(objectKey, prefix string) bool {
|
|
// Normalize the prefix using the same logic as NormalizeObjectKey
|
|
normalizedPrefix := s3_constants.NormalizeObjectKey(prefix)
|
|
|
|
// Check if the object starts with the normalized prefix
|
|
if normalizedPrefix == "" {
|
|
return true
|
|
}
|
|
|
|
return objectKey == normalizedPrefix || objectKey[:len(normalizedPrefix)] == normalizedPrefix
|
|
}
|