forked from TrueCloudLab/frostfs-sdk-go
[#336] pool/tree: Increase test coverage in TestStreamRetry
Signed-off-by: Alex Vanin <a.vanin@yadro.com>
This commit is contained in:
parent
ada0513504
commit
2b8329e026
1 changed files with 87 additions and 12 deletions
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue