frostfs-node/pkg/local_object_storage/metabase/containers_test.go

189 lines
4.0 KiB
Go

package meta_test
import (
"context"
"math/rand"
"sort"
"testing"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/object"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/internal/testutil"
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
oidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id/test"
"github.com/stretchr/testify/require"
)
func TestDB_Containers(t *testing.T) {
t.Parallel()
db := newDB(t)
defer func() { require.NoError(t, db.Close()) }()
const N = 10
cids := make(map[string]int, N)
for i := 0; i < N; i++ {
obj := testutil.GenerateObject()
cnr, _ := obj.ContainerID()
cids[cnr.EncodeToString()] = 0
err := putBig(db, obj)
require.NoError(t, err)
}
lst, err := db.Containers(context.Background())
require.NoError(t, err)
for _, cnr := range lst {
i, ok := cids[cnr.EncodeToString()]
require.True(t, ok)
require.Equal(t, 0, i)
cids[cnr.EncodeToString()] = 1
}
// require.Contains not working since cnrs is a ptr slice
assertContains := func(cnrs []cid.ID, cnr cid.ID) {
found := false
for i := 0; !found && i < len(cnrs); i++ {
found = cnrs[i].Equals(cnr)
}
require.True(t, found)
}
t.Run("Inhume", func(t *testing.T) {
obj := testutil.GenerateObject()
require.NoError(t, putBig(db, obj))
cnrs, err := db.Containers(context.Background())
require.NoError(t, err)
cnr, _ := obj.ContainerID()
assertContains(cnrs, cnr)
require.NoError(t, metaInhume(db, object.AddressOf(obj), oidtest.Address()))
cnrs, err = db.Containers(context.Background())
require.NoError(t, err)
assertContains(cnrs, cnr)
})
}
func TestDB_ContainersCount(t *testing.T) {
t.Parallel()
db := newDB(t)
defer func() { require.NoError(t, db.Close()) }()
const R, T, SG, L = 10, 11, 12, 13 // amount of object per type
uploadObjects := [...]struct {
amount int
typ objectSDK.Type
}{
{R, objectSDK.TypeRegular},
{T, objectSDK.TypeTombstone},
{L, objectSDK.TypeLock},
}
expected := make([]cid.ID, 0, R+T+SG+L)
for _, upload := range uploadObjects {
for i := 0; i < upload.amount; i++ {
obj := testutil.GenerateObject()
obj.SetType(upload.typ)
err := putBig(db, obj)
require.NoError(t, err)
cnr, _ := obj.ContainerID()
expected = append(expected, cnr)
}
}
sort.Slice(expected, func(i, j int) bool {
return expected[i].EncodeToString() < expected[j].EncodeToString()
})
got, err := db.Containers(context.Background())
require.NoError(t, err)
sort.Slice(got, func(i, j int) bool {
return got[i].EncodeToString() < got[j].EncodeToString()
})
require.Equal(t, expected, got)
}
func TestDB_ContainerSize(t *testing.T) {
t.Parallel()
db := newDB(t)
defer func() { require.NoError(t, db.Close()) }()
const (
C = 3
N = 5
)
cids := make(map[cid.ID]int, C)
objs := make(map[cid.ID][]*objectSDK.Object, C*N)
for i := 0; i < C; i++ {
cnr := cidtest.ID()
cids[cnr] = 0
for j := 0; j < N; j++ {
size := rand.Intn(1024)
parent := testutil.GenerateObjectWithCID(cnr)
parent.SetPayloadSize(uint64(size / 2))
obj := testutil.GenerateObjectWithCID(cnr)
obj.SetPayloadSize(uint64(size))
idParent, _ := parent.ID()
obj.SetParentID(idParent)
obj.SetParent(parent)
cids[cnr] += size
objs[cnr] = append(objs[cnr], obj)
err := putBig(db, obj)
require.NoError(t, err)
}
}
for cnr, volume := range cids {
n, err := db.ContainerSize(cnr)
require.NoError(t, err)
require.Equal(t, volume, int(n))
}
t.Run("Inhume", func(t *testing.T) {
for cnr, list := range objs {
volume := cids[cnr]
for _, obj := range list {
require.NoError(t, metaInhume(
db,
object.AddressOf(obj),
oidtest.Address(),
))
volume -= int(obj.PayloadSize())
n, err := db.ContainerSize(cnr)
require.NoError(t, err)
require.Equal(t, volume, int(n))
}
}
})
}