forked from TrueCloudLab/frostfs-node
[#335] treesvc: Add GetSubTree ordering unit test
Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
This commit is contained in:
parent
af82c2865e
commit
eed594431f
1 changed files with 61 additions and 0 deletions
|
@ -3,6 +3,8 @@ package tree
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
|
"path"
|
||||||
|
"sort"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/pilorama"
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/pilorama"
|
||||||
|
@ -119,6 +121,65 @@ func TestGetSubTree(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetSubTreeOrderAsc(t *testing.T) {
|
||||||
|
d := pilorama.CIDDescriptor{CID: cidtest.ID(), Size: 1}
|
||||||
|
treeID := "sometree"
|
||||||
|
p := pilorama.NewMemoryForest()
|
||||||
|
|
||||||
|
tree := []struct {
|
||||||
|
path []string
|
||||||
|
id uint64
|
||||||
|
}{
|
||||||
|
{path: []string{"dir1"}},
|
||||||
|
{path: []string{"dir2"}},
|
||||||
|
{path: []string{"dir1", "sub1"}},
|
||||||
|
{path: []string{"dir2", "sub1"}},
|
||||||
|
{path: []string{"dir2", "sub2"}},
|
||||||
|
{path: []string{"dir2", "sub1", "subsub1"}},
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := range tree {
|
||||||
|
path := tree[i].path
|
||||||
|
meta := []pilorama.KeyValue{
|
||||||
|
{Key: pilorama.AttributeFilename, Value: []byte(path[len(path)-1])}}
|
||||||
|
|
||||||
|
lm, err := p.TreeAddByPath(context.Background(), d, treeID, pilorama.AttributeFilename, path[:len(path)-1], meta)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, 1, len(lm))
|
||||||
|
tree[i].id = lm[0].Child
|
||||||
|
}
|
||||||
|
|
||||||
|
acc := subTreeAcc{errIndex: -1}
|
||||||
|
err := getSubTree(context.Background(), &acc, d.CID, &GetSubTreeRequest_Body{
|
||||||
|
TreeId: treeID,
|
||||||
|
OrderBy: &GetSubTreeRequest_Body_Order{
|
||||||
|
Direction: GetSubTreeRequest_Body_Order_Asc,
|
||||||
|
},
|
||||||
|
}, p)
|
||||||
|
require.NoError(t, err)
|
||||||
|
// GetSubTree must return child only after is has returned the parent.
|
||||||
|
require.Equal(t, uint64(0), acc.seen[0].Body.NodeId)
|
||||||
|
|
||||||
|
paths := make([]string, 0, len(acc.seen))
|
||||||
|
for i := range acc.seen {
|
||||||
|
if i == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
found := false
|
||||||
|
for j := range tree {
|
||||||
|
if acc.seen[i].Body.NodeId == tree[j].id {
|
||||||
|
found = true
|
||||||
|
paths = append(paths, path.Join(tree[j].path...))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
require.True(t, found, "unknown node")
|
||||||
|
}
|
||||||
|
|
||||||
|
require.True(t, sort.SliceIsSorted(paths, func(i, j int) bool {
|
||||||
|
return paths[i] < paths[j]
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
errSubTreeSend = errors.New("send finished with error")
|
errSubTreeSend = errors.New("send finished with error")
|
||||||
errSubTreeSendAfterError = errors.New("send was invoked after an error occurred")
|
errSubTreeSendAfterError = errors.New("send was invoked after an error occurred")
|
||||||
|
|
Loading…
Reference in a new issue