frostfs-node/pkg/local_object_storage/metabase/exists_test.go
Evgenii Stratonikov f58234aa2f [#1559] metabase: Remove public functions
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>
2022-07-21 17:56:06 +03:00

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)
})
})
}