206
}
207
208
// stubHost is a minimal host.Host stub for testing httpRouterAddrFunc.
209
-// Only the methods checked via type assertion (confirmedAddrsHost) matter;
210
-// all other methods panic if called.
209
+// reachable mocks ConfirmedAddrs (AutoNAT V2 result); hostAddrs mocks
210
+// Addrs(), which in a real host returns wildcard-resolved interface
211
+// addresses after the AddrsFactory filters (NoAnnounce/AddrFilters).
212
type stubHost struct {
213
reachable []ma.Multiaddr
214
+ hostAddrs []ma.Multiaddr
215
}
216
217
func (h *stubHost) ConfirmedAddrs() (reachable, unreachable, unknown []ma.Multiaddr) {
219
}
220
221
func (h *stubHost) ID() peer.ID { panic("unused") }
220
-func (h *stubHost) Addrs() []ma.Multiaddr { panic("unused") }
222
+func (h *stubHost) Addrs() []ma.Multiaddr { return h.hostAddrs }
223
func (h *stubHost) Peerstore() peerstore.Peerstore { panic("unused") }
224
func (h *stubHost) Network() network.Network { panic("unused") }
225
func (h *stubHost) Mux() protocol.Switch { panic("unused") }
237
func (h *stubHost) EventBus() event.Bus { panic("unused") }
238
239
func TestHttpRouterAddrFunc(t *testing.T) {
240
+ // hostAddrs simulates what host.Addrs() returns in a running daemon:
241
+ // wildcard Swarm binds resolved to concrete interfaces, with the
242
+ // libp2p AddrsFactory (NoAnnounce/AddrFilters) already applied.
243
+ resolvedAddrs := []string{
244
+ "/ip4/192.168.1.10/tcp/4001",
245
+ "/ip4/192.168.1.10/udp/4001/quic-v1",
246
+ }
247
+
248
tests := []struct {
249
name string
250
reachable []string // autonat confirmed addrs (nil = none)
251
+ hostAddrs []string // host.Addrs() output (nil = none)
252
cfg config.Addresses
253
want []string
254
}{
255
{
245
- name: "prefers autonat confirmed reachable addrs over swarm fallback",
256
+ name: "prefers autonat confirmed reachable addrs over host.Addrs fallback",
257
reachable: []string{"/ip4/1.2.3.4/tcp/4001", "/ip4/1.2.3.4/udp/4001/quic-v1"},
258
+ hostAddrs: resolvedAddrs,
259
cfg: config.Addresses{Swarm: []string{"/ip4/0.0.0.0/tcp/4001", "/ip4/0.0.0.0/udp/4001/quic-v1"}},
260
want: []string{"/ip4/1.2.3.4/tcp/4001", "/ip4/1.2.3.4/udp/4001/quic-v1"},
261
},
262
{
251
- name: "falls back to swarm when autonat has no confirmed addrs",
252
- cfg: config.Addresses{Swarm: []string{"/ip4/0.0.0.0/tcp/4001"}},
253
- want: []string{"/ip4/0.0.0.0/tcp/4001"},
263
+ name: "falls back to host.Addrs when autonat has no confirmed addrs",
264
+ hostAddrs: resolvedAddrs,
265
+ cfg: config.Addresses{Swarm: []string{"/ip4/0.0.0.0/tcp/4001", "/ip4/0.0.0.0/udp/4001/quic-v1"}},
266
+ want: resolvedAddrs,
267
},
268
{
256
- name: "Announce overrides autonat and swarm",
269
+ name: "Announce overrides autonat and host.Addrs",
270
reachable: []string{"/ip4/1.2.3.4/tcp/4001"},
271
+ hostAddrs: resolvedAddrs,
272
cfg: config.Addresses{Swarm: []string{"/ip4/0.0.0.0/tcp/4001"}, Announce: []string{"/ip4/5.6.7.8/tcp/4001"}},
273
want: []string{"/ip4/5.6.7.8/tcp/4001"},
274
},
275
{
276
name: "AppendAnnounce added to autonat addrs",
277
reachable: []string{"/ip4/1.2.3.4/tcp/4001"},
278
+ hostAddrs: resolvedAddrs,
279
cfg: config.Addresses{Swarm: []string{"/ip4/0.0.0.0/tcp/4001"}, AppendAnnounce: []string{"/ip4/10.0.0.1/tcp/4001"}},
280
want: []string{"/ip4/1.2.3.4/tcp/4001", "/ip4/10.0.0.1/tcp/4001"},
281
},
282
{
268
- name: "AppendAnnounce added to swarm fallback",
269
- cfg: config.Addresses{Swarm: []string{"/ip4/0.0.0.0/tcp/4001"}, AppendAnnounce: []string{"/ip4/10.0.0.1/tcp/4001"}},
270
- want: []string{"/ip4/0.0.0.0/tcp/4001", "/ip4/10.0.0.1/tcp/4001"},
283
+ name: "AppendAnnounce added to host.Addrs fallback",
284
+ hostAddrs: resolvedAddrs,
285
+ cfg: config.Addresses{Swarm: []string{"/ip4/0.0.0.0/tcp/4001"}, AppendAnnounce: []string{"/ip4/10.0.0.1/tcp/4001"}},
286
+ want: append(append([]string{}, resolvedAddrs...), "/ip4/10.0.0.1/tcp/4001"),
287
},
288
{
273
- name: "NoAnnounce filters swarm fallback",
274
- cfg: config.Addresses{Swarm: []string{"/ip4/0.0.0.0/tcp/4001", "/ip4/0.0.0.0/udp/4001/quic-v1"}, NoAnnounce: []string{"/ip4/0.0.0.0/tcp/4001"}},
275
- want: []string{"/ip4/0.0.0.0/udp/4001/quic-v1"},
289
+ // NoAnnounce (including server profile CIDR ranges) is applied by the
290
+ // libp2p AddrsFactory before host.Addrs() returns, so httpRouterAddrFunc
291
+ // itself performs no filtering on the fallback.
292
+ name: "NoAnnounce filtering happens upstream in host.Addrs",
293
+ hostAddrs: []string{"/ip4/192.168.1.10/tcp/4001"}, // already filtered by addrFactory
294
+ cfg: config.Addresses{
295
+ Swarm: []string{"/ip4/0.0.0.0/tcp/4001"},
296
+ NoAnnounce: []string{"/ip4/127.0.0.0/ipcidr/8"},
297
+ },
298
+ want: []string{"/ip4/192.168.1.10/tcp/4001"},
299
},
300
{
301
name: "AppendAnnounce added to Announce",
305
}
306
for _, tt := range tests {
307
t.Run(tt.name, func(t *testing.T) {
285
- h := &stubHost{reachable: parseMultiaddrs(tt.reachable)}
308
+ h := &stubHost{
309
+ reachable: parseMultiaddrs(tt.reachable),
310
+ hostAddrs: parseMultiaddrs(tt.hostAddrs),
311
+ }
312
fn := httpRouterAddrFunc(h, tt.cfg)
313
assert.Equal(t, parseMultiaddrs(tt.want), fn())
314
})