@@ -45,6 +45,21 @@ func (m *mockEventTracer) getEvents() []*holepunch.Event {
4545
4646var _ holepunch.EventTracer = & mockEventTracer {}
4747
48+ type mockMaddrFilter struct {
49+ filterLocal func (remoteID peer.ID , maddrs []ma.Multiaddr ) []ma.Multiaddr
50+ filterRemote func (remoteID peer.ID , maddrs []ma.Multiaddr ) []ma.Multiaddr
51+ }
52+
53+ func (m mockMaddrFilter ) FilterLocal (remoteID peer.ID , maddrs []ma.Multiaddr ) []ma.Multiaddr {
54+ return m .filterLocal (remoteID , maddrs )
55+ }
56+
57+ func (m mockMaddrFilter ) FilterRemote (remoteID peer.ID , maddrs []ma.Multiaddr ) []ma.Multiaddr {
58+ return m .filterRemote (remoteID , maddrs )
59+ }
60+
61+ var _ holepunch.AddrFilter = & mockMaddrFilter {}
62+
4863type mockIDService struct {
4964 identify.IDService
5065}
@@ -110,7 +125,7 @@ func TestDirectDialWorks(t *testing.T) {
110125func TestEndToEndSimConnect (t * testing.T ) {
111126 h1tr := & mockEventTracer {}
112127 h2tr := & mockEventTracer {}
113- h1 , h2 , relay , _ := makeRelayedHosts (t , holepunch .WithTracer (h1tr ), holepunch .WithTracer (h2tr ), true )
128+ h1 , h2 , relay , _ := makeRelayedHosts (t , [] holepunch.Option { holepunch . WithTracer (h1tr )}, [] holepunch.Option { holepunch . WithTracer (h2tr )} , true )
114129 defer h1 .Close ()
115130 defer h2 .Close ()
116131 defer relay .Close ()
@@ -151,6 +166,7 @@ func TestFailuresOnInitiator(t *testing.T) {
151166 rhandler func (s network.Stream )
152167 errMsg string
153168 holePunchTimeout time.Duration
169+ filter func (remoteID peer.ID , maddrs []ma.Multiaddr ) []ma.Multiaddr
154170 }{
155171 "responder does NOT send a CONNECT message" : {
156172 rhandler : func (s network.Stream ) {
@@ -175,6 +191,12 @@ func TestFailuresOnInitiator(t *testing.T) {
175191 },
176192 errMsg : "i/o deadline reached" ,
177193 },
194+ "no addrs after filtering" : {
195+ errMsg : "aborting hole punch initiation as we have no public address" ,
196+ filter : func (remoteID peer.ID , maddrs []ma.Multiaddr ) []ma.Multiaddr {
197+ return []ma.Multiaddr {}
198+ },
199+ },
178200 }
179201
180202 for name , tc := range tcs {
@@ -190,7 +212,22 @@ func TestFailuresOnInitiator(t *testing.T) {
190212 defer h1 .Close ()
191213 defer h2 .Close ()
192214 defer relay .Close ()
193- hps := addHolePunchService (t , h2 , holepunch .WithTracer (tr ))
215+
216+ opts := []holepunch.Option {holepunch .WithTracer (tr )}
217+ if tc .filter != nil {
218+ f := mockMaddrFilter {
219+ filterLocal : tc .filter ,
220+ filterRemote : tc .filter ,
221+ }
222+ opts = append (opts , holepunch .WithAddrFilter (f ))
223+ }
224+
225+ hps := addHolePunchService (t , h2 , opts ... )
226+ // wait until the hole punching protocol has actually started
227+ require .Eventually (t , func () bool {
228+ protos , _ := h2 .Peerstore ().SupportsProtocols (h1 .ID (), string (holepunch .Protocol ))
229+ return len (protos ) > 0
230+ }, 200 * time .Millisecond , 10 * time .Millisecond )
194231
195232 if tc .rhandler != nil {
196233 h1 .SetStreamHandler (holepunch .Protocol , tc .rhandler )
@@ -221,6 +258,7 @@ func TestFailuresOnResponder(t *testing.T) {
221258 initiator func (s network.Stream )
222259 errMsg string
223260 holePunchTimeout time.Duration
261+ filter func (remoteID peer.ID , maddrs []ma.Multiaddr ) []ma.Multiaddr
224262 }{
225263 "initiator does NOT send a CONNECT message" : {
226264 initiator : func (s network.Stream ) {
@@ -258,6 +296,19 @@ func TestFailuresOnResponder(t *testing.T) {
258296 },
259297 errMsg : "expected CONNECT message to contain at least one address" ,
260298 },
299+ "no addrs after filtering" : {
300+ errMsg : "rejecting hole punch request, as we don't have any public addresses" ,
301+ initiator : func (s network.Stream ) {
302+ protoio .NewDelimitedWriter (s ).WriteMsg (& holepunch_pb.HolePunch {
303+ Type : holepunch_pb .HolePunch_CONNECT .Enum (),
304+ ObsAddrs : addrsToBytes ([]ma.Multiaddr {ma .StringCast ("/ip4/127.0.0.1/tcp/1234" )}),
305+ })
306+ time .Sleep (10 * time .Second )
307+ },
308+ filter : func (remoteID peer.ID , maddrs []ma.Multiaddr ) []ma.Multiaddr {
309+ return []ma.Multiaddr {}
310+ },
311+ },
261312 }
262313
263314 for name , tc := range tcs {
@@ -267,9 +318,18 @@ func TestFailuresOnResponder(t *testing.T) {
267318 holepunch .StreamTimeout = tc .holePunchTimeout
268319 defer func () { holepunch .StreamTimeout = cpy }()
269320 }
270-
271321 tr := & mockEventTracer {}
272- h1 , h2 , relay , _ := makeRelayedHosts (t , holepunch .WithTracer (tr ), nil , false )
322+
323+ opts := []holepunch.Option {holepunch .WithTracer (tr )}
324+ if tc .filter != nil {
325+ f := mockMaddrFilter {
326+ filterLocal : tc .filter ,
327+ filterRemote : tc .filter ,
328+ }
329+ opts = append (opts , holepunch .WithAddrFilter (f ))
330+ }
331+
332+ h1 , h2 , relay , _ := makeRelayedHosts (t , opts , nil , false )
273333 defer h1 .Close ()
274334 defer h2 .Close ()
275335 defer relay .Close ()
@@ -379,13 +439,9 @@ func mkHostWithStaticAutoRelay(t *testing.T, relay host.Host) host.Host {
379439 return h
380440}
381441
382- func makeRelayedHosts (t * testing.T , h1opt , h2opt holepunch.Option , addHolePuncher bool ) (h1 , h2 , relay host.Host , hps * holepunch.Service ) {
442+ func makeRelayedHosts (t * testing.T , h1opt , h2opt [] holepunch.Option , addHolePuncher bool ) (h1 , h2 , relay host.Host , hps * holepunch.Service ) {
383443 t .Helper ()
384- var h1opts []holepunch.Option
385- if h1opt != nil {
386- h1opts = append (h1opts , h1opt )
387- }
388- h1 , _ = mkHostWithHolePunchSvc (t , h1opts ... )
444+ h1 , _ = mkHostWithHolePunchSvc (t , h1opt ... )
389445 var err error
390446 relay , err = libp2p .New (libp2p .ListenAddrs (ma .StringCast ("/ip4/127.0.0.1/tcp/0" )), libp2p .DisableRelay ())
391447 require .NoError (t , err )
@@ -395,7 +451,7 @@ func makeRelayedHosts(t *testing.T, h1opt, h2opt holepunch.Option, addHolePunche
395451
396452 h2 = mkHostWithStaticAutoRelay (t , relay )
397453 if addHolePuncher {
398- hps = addHolePunchService (t , h2 , h2opt )
454+ hps = addHolePunchService (t , h2 , h2opt ... )
399455 }
400456
401457 // h1 has a relay addr
@@ -415,12 +471,8 @@ func makeRelayedHosts(t *testing.T, h1opt, h2opt holepunch.Option, addHolePunche
415471 return
416472}
417473
418- func addHolePunchService (t * testing.T , h host.Host , opt holepunch.Option ) * holepunch.Service {
474+ func addHolePunchService (t * testing.T , h host.Host , opts ... holepunch.Option ) * holepunch.Service {
419475 t .Helper ()
420- var opts []holepunch.Option
421- if opt != nil {
422- opts = append (opts , opt )
423- }
424476 hps , err := holepunch .NewService (h , newMockIDService (t , h ), opts ... )
425477 require .NoError (t , err )
426478 return hps
0 commit comments