232 lines
6.8 KiB
Go
232 lines
6.8 KiB
Go
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))
|
|
}
|