forked from TrueCloudLab/frostfs-s3-gw
192 lines
4.9 KiB
Go
192 lines
4.9 KiB
Go
|
package layer
|
||
|
|
||
|
import (
|
||
|
"net/http"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
"github.com/nspcc-dev/neofs-api-go/pkg/container"
|
||
|
"github.com/nspcc-dev/neofs-api-go/pkg/object"
|
||
|
"github.com/nspcc-dev/neofs-api-go/pkg/owner"
|
||
|
"github.com/stretchr/testify/require"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
defaultTestCreated = time.Now()
|
||
|
defaultTestPayload = []byte("test object payload")
|
||
|
defaultTestPayloadLength = int64(len(defaultTestPayload))
|
||
|
defaultTestContentType = http.DetectContentType(defaultTestPayload)
|
||
|
)
|
||
|
|
||
|
func newTestObject(oid *object.ID, bkt *BucketInfo, name string) *object.Object {
|
||
|
filename := object.NewAttribute()
|
||
|
filename.SetKey(object.AttributeFileName)
|
||
|
filename.SetValue(name)
|
||
|
|
||
|
created := object.NewAttribute()
|
||
|
created.SetKey(object.AttributeTimestamp)
|
||
|
created.SetValue(strconv.FormatInt(defaultTestCreated.Unix(), 10))
|
||
|
|
||
|
raw := object.NewRaw()
|
||
|
raw.SetID(oid)
|
||
|
raw.SetOwnerID(bkt.Owner)
|
||
|
raw.SetContainerID(bkt.CID)
|
||
|
raw.SetPayload(defaultTestPayload)
|
||
|
raw.SetAttributes(filename, created)
|
||
|
raw.SetPayloadSize(uint64(defaultTestPayloadLength))
|
||
|
|
||
|
return raw.Object()
|
||
|
}
|
||
|
|
||
|
func newTestInfo(oid *object.ID, bkt *BucketInfo, name, prefix string) *ObjectInfo {
|
||
|
info := &ObjectInfo{
|
||
|
id: oid,
|
||
|
Name: name,
|
||
|
Bucket: bkt.Name,
|
||
|
Size: defaultTestPayloadLength,
|
||
|
ContentType: defaultTestContentType,
|
||
|
Created: time.Unix(defaultTestCreated.Unix(), 0),
|
||
|
Owner: bkt.Owner,
|
||
|
Headers: make(map[string]string),
|
||
|
}
|
||
|
|
||
|
if prefix == rootSeparator {
|
||
|
return info
|
||
|
}
|
||
|
|
||
|
_, dirname := testNameFromObjectName(name)
|
||
|
if ln := len(prefix); ln > 0 && prefix[ln-1:] != PathSeparator {
|
||
|
prefix += PathSeparator
|
||
|
}
|
||
|
|
||
|
tail := strings.TrimPrefix(dirname, prefix)
|
||
|
if index := strings.Index(tail, PathSeparator); index >= 0 {
|
||
|
info.isDir = true
|
||
|
|
||
|
info.Size = 0
|
||
|
info.ContentType = ""
|
||
|
info.Name = tail[:index+1]
|
||
|
info.Headers = nil
|
||
|
}
|
||
|
|
||
|
return info
|
||
|
}
|
||
|
|
||
|
func testNameFromObjectName(name string) (string, string) {
|
||
|
ind := strings.LastIndex(name, PathSeparator)
|
||
|
|
||
|
return name[ind+1:], name[:ind+1]
|
||
|
}
|
||
|
|
||
|
func Test_objectInfoFromMeta(t *testing.T) {
|
||
|
uid := owner.NewID()
|
||
|
oid := object.NewID()
|
||
|
cid := container.NewID()
|
||
|
|
||
|
bkt := &BucketInfo{
|
||
|
Name: "test-container",
|
||
|
CID: cid,
|
||
|
Owner: uid,
|
||
|
Created: time.Now(),
|
||
|
}
|
||
|
|
||
|
cases := []struct {
|
||
|
name string
|
||
|
prefix string
|
||
|
result *ObjectInfo
|
||
|
object *object.Object
|
||
|
|
||
|
infoName string
|
||
|
}{
|
||
|
{
|
||
|
name: "test.jpg",
|
||
|
prefix: "",
|
||
|
infoName: "test.jpg",
|
||
|
result: newTestInfo(oid, bkt, "test.jpg", ""),
|
||
|
object: newTestObject(oid, bkt, "test.jpg"),
|
||
|
},
|
||
|
|
||
|
{
|
||
|
name: "test/small.jpg",
|
||
|
prefix: "",
|
||
|
infoName: "test/",
|
||
|
result: newTestInfo(oid, bkt, "test/small.jpg", ""),
|
||
|
object: newTestObject(oid, bkt, "test/small.jpg"),
|
||
|
},
|
||
|
|
||
|
{
|
||
|
name: "test/small.jpg raw",
|
||
|
prefix: rootSeparator,
|
||
|
infoName: "test/small.jpg",
|
||
|
result: newTestInfo(oid, bkt, "test/small.jpg", rootSeparator),
|
||
|
object: newTestObject(oid, bkt, "test/small.jpg"),
|
||
|
},
|
||
|
|
||
|
{
|
||
|
name: "test/a/b/c/d/e/f/g/h/small.jpg",
|
||
|
prefix: "",
|
||
|
infoName: "test/",
|
||
|
result: newTestInfo(oid, bkt, "test/a/b/c/d/e/f/g/h/small.jpg", ""),
|
||
|
object: newTestObject(oid, bkt, "test/a/b/c/d/e/f/g/h/small.jpg"),
|
||
|
},
|
||
|
|
||
|
{
|
||
|
name: "test/a/b/c/d/e/f/g/h/small.jpg",
|
||
|
prefix: "test",
|
||
|
infoName: "a/",
|
||
|
result: newTestInfo(oid, bkt, "test/a/b/c/d/e/f/g/h/small.jpg", "test"),
|
||
|
object: newTestObject(oid, bkt, "test/a/b/c/d/e/f/g/h/small.jpg"),
|
||
|
},
|
||
|
|
||
|
{
|
||
|
name: "test/a/b/c/d/e/f/g/h/small.jpg",
|
||
|
prefix: "test/a",
|
||
|
infoName: "b/",
|
||
|
result: newTestInfo(oid, bkt, "test/a/b/c/d/e/f/g/h/small.jpg", "test/a"),
|
||
|
object: newTestObject(oid, bkt, "test/a/b/c/d/e/f/g/h/small.jpg"),
|
||
|
},
|
||
|
|
||
|
{
|
||
|
name: "test/a/b/c/d/e/f/g/h/small.jpg",
|
||
|
prefix: "test/a/b",
|
||
|
infoName: "c/",
|
||
|
result: newTestInfo(oid, bkt, "test/a/b/c/d/e/f/g/h/small.jpg", "test/a/b"),
|
||
|
object: newTestObject(oid, bkt, "test/a/b/c/d/e/f/g/h/small.jpg"),
|
||
|
},
|
||
|
|
||
|
{
|
||
|
name: "test/a/b/c/d/e/f/g/h/small.jpg with slash",
|
||
|
prefix: "test/a/b/",
|
||
|
infoName: "c/",
|
||
|
result: newTestInfo(oid, bkt, "test/a/b/c/d/e/f/g/h/small.jpg", "test/a/b/"),
|
||
|
object: newTestObject(oid, bkt, "test/a/b/c/d/e/f/g/h/small.jpg"),
|
||
|
},
|
||
|
|
||
|
{
|
||
|
name: "test/a/b/c/d/e/f/g/h/small.jpg",
|
||
|
prefix: "test/a/b/c",
|
||
|
infoName: "d/",
|
||
|
result: newTestInfo(oid, bkt, "test/a/b/c/d/e/f/g/h/small.jpg", "test/a/b/c"),
|
||
|
object: newTestObject(oid, bkt, "test/a/b/c/d/e/f/g/h/small.jpg"),
|
||
|
},
|
||
|
|
||
|
{
|
||
|
name: "test/a/b/c/d/e/f/g/h/small.jpg",
|
||
|
prefix: "test/a/b/c/d",
|
||
|
infoName: "e/",
|
||
|
result: newTestInfo(oid, bkt, "test/a/b/c/d/e/f/g/h/small.jpg", "test/a/b/c/d"),
|
||
|
object: newTestObject(oid, bkt, "test/a/b/c/d/e/f/g/h/small.jpg"),
|
||
|
},
|
||
|
}
|
||
|
|
||
|
for _, tc := range cases {
|
||
|
t.Run(tc.name+"_"+tc.infoName, func(t *testing.T) {
|
||
|
info := objectInfoFromMeta(bkt, tc.object, tc.prefix)
|
||
|
require.Equal(t, tc.result, info)
|
||
|
require.Equal(t, tc.infoName, info.Name)
|
||
|
})
|
||
|
}
|
||
|
}
|