Skip to content

Commit 455a983

Browse files
authored
swarm_test: support more transports for GenSwarm (libp2p#3130)
1 parent a085837 commit 455a983

File tree

5 files changed

+88
-17
lines changed

5 files changed

+88
-17
lines changed

p2p/net/swarm/swarm_dial_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,5 +427,5 @@ func TestSkipDialingManyDNS(t *testing.T) {
427427

428428
resolved := s.resolveAddrs(context.Background(), peer.AddrInfo{ID: id, Addrs: []ma.Multiaddr{addr}})
429429
require.NoError(t, err)
430-
require.Less(t, len(resolved), 3)
430+
require.Less(t, len(resolved), 3, "got: %v", resolved)
431431
}

p2p/net/swarm/swarm_notif_test.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
. "github.com/libp2p/go-libp2p/p2p/net/swarm"
1111

1212
ma "github.com/multiformats/go-multiaddr"
13+
manet "github.com/multiformats/go-multiaddr/net"
1314

1415
"github.com/stretchr/testify/require"
1516
)
@@ -93,11 +94,29 @@ func TestNotifications(t *testing.T) {
9394
}
9495
}
9596

97+
normalizeAddrs := func(a ma.Multiaddr, isLocal bool) ma.Multiaddr {
98+
// remove certhashes
99+
x, _ := ma.SplitFunc(a, func(c ma.Component) bool {
100+
return c.Protocol().Code == ma.P_CERTHASH
101+
})
102+
// on local addrs, replace 0.0.0.0 with 127.0.0.1
103+
if isLocal {
104+
if manet.IsIPUnspecified(x) {
105+
ip, rest := ma.SplitFirst(x)
106+
if ip.Protocol().Code == ma.P_IP4 {
107+
return ma.StringCast("/ip4/127.0.0.1").Encapsulate(rest)
108+
} else {
109+
return ma.StringCast("/ip6/::1").Encapsulate(rest)
110+
}
111+
}
112+
}
113+
return x
114+
}
96115
complement := func(c network.Conn) (*Swarm, *netNotifiee, *Conn) {
97116
for i, s := range swarms {
98117
for _, c2 := range s.Conns() {
99-
if c.LocalMultiaddr().Equal(c2.RemoteMultiaddr()) &&
100-
c2.LocalMultiaddr().Equal(c.RemoteMultiaddr()) {
118+
if normalizeAddrs(c.LocalMultiaddr(), true).Equal(normalizeAddrs(c2.RemoteMultiaddr(), false)) &&
119+
normalizeAddrs(c2.LocalMultiaddr(), true).Equal(normalizeAddrs(c.RemoteMultiaddr(), false)) {
101120
return s, notifiees[i], c2.(*Conn)
102121
}
103122
}

p2p/net/swarm/swarm_test.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,8 @@ func makeSwarms(t *testing.T, num int, opts ...Option) []*swarm.Swarm {
7979

8080
func connectSwarms(t *testing.T, ctx context.Context, swarms []*swarm.Swarm) {
8181
var wg sync.WaitGroup
82-
connect := func(s *swarm.Swarm, dst peer.ID, addr ma.Multiaddr) {
83-
// TODO: make a DialAddr func.
84-
s.Peerstore().AddAddr(dst, addr, peerstore.PermanentAddrTTL)
82+
connect := func(s *swarm.Swarm, dst peer.ID, addrs []ma.Multiaddr) {
83+
s.Peerstore().AddAddrs(dst, addrs, peerstore.TempAddrTTL)
8584
if _, err := s.DialPeer(ctx, dst); err != nil {
8685
t.Fatal("error swarm dialing to peer", err)
8786
}
@@ -92,7 +91,7 @@ func connectSwarms(t *testing.T, ctx context.Context, swarms []*swarm.Swarm) {
9291
for i, s1 := range swarms {
9392
for _, s2 := range swarms[i+1:] {
9493
wg.Add(1)
95-
connect(s1, s2.LocalPeer(), s2.ListenAddresses()[0]) // try the first.
94+
connect(s1, s2.LocalPeer(), s2.ListenAddresses())
9695
}
9796
}
9897
wg.Wait()

p2p/net/swarm/testing/testing.go

Lines changed: 62 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package testing
22

33
import (
44
"crypto/rand"
5+
"net"
56
"testing"
67
"time"
78

@@ -24,21 +25,25 @@ import (
2425
libp2pquic "github.com/libp2p/go-libp2p/p2p/transport/quic"
2526
"github.com/libp2p/go-libp2p/p2p/transport/quicreuse"
2627
"github.com/libp2p/go-libp2p/p2p/transport/tcp"
28+
libp2pwebrtc "github.com/libp2p/go-libp2p/p2p/transport/webrtc"
29+
libp2pwebtransport "github.com/libp2p/go-libp2p/p2p/transport/webtransport"
2730

2831
ma "github.com/multiformats/go-multiaddr"
2932
"github.com/quic-go/quic-go"
3033
"github.com/stretchr/testify/require"
3134
)
3235

3336
type config struct {
34-
disableReuseport bool
35-
dialOnly bool
36-
disableTCP bool
37-
disableQUIC bool
38-
connectionGater connmgr.ConnectionGater
39-
sk crypto.PrivKey
40-
swarmOpts []swarm.Option
41-
eventBus event.Bus
37+
disableReuseport bool
38+
dialOnly bool
39+
disableTCP bool
40+
disableQUIC bool
41+
disableWebTransport bool
42+
disableWebRTC bool
43+
connectionGater connmgr.ConnectionGater
44+
sk crypto.PrivKey
45+
swarmOpts []swarm.Option
46+
eventBus event.Bus
4247
clock
4348
}
4449

@@ -88,6 +93,16 @@ var OptDisableQUIC Option = func(_ testing.TB, c *config) {
8893
c.disableQUIC = true
8994
}
9095

96+
// OptDisableWebTransport disables WebTransport.
97+
var OptDisableWebTransport Option = func(_ testing.TB, c *config) {
98+
c.disableWebTransport = true
99+
}
100+
101+
// OptDisableWebRTC disables WebRTC.
102+
var OptDisableWebRTC Option = func(_ testing.TB, c *config) {
103+
c.disableWebRTC = true
104+
}
105+
91106
// OptConnGater configures the given connection gater on the test
92107
func OptConnGater(cg connmgr.ConnectionGater) Option {
93108
return func(_ testing.TB, c *config) {
@@ -175,8 +190,9 @@ func GenSwarm(t testing.TB, opts ...Option) *swarm.Swarm {
175190
}
176191
}
177192
}
193+
var reuse *quicreuse.ConnManager
178194
if !cfg.disableQUIC {
179-
reuse, err := quicreuse.NewConnManager(quic.StatelessResetKey{}, quic.TokenGeneratorKey{})
195+
reuse, err = quicreuse.NewConnManager(quic.StatelessResetKey{}, quic.TokenGeneratorKey{})
180196
if err != nil {
181197
t.Fatal(err)
182198
}
@@ -193,6 +209,43 @@ func GenSwarm(t testing.TB, opts ...Option) *swarm.Swarm {
193209
}
194210
}
195211
}
212+
if !cfg.disableWebTransport {
213+
if reuse == nil {
214+
reuse, err = quicreuse.NewConnManager(quic.StatelessResetKey{}, quic.TokenGeneratorKey{})
215+
if err != nil {
216+
t.Fatal(err)
217+
}
218+
}
219+
wtTransport, err := libp2pwebtransport.New(priv, nil, reuse, cfg.connectionGater, nil)
220+
if err != nil {
221+
t.Fatal(err)
222+
}
223+
if err := s.AddTransport(wtTransport); err != nil {
224+
t.Fatal(err)
225+
}
226+
if !cfg.dialOnly {
227+
if err := s.Listen(ma.StringCast("/ip4/127.0.0.1/udp/0/quic-v1/webtransport")); err != nil {
228+
t.Fatal(err)
229+
}
230+
}
231+
}
232+
if !cfg.disableWebRTC {
233+
listenUDPFn := func(network string, laddr *net.UDPAddr) (net.PacketConn, error) {
234+
return net.ListenUDP(network, laddr)
235+
}
236+
wrtcTransport, err := libp2pwebrtc.New(priv, nil, cfg.connectionGater, nil, listenUDPFn)
237+
if err != nil {
238+
t.Fatal(err)
239+
}
240+
if err := s.AddTransport(wrtcTransport); err != nil {
241+
t.Fatal(err)
242+
}
243+
if !cfg.dialOnly {
244+
if err := s.Listen(ma.StringCast("/ip4/127.0.0.1/udp/0/webrtc-direct")); err != nil {
245+
t.Fatal(err)
246+
}
247+
}
248+
}
196249
if !cfg.dialOnly {
197250
s.Peerstore().AddAddrs(id, s.ListenAddresses(), peerstore.PermanentAddrTTL)
198251
}

p2p/protocol/autonatv2/autonat_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func newAutoNAT(t testing.TB, dialer host.Host, opts ...AutoNATOption) *AutoNAT
2828
t.Helper()
2929
b := eventbus.NewBus()
3030
h := bhost.NewBlankHost(
31-
swarmt.GenSwarm(t, swarmt.EventBus(b)), bhost.WithEventBus(b))
31+
swarmt.GenSwarm(t, swarmt.EventBus(b), swarmt.OptDisableWebTransport, swarmt.OptDisableWebRTC), bhost.WithEventBus(b))
3232
if dialer == nil {
3333
dialer = bhost.NewBlankHost(
3434
swarmt.GenSwarm(t,

0 commit comments

Comments
 (0)