98 lines
3.3 KiB
Go
98 lines
3.3 KiB
Go
package requestmanager
|
|
|
|
import (
|
|
"context"
|
|
"github.com/anyproto/any-sync/commonspace/objectsync"
|
|
"github.com/anyproto/any-sync/commonspace/objectsync/mock_objectsync"
|
|
"github.com/anyproto/any-sync/commonspace/spacesyncproto"
|
|
"github.com/anyproto/any-sync/commonspace/spacesyncproto/mock_spacesyncproto"
|
|
"github.com/anyproto/any-sync/net/peer"
|
|
"github.com/anyproto/any-sync/net/peer/mock_peer"
|
|
"github.com/anyproto/any-sync/net/pool/mock_pool"
|
|
"github.com/golang/mock/gomock"
|
|
"github.com/stretchr/testify/require"
|
|
"storj.io/drpc"
|
|
"storj.io/drpc/drpcconn"
|
|
"testing"
|
|
)
|
|
|
|
type fixture struct {
|
|
requestManager *requestManager
|
|
messageHandlerMock *mock_objectsync.MockObjectSync
|
|
peerPoolMock *mock_pool.MockPool
|
|
clientMock *mock_spacesyncproto.MockDRPCSpaceSyncClient
|
|
ctrl *gomock.Controller
|
|
}
|
|
|
|
func newFixture(t *testing.T) *fixture {
|
|
ctrl := gomock.NewController(t)
|
|
manager := New().(*requestManager)
|
|
peerPoolMock := mock_pool.NewMockPool(ctrl)
|
|
messageHandlerMock := mock_objectsync.NewMockObjectSync(ctrl)
|
|
clientMock := mock_spacesyncproto.NewMockDRPCSpaceSyncClient(ctrl)
|
|
manager.peerPool = peerPoolMock
|
|
manager.handler = messageHandlerMock
|
|
manager.clientFactory = spacesyncproto.ClientFactoryFunc(func(cc drpc.Conn) spacesyncproto.DRPCSpaceSyncClient {
|
|
return clientMock
|
|
})
|
|
manager.ctx, manager.cancel = context.WithCancel(context.Background())
|
|
return &fixture{
|
|
requestManager: manager,
|
|
messageHandlerMock: messageHandlerMock,
|
|
peerPoolMock: peerPoolMock,
|
|
clientMock: clientMock,
|
|
ctrl: ctrl,
|
|
}
|
|
}
|
|
|
|
func (fx *fixture) stop() {
|
|
fx.ctrl.Finish()
|
|
}
|
|
|
|
func TestRequestManager_Request(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
t.Run("send request", func(t *testing.T) {
|
|
fx := newFixture(t)
|
|
defer fx.stop()
|
|
|
|
peerId := "peerId"
|
|
peerMock := mock_peer.NewMockPeer(fx.ctrl)
|
|
conn := &drpcconn.Conn{}
|
|
msg := &spacesyncproto.ObjectSyncMessage{}
|
|
resp := &spacesyncproto.ObjectSyncMessage{}
|
|
fx.peerPoolMock.EXPECT().Get(ctx, peerId).Return(peerMock, nil)
|
|
fx.clientMock.EXPECT().ObjectSync(ctx, msg).Return(resp, nil)
|
|
peerMock.EXPECT().DoDrpc(ctx, gomock.Any()).DoAndReturn(func(ctx context.Context, drpcHandler func(conn drpc.Conn) error) {
|
|
drpcHandler(conn)
|
|
}).Return(nil)
|
|
res, err := fx.requestManager.SendRequest(ctx, peerId, msg)
|
|
require.NoError(t, err)
|
|
require.Equal(t, resp, res)
|
|
})
|
|
|
|
t.Run("request and handle", func(t *testing.T) {
|
|
fx := newFixture(t)
|
|
defer fx.stop()
|
|
ctx = fx.requestManager.ctx
|
|
|
|
peerId := "peerId"
|
|
peerMock := mock_peer.NewMockPeer(fx.ctrl)
|
|
conn := &drpcconn.Conn{}
|
|
msg := &spacesyncproto.ObjectSyncMessage{}
|
|
resp := &spacesyncproto.ObjectSyncMessage{}
|
|
fx.peerPoolMock.EXPECT().Get(ctx, peerId).Return(peerMock, nil)
|
|
fx.clientMock.EXPECT().ObjectSync(ctx, msg).Return(resp, nil)
|
|
peerMock.EXPECT().DoDrpc(ctx, gomock.Any()).DoAndReturn(func(ctx context.Context, drpcHandler func(conn drpc.Conn) error) {
|
|
drpcHandler(conn)
|
|
}).Return(nil)
|
|
fx.messageHandlerMock.EXPECT().HandleMessage(gomock.Any(), gomock.Any()).DoAndReturn(func(ctx context.Context, msg objectsync.HandleMessage) {
|
|
require.Equal(t, peerId, msg.SenderId)
|
|
require.Equal(t, resp, msg.Message)
|
|
pId, _ := peer.CtxPeerId(msg.PeerCtx)
|
|
require.Equal(t, peerId, pId)
|
|
}).Return(nil)
|
|
fx.requestManager.requestAndHandle(peerId, msg)
|
|
})
|
|
}
|