@@ -24,6 +24,7 @@ import (
24
24
"github.com/ipfs/go-cid"
25
25
ma "github.com/multiformats/go-multiaddr"
26
26
manet "github.com/multiformats/go-multiaddr/net"
27
+ "github.com/stretchr/testify/require"
27
28
)
28
29
29
30
// test specific parameters
@@ -39,6 +40,12 @@ type mockRoutingTable struct {
39
40
peers map [peer.ID ]peer.AddrInfo
40
41
}
41
42
43
+ func (t * mockRoutingTable ) NumPeers () int {
44
+ t .mx .Lock ()
45
+ defer t .mx .Unlock ()
46
+ return len (t .peers )
47
+ }
48
+
42
49
type mockRouting struct {
43
50
h host.Host
44
51
tab * mockRoutingTable
@@ -106,13 +113,9 @@ func (m *mockRouting) FindProvidersAsync(ctx context.Context, cid cid.Cid, limit
106
113
return ch
107
114
}
108
115
109
- // connector
110
116
func connect (t * testing.T , a , b host.Host ) {
111
117
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 ))
116
119
}
117
120
118
121
// and the actual test!
@@ -135,9 +138,6 @@ func isRelayAddr(addr ma.Multiaddr) bool {
135
138
}
136
139
137
140
func testAutoRelay (t * testing.T , useRelayv2 bool ) {
138
- ctx , cancel := context .WithCancel (context .Background ())
139
- defer cancel ()
140
-
141
141
mtab := newMockRoutingTable ()
142
142
makeRouting := func (h host.Host ) (* mockRouting , error ) {
143
143
mr := newMockRouting (h , mtab )
@@ -162,51 +162,35 @@ func testAutoRelay(t *testing.T, useRelayv2 bool) {
162
162
}
163
163
return addrs
164
164
}))
165
- if err != nil {
166
- t .Fatal (err )
167
- }
165
+ require .NoError (t , err )
168
166
defer relayHost .Close ()
169
167
170
168
// instantiate the relay
171
169
if useRelayv2 {
172
170
r , err := relayv2 .New (relayHost )
173
- if err != nil {
174
- t .Fatal (err )
175
- }
171
+ require .NoError (t , err )
176
172
defer r .Close ()
177
173
} else {
178
174
r , err := relayv1 .NewRelay (relayHost )
179
- if err != nil {
180
- t .Fatal (err )
181
- }
175
+ require .NoError (t , err )
182
176
defer r .Close ()
183
177
}
184
178
185
179
// advertise the relay
186
180
relayRouting , err := makeRouting (relayHost )
187
- if err != nil {
188
- t .Fatal (err )
189
- }
181
+ require .NoError (t , err )
190
182
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 )
192
185
193
186
// the client hosts
194
187
h1 , err := libp2p .New (libp2p .EnableRelay ())
195
- if err != nil {
196
- t .Fatal (err )
197
- }
188
+ require .NoError (t , err )
198
189
defer h1 .Close ()
199
190
200
191
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 )
204
193
defer h2 .Close ()
205
- h3 , err := libp2p .New (libp2p .EnableRelay ())
206
- if err != nil {
207
- t .Fatal (err )
208
- }
209
- defer h3 .Close ()
210
194
211
195
// verify that we don't advertise relay addrs initially
212
196
for _ , addr := range h2 .Addrs () {
@@ -217,24 +201,27 @@ func testAutoRelay(t *testing.T, useRelayv2 bool) {
217
201
218
202
// connect to AutoNAT, have it resolve to private.
219
203
connect (t , h1 , h2 )
220
- time . Sleep ( 300 * time . Millisecond )
204
+
221
205
privEmitter , _ := h2 .EventBus ().Emitter (new (event.EvtLocalReachabilityChanged ))
222
206
privEmitter .Emit (event.EvtLocalReachabilityChanged {Reachability : network .ReachabilityPrivate })
223
- // Wait for detection to do its magic
224
- time .Sleep (3000 * time .Millisecond )
225
207
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
+ }
235
217
}
218
+ return false
236
219
}
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 ()) {
238
225
t .Fatal ("No relay addrs advertised" )
239
226
}
240
227
@@ -245,26 +232,13 @@ func testAutoRelay(t *testing.T, useRelayv2 bool) {
245
232
raddrs = append (raddrs , addr )
246
233
}
247
234
}
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 }))
253
239
254
240
// 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 ())) {
268
242
t .Fatal ("No relay addrs pushed" )
269
243
}
270
244
}
0 commit comments