Skip to content

Commit e5f9129

Browse files
Merge pull request #1272 from libp2p/autorelay-test
speed up the autorelay test, fix flaky TestAutoRelay test
2 parents 6147eb1 + 1beb093 commit e5f9129

File tree

1 file changed

+37
-63
lines changed

1 file changed

+37
-63
lines changed

p2p/host/autorelay/autorelay_test.go

+37-63
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"github.com/ipfs/go-cid"
2525
ma "github.com/multiformats/go-multiaddr"
2626
manet "github.com/multiformats/go-multiaddr/net"
27+
"github.com/stretchr/testify/require"
2728
)
2829

2930
// test specific parameters
@@ -39,6 +40,12 @@ type mockRoutingTable struct {
3940
peers map[peer.ID]peer.AddrInfo
4041
}
4142

43+
func (t *mockRoutingTable) NumPeers() int {
44+
t.mx.Lock()
45+
defer t.mx.Unlock()
46+
return len(t.peers)
47+
}
48+
4249
type mockRouting struct {
4350
h host.Host
4451
tab *mockRoutingTable
@@ -106,13 +113,9 @@ func (m *mockRouting) FindProvidersAsync(ctx context.Context, cid cid.Cid, limit
106113
return ch
107114
}
108115

109-
// connector
110116
func connect(t *testing.T, a, b host.Host) {
111117
pinfo := peer.AddrInfo{ID: a.ID(), Addrs: a.Addrs()}
112-
err := b.Connect(context.Background(), pinfo)
113-
if err != nil {
114-
t.Fatal(err)
115-
}
118+
require.NoError(t, b.Connect(context.Background(), pinfo))
116119
}
117120

118121
// and the actual test!
@@ -135,9 +138,6 @@ func isRelayAddr(addr ma.Multiaddr) bool {
135138
}
136139

137140
func testAutoRelay(t *testing.T, useRelayv2 bool) {
138-
ctx, cancel := context.WithCancel(context.Background())
139-
defer cancel()
140-
141141
mtab := newMockRoutingTable()
142142
makeRouting := func(h host.Host) (*mockRouting, error) {
143143
mr := newMockRouting(h, mtab)
@@ -162,51 +162,35 @@ func testAutoRelay(t *testing.T, useRelayv2 bool) {
162162
}
163163
return addrs
164164
}))
165-
if err != nil {
166-
t.Fatal(err)
167-
}
165+
require.NoError(t, err)
168166
defer relayHost.Close()
169167

170168
// instantiate the relay
171169
if useRelayv2 {
172170
r, err := relayv2.New(relayHost)
173-
if err != nil {
174-
t.Fatal(err)
175-
}
171+
require.NoError(t, err)
176172
defer r.Close()
177173
} else {
178174
r, err := relayv1.NewRelay(relayHost)
179-
if err != nil {
180-
t.Fatal(err)
181-
}
175+
require.NoError(t, err)
182176
defer r.Close()
183177
}
184178

185179
// advertise the relay
186180
relayRouting, err := makeRouting(relayHost)
187-
if err != nil {
188-
t.Fatal(err)
189-
}
181+
require.NoError(t, err)
190182
relayDiscovery := discovery.NewRoutingDiscovery(relayRouting)
191-
autorelay.Advertise(ctx, relayDiscovery)
183+
autorelay.Advertise(context.Background(), relayDiscovery)
184+
require.Eventually(t, func() bool { return mtab.NumPeers() > 0 }, time.Second, 10*time.Millisecond)
192185

193186
// the client hosts
194187
h1, err := libp2p.New(libp2p.EnableRelay())
195-
if err != nil {
196-
t.Fatal(err)
197-
}
188+
require.NoError(t, err)
198189
defer h1.Close()
199190

200191
h2, err := libp2p.New(libp2p.EnableRelay(), libp2p.EnableAutoRelay(), libp2p.Routing(makePeerRouting))
201-
if err != nil {
202-
t.Fatal(err)
203-
}
192+
require.NoError(t, err)
204193
defer h2.Close()
205-
h3, err := libp2p.New(libp2p.EnableRelay())
206-
if err != nil {
207-
t.Fatal(err)
208-
}
209-
defer h3.Close()
210194

211195
// verify that we don't advertise relay addrs initially
212196
for _, addr := range h2.Addrs() {
@@ -217,24 +201,27 @@ func testAutoRelay(t *testing.T, useRelayv2 bool) {
217201

218202
// connect to AutoNAT, have it resolve to private.
219203
connect(t, h1, h2)
220-
time.Sleep(300 * time.Millisecond)
204+
221205
privEmitter, _ := h2.EventBus().Emitter(new(event.EvtLocalReachabilityChanged))
222206
privEmitter.Emit(event.EvtLocalReachabilityChanged{Reachability: network.ReachabilityPrivate})
223-
// Wait for detection to do its magic
224-
time.Sleep(3000 * time.Millisecond)
225207

226-
// verify that we now advertise relay addrs (but not unspecific relay addrs)
227-
unspecificRelay := ma.StringCast("/p2p-circuit")
228-
var haveRelay bool
229-
for _, addr := range h2.Addrs() {
230-
if addr.Equal(unspecificRelay) {
231-
t.Fatal("unspecific relay addr advertised")
232-
}
233-
if isRelayAddr(addr) {
234-
haveRelay = true
208+
hasRelayAddrs := func(t *testing.T, addrs []ma.Multiaddr) bool {
209+
unspecificRelay := ma.StringCast("/p2p-circuit")
210+
for _, addr := range addrs {
211+
if addr.Equal(unspecificRelay) {
212+
t.Fatal("unspecific relay addr advertised")
213+
}
214+
if isRelayAddr(addr) {
215+
return true
216+
}
235217
}
218+
return false
236219
}
237-
if !haveRelay {
220+
// Wait for detection to do its magic
221+
require.Eventually(t, func() bool { return hasRelayAddrs(t, h2.Addrs()) }, 3*time.Second, 30*time.Millisecond)
222+
223+
// verify that we now advertise relay addrs (but not unspecific relay addrs)
224+
if !hasRelayAddrs(t, h2.Addrs()) {
238225
t.Fatal("No relay addrs advertised")
239226
}
240227

@@ -245,26 +232,13 @@ func testAutoRelay(t *testing.T, useRelayv2 bool) {
245232
raddrs = append(raddrs, addr)
246233
}
247234
}
248-
249-
err = h3.Connect(ctx, peer.AddrInfo{ID: h2.ID(), Addrs: raddrs})
250-
if err != nil {
251-
t.Fatal(err)
252-
}
235+
h3, err := libp2p.New(libp2p.EnableRelay())
236+
require.NoError(t, err)
237+
defer h3.Close()
238+
require.NoError(t, h3.Connect(context.Background(), peer.AddrInfo{ID: h2.ID(), Addrs: raddrs}))
253239

254240
// verify that we have pushed relay addrs to connected peers
255-
haveRelay = false
256-
for _, addr := range h1.Peerstore().Addrs(h2.ID()) {
257-
if addr.Equal(unspecificRelay) {
258-
t.Fatal("unspecific relay addr advertised")
259-
}
260-
261-
_, err := addr.ValueForProtocol(ma.P_CIRCUIT)
262-
if err == nil {
263-
haveRelay = true
264-
}
265-
}
266-
267-
if !haveRelay {
241+
if !hasRelayAddrs(t, h1.Peerstore().Addrs(h2.ID())) {
268242
t.Fatal("No relay addrs pushed")
269243
}
270244
}

0 commit comments

Comments
 (0)