distribution/registry/storage/driver/frostfs/tree/tree_test.go

233 lines
6.8 KiB
Go
Raw Normal View History

package tree
import (
"context"
"testing"
cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
oidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id/test"
"github.com/google/uuid"
"github.com/stretchr/testify/require"
"go.uber.org/zap/zaptest"
)
func TestGetObjectByPath(t *testing.T) {
ctx := context.Background()
memCli, err := NewTreeServiceClientMemory()
require.NoError(t, err)
treeService := NewTree(memCli, zaptest.NewLogger(t))
cidTest := cidtest.ID()
oidTest1 := oidtest.ID()
oidTest2 := oidtest.ID()
testSize1 := uint64(10)
testSize2 := uint64(20)
nodeID1, err := treeService.AddObject(ctx, cidTest, "/a/b", oidTest1, testSize1)
require.NoError(t, err)
nodeID2, err := treeService.AddObject(ctx, cidTest, "/a/b/c/d", oidTest2, testSize2)
require.NoError(t, err)
node1, err := treeService.GetObjectByPath(ctx, cidTest, "/a/b")
require.NoError(t, err)
require.Equal(t, nodeID1, node1.ID)
require.Equal(t, oidTest1, node1.ObjID)
require.Equal(t, testSize1, node1.PayloadSize)
node2, err := treeService.GetObjectByPath(ctx, cidTest, "/a/b/c/d")
require.NoError(t, err)
require.Equal(t, nodeID2, node2.ID)
require.Equal(t, oidTest2, node2.ObjID)
require.Equal(t, testSize2, node2.PayloadSize)
_, err = treeService.GetObjectByPath(ctx, cidTest, "/g")
require.ErrorIs(t, err, ErrNodeNotFound)
_, err = treeService.GetObjectByPath(ctx, cidTest, "/a/b/c")
require.ErrorIs(t, err, ErrNodeNotFound)
}
func TestGetObjectByPathDir(t *testing.T) {
ctx := context.Background()
memCli, err := NewTreeServiceClientMemory()
require.NoError(t, err)
treeService := NewTree(memCli, zaptest.NewLogger(t))
cidTest := cidtest.ID()
oidTest1 := oidtest.ID()
oidTest2 := oidtest.ID()
testSize1 := uint64(10)
testSize2 := uint64(20)
nodeID1, err := treeService.AddObject(ctx, cidTest, "/a/b", oidTest1, testSize1)
require.NoError(t, err)
nodeID2, err := treeService.AddObject(ctx, cidTest, "/a/b/c/d", oidTest2, testSize2)
require.NoError(t, err)
node1, err := treeService.GetObjectByPath(ctx, cidTest, "/a/b")
require.NoError(t, err)
require.Equal(t, nodeID1, node1.ID)
require.Equal(t, oidTest1, node1.ObjID)
require.Equal(t, testSize1, node1.PayloadSize)
node2, err := treeService.GetObjectByPath(ctx, cidTest, "/a/b/c/d")
require.NoError(t, err)
require.Equal(t, nodeID2, node2.ID)
require.Equal(t, oidTest2, node2.ObjID)
require.Equal(t, testSize2, node2.PayloadSize)
_, err = treeService.GetObjectByPathDir(ctx, cidTest, "/g")
require.ErrorIs(t, err, ErrNodeNotFound)
_, err = treeService.GetObjectByPathDir(ctx, cidTest, "/a/b/c")
require.ErrorIs(t, err, ErrOnlyDirFound)
}
func TestGetListObjectByPrefix(t *testing.T) {
ctx := context.Background()
memCli, err := NewTreeServiceClientMemory()
require.NoError(t, err)
treeService := NewTree(memCli, zaptest.NewLogger(t))
cidTest := cidtest.ID()
oidTest1 := oidtest.ID()
oidTest2 := oidtest.ID()
oidTest3 := oidtest.ID()
oidTest4 := oidtest.ID()
testSize1 := uint64(10)
testSize2 := uint64(20)
testSize3 := uint64(30)
testSize4 := uint64(40)
_, err = treeService.AddObject(ctx, cidTest, "/a/b", oidTest1, testSize1)
require.NoError(t, err)
nodeID2, err := treeService.AddObject(ctx, cidTest, "/a/b/c", oidTest2, testSize2)
require.NoError(t, err)
nodeID3, err := treeService.AddObject(ctx, cidTest, "/a/b/c/d", oidTest3, testSize3)
require.NoError(t, err)
nodeID4, err := treeService.AddObject(ctx, cidTest, "/a/b/c/d/e", oidTest4, testSize4)
require.NoError(t, err)
nodes, err := treeService.GetListObjectByPrefix(ctx, cidTest, "/a/b")
require.NoError(t, err)
require.Equal(t, nodeID2, nodes[0].ID)
require.Equal(t, nodeID3, nodes[1].ID)
require.Equal(t, nodeID4, nodes[2].ID)
require.Equal(t, testSize2, nodes[0].PayloadSize)
require.Equal(t, testSize3, nodes[1].PayloadSize)
require.Equal(t, testSize4, nodes[2].PayloadSize)
nodes, err = treeService.GetListObjectByPrefix(ctx, cidTest, "/g/s")
require.NoError(t, err)
require.Equal(t, 0, len(nodes))
}
func TestGetListOIDBySplitID(t *testing.T) {
ctx := context.Background()
memCli, err := NewTreeServiceClientMemory()
require.NoError(t, err)
treeService := NewTree(memCli, zaptest.NewLogger(t))
cidTest := cidtest.ID()
oidTest1 := oidtest.ID()
oidTest2 := oidtest.ID()
oidTest3 := oidtest.ID()
splitID := object.NewSplitID()
splitID.SetUUID(uuid.New())
_, err = treeService.AddPHYObject(ctx, cidTest, "/a/b", oidTest1, splitID)
require.NoError(t, err)
_, err = treeService.AddPHYObject(ctx, cidTest, "/a/b", oidTest2, splitID)
require.NoError(t, err)
_, err = treeService.AddPHYObject(ctx, cidTest, "/a/b", oidTest3, splitID)
require.NoError(t, err)
ids, err := treeService.GetListOIDBySplitID(ctx, cidTest, "/a/b", splitID)
require.NoError(t, err)
require.Equal(t, oidTest1, ids[0])
require.Equal(t, oidTest2, ids[1])
require.Equal(t, oidTest3, ids[2])
ids, err = treeService.GetListOIDBySplitID(ctx, cidTest, "/c/d", splitID)
require.NoError(t, err)
require.Equal(t, 0, len(ids))
}
func TestDeleteObject(t *testing.T) {
ctx := context.Background()
memCli, err := NewTreeServiceClientMemory()
require.NoError(t, err)
treeService := NewTree(memCli, zaptest.NewLogger(t))
cidTest := cidtest.ID()
oidTest1 := oidtest.ID()
testSize := uint64(10)
nodeID1, err := treeService.AddObject(ctx, cidTest, "/a/b", oidTest1, testSize)
require.NoError(t, err)
err = treeService.DeleteObject(ctx, cidTest, nodeID1)
require.NoError(t, err)
_, err = treeService.GetObjectByPath(ctx, cidTest, "/a/b")
require.ErrorIs(t, err, ErrNodeNotFound)
err = treeService.DeleteObject(ctx, cidTest, nodeID1+1)
require.ErrorIs(t, err, ErrNodeNotFound)
}
func TestDeleteObjectsBySplitID(t *testing.T) {
ctx := context.Background()
memCli, err := NewTreeServiceClientMemory()
require.NoError(t, err)
treeService := NewTree(memCli, zaptest.NewLogger(t))
cidTest := cidtest.ID()
oidTest1 := oidtest.ID()
oidTest2 := oidtest.ID()
oidTest3 := oidtest.ID()
splitID := object.NewSplitID()
splitID.SetUUID(uuid.New())
_, err = treeService.AddPHYObject(ctx, cidTest, "/a/b", oidTest1, splitID)
require.NoError(t, err)
_, err = treeService.AddPHYObject(ctx, cidTest, "/a/b", oidTest2, splitID)
require.NoError(t, err)
_, err = treeService.AddPHYObject(ctx, cidTest, "/a/b", oidTest3, splitID)
require.NoError(t, err)
ids, err := treeService.GetListOIDBySplitID(ctx, cidTest, "/a/b", splitID)
require.NoError(t, err)
require.Equal(t, 3, len(ids))
err = treeService.DeleteObjectsBySplitID(ctx, cidTest, "/a/b", splitID)
require.NoError(t, err)
ids, err = treeService.GetListOIDBySplitID(ctx, cidTest, "/a/b", splitID)
require.NoError(t, err)
require.Equal(t, 0, len(ids))
ids, err = treeService.GetListOIDBySplitID(ctx, cidTest, "/c/d", splitID)
require.NoError(t, err)
require.Equal(t, 0, len(ids))
}