forked from TrueCloudLab/frostfs-node
f58234aa2f
Reduce public interface of this package. Later each result will contain an additional status, so it makes more sense to use the same functions and result processing everywhere. Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
155 lines
3.6 KiB
Go
155 lines
3.6 KiB
Go
package meta_test
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
|
|
"github.com/nspcc-dev/neofs-node/pkg/core/object"
|
|
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
|
|
objectSDK "github.com/nspcc-dev/neofs-sdk-go/object"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestDB_Exists(t *testing.T) {
|
|
db := newDB(t)
|
|
|
|
t.Run("no object", func(t *testing.T) {
|
|
nonExist := generateObject(t)
|
|
exists, err := metaExists(db, object.AddressOf(nonExist))
|
|
require.NoError(t, err)
|
|
require.False(t, exists)
|
|
})
|
|
|
|
t.Run("regular object", func(t *testing.T) {
|
|
regular := generateObject(t)
|
|
err := putBig(db, regular)
|
|
require.NoError(t, err)
|
|
|
|
exists, err := metaExists(db, object.AddressOf(regular))
|
|
require.NoError(t, err)
|
|
require.True(t, exists)
|
|
})
|
|
|
|
t.Run("tombstone object", func(t *testing.T) {
|
|
ts := generateObject(t)
|
|
ts.SetType(objectSDK.TypeTombstone)
|
|
|
|
err := putBig(db, ts)
|
|
require.NoError(t, err)
|
|
|
|
exists, err := metaExists(db, object.AddressOf(ts))
|
|
require.NoError(t, err)
|
|
require.True(t, exists)
|
|
})
|
|
|
|
t.Run("storage group object", func(t *testing.T) {
|
|
sg := generateObject(t)
|
|
sg.SetType(objectSDK.TypeStorageGroup)
|
|
|
|
err := putBig(db, sg)
|
|
require.NoError(t, err)
|
|
|
|
exists, err := metaExists(db, object.AddressOf(sg))
|
|
require.NoError(t, err)
|
|
require.True(t, exists)
|
|
})
|
|
|
|
t.Run("lock object", func(t *testing.T) {
|
|
lock := generateObject(t)
|
|
lock.SetType(objectSDK.TypeLock)
|
|
|
|
err := putBig(db, lock)
|
|
require.NoError(t, err)
|
|
|
|
exists, err := metaExists(db, object.AddressOf(lock))
|
|
require.NoError(t, err)
|
|
require.True(t, exists)
|
|
})
|
|
|
|
t.Run("virtual object", func(t *testing.T) {
|
|
cnr := cidtest.ID()
|
|
parent := generateObjectWithCID(t, cnr)
|
|
|
|
child := generateObjectWithCID(t, cnr)
|
|
child.SetParent(parent)
|
|
idParent, _ := parent.ID()
|
|
child.SetParentID(idParent)
|
|
|
|
err := putBig(db, child)
|
|
require.NoError(t, err)
|
|
|
|
_, err = metaExists(db, object.AddressOf(parent))
|
|
|
|
var expectedErr *objectSDK.SplitInfoError
|
|
require.True(t, errors.As(err, &expectedErr))
|
|
})
|
|
|
|
t.Run("merge split info", func(t *testing.T) {
|
|
cnr := cidtest.ID()
|
|
splitID := objectSDK.NewSplitID()
|
|
|
|
parent := generateObjectWithCID(t, cnr)
|
|
addAttribute(parent, "foo", "bar")
|
|
|
|
child := generateObjectWithCID(t, cnr)
|
|
child.SetParent(parent)
|
|
idParent, _ := parent.ID()
|
|
child.SetParentID(idParent)
|
|
child.SetSplitID(splitID)
|
|
|
|
link := generateObjectWithCID(t, cnr)
|
|
link.SetParent(parent)
|
|
link.SetParentID(idParent)
|
|
idChild, _ := child.ID()
|
|
link.SetChildren(idChild)
|
|
link.SetSplitID(splitID)
|
|
|
|
t.Run("direct order", func(t *testing.T) {
|
|
err := putBig(db, child)
|
|
require.NoError(t, err)
|
|
|
|
err = putBig(db, link)
|
|
require.NoError(t, err)
|
|
|
|
_, err = metaExists(db, object.AddressOf(parent))
|
|
require.Error(t, err)
|
|
|
|
si, ok := err.(*objectSDK.SplitInfoError)
|
|
require.True(t, ok)
|
|
|
|
require.Equal(t, splitID, si.SplitInfo().SplitID())
|
|
|
|
id1, _ := child.ID()
|
|
id2, _ := si.SplitInfo().LastPart()
|
|
require.Equal(t, id1, id2)
|
|
|
|
id1, _ = link.ID()
|
|
id2, _ = si.SplitInfo().Link()
|
|
require.Equal(t, id1, id2)
|
|
})
|
|
|
|
t.Run("reverse order", func(t *testing.T) {
|
|
err := metaPut(db, link, nil)
|
|
require.NoError(t, err)
|
|
|
|
err = putBig(db, child)
|
|
require.NoError(t, err)
|
|
|
|
_, err = metaExists(db, object.AddressOf(parent))
|
|
require.Error(t, err)
|
|
|
|
si, ok := err.(*objectSDK.SplitInfoError)
|
|
require.True(t, ok)
|
|
|
|
require.Equal(t, splitID, si.SplitInfo().SplitID())
|
|
|
|
id1, _ := child.ID()
|
|
id2, _ := si.SplitInfo().LastPart()
|
|
require.Equal(t, id1, id2)
|
|
|
|
id1, _ = link.ID()
|
|
id2, _ = si.SplitInfo().Link()
|
|
require.Equal(t, id1, id2)
|
|
})
|
|
})
|
|
}
|