Files
seaweedFS/weed/s3api/s3api_list_normalization_test.go
promalert 9012069bd7 chore: execute goimports to format the code (#7983)
* 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>
2026-01-07 13:06:08 -08:00

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
}