[#336] pool/tree: Increase test coverage in TestStreamRetry

Signed-off-by: Alex Vanin <a.vanin@yadro.com>
This commit is contained in:
Alexey Vanin 2025-02-28 12:29:23 +03:00
parent ada0513504
commit 2b8329e026

View file

@ -4,12 +4,14 @@ import (
"bytes" "bytes"
"context" "context"
"errors" "errors"
"io"
"net" "net"
"runtime" "runtime"
"strconv" "strconv"
"testing" "testing"
apinetmap "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/netmap" apinetmap "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/netmap"
apitree "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/tree"
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id" cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test" cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap"
@ -30,6 +32,7 @@ type mockTreeServer struct {
addCounter int addCounter int
getSubTreeError error getSubTreeError error
getSubTreeResponses []*tree.GetSubTreeResponse_Body
getSubTreeCounter int getSubTreeCounter int
} }
@ -93,9 +96,22 @@ func (m *mockTreeServer) GetNodeByPath(context.Context, *tree.GetNodeByPathReque
panic("implement me") panic("implement me")
} }
func (m *mockTreeServer) GetSubTree(*tree.GetSubTreeRequest, tree.TreeService_GetSubTreeServer) error { func (m *mockTreeServer) GetSubTree(_ *tree.GetSubTreeRequest, s tree.TreeService_GetSubTreeServer) error {
m.getSubTreeCounter++ m.getSubTreeCounter++
if m.getSubTreeError != nil {
return m.getSubTreeError return m.getSubTreeError
}
for i := range m.getSubTreeResponses {
if err := s.Send(&tree.GetSubTreeResponse{
Body: m.getSubTreeResponses[i],
}); err != nil {
return err
}
}
return nil
} }
func (m *mockTreeServer) TreeList(context.Context, *tree.TreeListRequest) (*tree.TreeListResponse, error) { func (m *mockTreeServer) TreeList(context.Context, *tree.TreeListRequest) (*tree.TreeListResponse, error) {
@ -246,11 +262,20 @@ func TestStreamRetry(t *testing.T) {
placementPolicy = "REP 2" placementPolicy = "REP 2"
) )
// Initialize gRPC servers and create pool with netmap source expected := []*tree.GetSubTreeResponse_Body{
treePool, servers, _ := preparePoolWithNetmapSource(t, numberOfNodes, placementPolicy) {
for i := range servers { NodeId: []uint64{1},
servers[i].getSubTreeError = errors.New("tree not found") },
{
NodeId: []uint64{2},
},
{
NodeId: []uint64{3},
},
} }
// Initialize gRPC servers and create pool with netmap source
treePool, servers, source := preparePoolWithNetmapSource(t, numberOfNodes, placementPolicy)
defer func() { defer func() {
for i := range servers { for i := range servers {
servers[i].Stop() servers[i].Stop()
@ -260,11 +285,61 @@ func TestStreamRetry(t *testing.T) {
cnr := cidtest.ID() cnr := cidtest.ID()
ctx := context.Background() ctx := context.Background()
_, err := treePool.GetSubTree(ctx, GetSubTreeParams{CID: cnr}) sortedServers, err := sortServers(ctx, servers, source, cnr)
require.Error(t, err) require.NoError(t, err)
// Return expected response in last priority node, others return error
for i := range sortedServers {
if i == len(sortedServers)-1 {
sortedServers[i].getSubTreeResponses = expected
} else {
sortedServers[i].getSubTreeError = errors.New("tree not found")
}
}
t.Run("read all", func(t *testing.T) {
reader, err := treePool.GetSubTree(ctx, GetSubTreeParams{CID: cnr})
require.NoError(t, err)
data, err := reader.ReadAll()
require.NoError(t, err)
require.Len(t, data, len(expected))
for i := range expected {
require.EqualValues(t, expected[i].GetNodeId(), data[i].GetNodeID())
}
})
t.Run("next", func(t *testing.T) {
reader, err := treePool.GetSubTree(ctx, GetSubTreeParams{CID: cnr})
require.NoError(t, err)
for i := range expected {
resp, err := reader.Next()
require.NoError(t, err)
require.Equal(t, expected[i].GetNodeId(), resp.GetNodeID())
}
_, err = reader.Next()
require.Error(t, io.EOF, err)
})
t.Run("read", func(t *testing.T) {
reader, err := treePool.GetSubTree(ctx, GetSubTreeParams{CID: cnr})
require.NoError(t, err)
buf := make([]*apitree.GetSubTreeResponseBody, len(expected))
_, err = reader.Read(buf)
require.NoError(t, err)
require.Len(t, buf, len(expected))
for i := range expected {
require.EqualValues(t, expected[i].GetNodeId(), buf[i].GetNodeID())
}
})
for i := range servers { for i := range servers {
// check we retried every available node in the pool // check we retried every available node in the pool three times
require.Equal(t, 1, servers[i].getSubTreeCounter) require.Equal(t, 3, servers[i].getSubTreeCounter)
} }
} }