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