1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-08 05:57:03 +09:00
any-sync/net/peerservice/peerservice_test.go
Sergey Cherepanov 66e3e50b6d
Revert "peerservice: ignore addrs list"
This reverts commit 95fe3ba04c.
2023-12-22 16:44:06 +01:00

170 lines
4.7 KiB
Go

package peerservice
import (
"context"
"fmt"
"github.com/anyproto/any-sync/app"
"github.com/anyproto/any-sync/net/peer"
"github.com/anyproto/any-sync/net/pool"
"github.com/anyproto/any-sync/net/rpc/rpctest"
"github.com/anyproto/any-sync/net/transport/mock_transport"
"github.com/anyproto/any-sync/net/transport/quic"
"github.com/anyproto/any-sync/net/transport/yamux"
"github.com/anyproto/any-sync/nodeconf"
"github.com/anyproto/any-sync/nodeconf/mock_nodeconf"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/mock/gomock"
"testing"
)
var ctx = context.Background()
func TestPeerService_Dial(t *testing.T) {
var addrs = []string{
"yamux://127.0.0.1:1111",
"quic://127.0.0.1:1112",
}
t.Run("prefer yamux", func(t *testing.T) {
fx := newFixture(t)
defer fx.finish(t)
fx.PreferQuic(false)
var peerId = "p1"
fx.nodeConf.EXPECT().PeerAddresses(peerId).Return(addrs, true)
fx.yamux.MockTransport.EXPECT().Dial(ctx, "127.0.0.1:1111").Return(fx.mockMC(peerId), nil)
p, err := fx.Dial(ctx, peerId)
require.NoError(t, err)
assert.NotNil(t, p)
})
t.Run("prefer quic", func(t *testing.T) {
fx := newFixture(t)
defer fx.finish(t)
fx.PreferQuic(true)
var peerId = "p1"
fx.nodeConf.EXPECT().PeerAddresses(peerId).Return(addrs, true)
fx.quic.MockTransport.EXPECT().Dial(ctx, "127.0.0.1:1112").Return(fx.mockMC(peerId), nil)
p, err := fx.Dial(ctx, peerId)
require.NoError(t, err)
assert.NotNil(t, p)
})
t.Run("first failed", func(t *testing.T) {
fx := newFixture(t)
defer fx.finish(t)
fx.PreferQuic(true)
var peerId = "p1"
fx.nodeConf.EXPECT().PeerAddresses(peerId).Return(addrs, true)
fx.quic.MockTransport.EXPECT().Dial(ctx, "127.0.0.1:1112").Return(nil, fmt.Errorf("test"))
fx.yamux.MockTransport.EXPECT().Dial(ctx, "127.0.0.1:1111").Return(fx.mockMC(peerId), nil)
p, err := fx.Dial(ctx, peerId)
require.NoError(t, err)
assert.NotNil(t, p)
})
t.Run("peerId mismatched", func(t *testing.T) {
fx := newFixture(t)
defer fx.finish(t)
fx.PreferQuic(false)
var peerId = "p1"
fx.nodeConf.EXPECT().PeerAddresses(peerId).Return(addrs, true)
fx.yamux.MockTransport.EXPECT().Dial(ctx, "127.0.0.1:1111").Return(fx.mockMC(peerId+"not valid"), nil)
p, err := fx.Dial(ctx, peerId)
assert.EqualError(t, err, ErrPeerIdMismatched.Error())
assert.Nil(t, p)
})
t.Run("custom addr", func(t *testing.T) {
fx := newFixture(t)
defer fx.finish(t)
fx.PreferQuic(false)
var peerId = "p1"
fx.SetPeerAddrs(peerId, addrs)
fx.nodeConf.EXPECT().PeerAddresses(peerId).Return(nil, false)
fx.yamux.MockTransport.EXPECT().Dial(ctx, "127.0.0.1:1111").Return(fx.mockMC(peerId), nil)
p, err := fx.Dial(ctx, peerId)
require.NoError(t, err)
assert.NotNil(t, p)
})
t.Run("addr without scheme", func(t *testing.T) {
fx := newFixture(t)
defer fx.finish(t)
fx.PreferQuic(false)
var peerId = "p1"
fx.nodeConf.EXPECT().PeerAddresses(peerId).Return([]string{"127.0.0.1:1111"}, true)
fx.yamux.MockTransport.EXPECT().Dial(ctx, "127.0.0.1:1111").Return(fx.mockMC(peerId), nil)
p, err := fx.Dial(ctx, peerId)
require.NoError(t, err)
assert.NotNil(t, p)
})
}
func TestPeerService_Accept(t *testing.T) {
fx := newFixture(t)
defer fx.finish(t)
mc := fx.mockMC("p1")
require.NoError(t, fx.Accept(mc))
}
type fixture struct {
PeerService
a *app.App
ctrl *gomock.Controller
quic mock_transport.TransportComponent
yamux mock_transport.TransportComponent
nodeConf *mock_nodeconf.MockService
}
func newFixture(t *testing.T) *fixture {
ctrl := gomock.NewController(t)
fx := &fixture{
PeerService: New(),
ctrl: ctrl,
a: new(app.App),
quic: mock_transport.NewTransportComponent(ctrl, quic.CName),
yamux: mock_transport.NewTransportComponent(ctrl, yamux.CName),
nodeConf: mock_nodeconf.NewMockService(ctrl),
}
fx.quic.EXPECT().SetAccepter(fx.PeerService)
fx.yamux.EXPECT().SetAccepter(fx.PeerService)
fx.nodeConf.EXPECT().Name().Return(nodeconf.CName).AnyTimes()
fx.nodeConf.EXPECT().Init(gomock.Any())
fx.nodeConf.EXPECT().Run(gomock.Any())
fx.nodeConf.EXPECT().Close(gomock.Any())
fx.a.Register(fx.PeerService).Register(fx.quic).Register(fx.yamux).Register(fx.nodeConf).Register(pool.New()).Register(rpctest.NewTestServer())
require.NoError(t, fx.a.Start(ctx))
return fx
}
func (fx *fixture) mockMC(peerId string) *mock_transport.MockMultiConn {
mc := mock_transport.NewMockMultiConn(fx.ctrl)
cctx := peer.CtxWithPeerId(ctx, peerId)
mc.EXPECT().Context().Return(cctx).AnyTimes()
mc.EXPECT().Accept().Return(nil, fmt.Errorf("test")).AnyTimes()
mc.EXPECT().Close().AnyTimes()
return mc
}
func (fx *fixture) finish(t *testing.T) {
require.NoError(t, fx.a.Close(ctx))
fx.ctrl.Finish()
}