@@ -209,71 +209,88 @@ func TestProbeManager(t *testing.T) {
209209 }
210210 return res
211211 }
212- // tcp private
213- for range targetConfidence {
212+
213+ // Conservative inheritance: secondaries only inherit Public from primary.
214+ // If primary is Private, secondaries still get probed (Private could be
215+ // protocol-specific, not port-level).
216+ //
217+ // TCP gets Public results - websocket inherits Public (skips probing)
218+ // This is the AutoTLS use case: TCP works, WSS inherits reachability.
219+ for i := range targetConfidence {
214220 reqs := nextProbe (pm )
215- matest .AssertEqualMultiaddrs (t , []ma.Multiaddr {tcp , quic , websocket , webrtc }, extractAddrs (reqs ))
216- pm .CompleteProbe (reqs , autonatv2.Result {Addr : tcp , Idx : 0 , Reachability : network .ReachabilityPrivate }, nil )
221+ if i < minConfidence {
222+ // TCP not yet confirmed Public, all 4 addresses need probing
223+ matest .AssertEqualMultiaddrs (t , []ma.Multiaddr {tcp , quic , websocket , webrtc }, extractAddrs (reqs ))
224+ } else {
225+ // TCP confirmed Public, websocket inherits - only 3 addresses
226+ matest .AssertEqualMultiaddrs (t , []ma.Multiaddr {tcp , quic , webrtc }, extractAddrs (reqs ))
227+ }
228+ pm .CompleteProbe (reqs , autonatv2.Result {Addr : tcp , Idx : 0 , Reachability : network .ReachabilityPublic }, nil )
217229 }
218- // quic public
230+
231+ // QUIC gets Private results - webrtc still needs probing (no inheritance)
232+ // This tests the conservative behavior: Private doesn't propagate.
219233 for range targetConfidence {
220234 reqs := nextProbe (pm )
221- matest .AssertEqualMultiaddrs (t , []ma.Multiaddr {quic , websocket , webrtc }, extractAddrs (reqs ))
222- pm .CompleteProbe (reqs , autonatv2.Result {Addr : quic , Idx : 0 , Reachability : network .ReachabilityPublic }, nil )
235+ // websocket already inherited from tcp, but webrtc doesn't inherit Private
236+ matest .AssertEqualMultiaddrs (t , []ma.Multiaddr {quic , webrtc }, extractAddrs (reqs ))
237+ pm .CompleteProbe (reqs , autonatv2.Result {Addr : quic , Idx : 0 , Reachability : network .ReachabilityPrivate }, nil )
223238 }
224- // only 1 check now required for websocket
225- for range 1 {
226- reqs := nextProbe (pm )
227- matest .AssertEqualMultiaddrs (t , []ma.Multiaddr {websocket , webrtc }, extractAddrs (reqs ))
228- pm .CompleteProbe (reqs , autonatv2.Result {Addr : websocket , Idx : 0 , Reachability : network .ReachabilityPrivate }, nil )
229- }
230- // 3 checks required for webrtc to make its reachability different from quic.
239+
240+ // webrtc still needs probing (doesn't inherit Private from quic)
241+ // Give webrtc its own Private status through probing
231242 for range targetConfidence {
232243 reqs := nextProbe (pm )
233244 matest .AssertEqualMultiaddrs (t , []ma.Multiaddr {webrtc }, extractAddrs (reqs ))
234245 pm .CompleteProbe (reqs , autonatv2.Result {Addr : webrtc , Idx : 0 , Reachability : network .ReachabilityPrivate }, nil )
235246 }
236247
248+ reqs := nextProbe (pm )
249+ require .Empty (t , reqs )
250+
237251 reachable , unreachable , _ := pm .AppendConfirmedAddrs (nil , nil , nil )
238- matest .AssertMultiaddrsMatch (t , []ma.Multiaddr {quic }, reachable )
239- matest .AssertMultiaddrsMatch (t , []ma.Multiaddr {tcp , websocket , webrtc }, unreachable )
252+ // websocket inherits Public from tcp (confirmed reachable port) - AutoTLS case
253+ // webrtc has its own Private status (probed independently)
254+ matest .AssertMultiaddrsMatch (t , []ma.Multiaddr {tcp , websocket }, reachable )
255+ matest .AssertMultiaddrsMatch (t , []ma.Multiaddr {quic , webrtc }, unreachable )
240256
241- // Every `highConfidenceAddrsProbeInterval` we refresh the primary addr binding
257+ // After highConfidenceAddrProbeInterval (1h), only primaries need refresh.
258+ // websocket inherits from tcp (Public), webrtc has longer refresh interval (3h).
242259 for range 2 {
243260 cl .Add (highConfidenceAddrProbeInterval + 1 * time .Millisecond )
244261 reqs := nextProbe (pm )
262+ // Only tcp and quic need refresh; websocket inherits, webrtc has 3h interval
245263 matest .AssertEqualMultiaddrs (t , []ma.Multiaddr {tcp , quic }, extractAddrs (reqs ))
246- pm .CompleteProbe (reqs , autonatv2.Result {Addr : tcp , Idx : 0 , Reachability : network .ReachabilityPrivate }, nil )
264+ pm .CompleteProbe (reqs , autonatv2.Result {Addr : tcp , Idx : 0 , Reachability : network .ReachabilityPublic }, nil )
247265 reqs = nextProbe (pm )
248266 matest .AssertEqualMultiaddrs (t , []ma.Multiaddr {quic }, extractAddrs (reqs ))
249- pm .CompleteProbe (reqs , autonatv2.Result {Addr : quic , Idx : 0 , Reachability : network .ReachabilityPublic }, nil )
267+ pm .CompleteProbe (reqs , autonatv2.Result {Addr : quic , Idx : 0 , Reachability : network .ReachabilityPrivate }, nil )
250268
251269 reqs = nextProbe (pm )
252270 require .Empty (t , reqs )
253271 }
254272
255- cl .Add (highConfidenceAddrProbeInterval + 1 * time .Millisecond )
256- reqs := nextProbe (pm )
257- matest .AssertEqualMultiaddrs (t , []ma.Multiaddr {tcp , quic , websocket , webrtc }, extractAddrs (reqs ))
258- pm .CompleteProbe (reqs , autonatv2.Result {Addr : tcp , Idx : 0 , Reachability : network .ReachabilityPrivate }, nil )
259- reqs = nextProbe (pm )
260- matest .AssertEqualMultiaddrs (t , []ma.Multiaddr {quic , websocket , webrtc }, extractAddrs (reqs ))
261- pm .CompleteProbe (reqs , autonatv2.Result {Addr : quic , Idx : 0 , Reachability : network .ReachabilityPublic }, nil )
273+ reachable , unreachable , _ = pm .AppendConfirmedAddrs (nil , nil , nil )
274+ matest .AssertMultiaddrsMatch (t , reachable , []ma.Multiaddr {tcp , websocket })
275+ matest .AssertMultiaddrsMatch (t , unreachable , []ma.Multiaddr {quic , webrtc })
262276
263- // secondary addrs refreshed at 3*highConfidenceProbeInterval
277+ // After highConfidenceSecondaryAddrProbeInterval (3h), webrtc needs refresh too.
278+ // We've advanced 2h+2ms, need to reach 3h+ for webrtc's refresh.
279+ // Also need to exceed 1h since last tcp/quic refresh for them to need refresh.
280+ cl .Add (highConfidenceSecondaryAddrProbeInterval - 2 * highConfidenceAddrProbeInterval + 1 * time .Millisecond )
281+ reqs = nextProbe (pm )
282+ // tcp, quic, and webrtc need refresh; websocket still inherits from tcp
283+ matest .AssertEqualMultiaddrs (t , []ma.Multiaddr {tcp , quic , webrtc }, extractAddrs (reqs ))
284+ pm .CompleteProbe (reqs , autonatv2.Result {Addr : tcp , Idx : 0 , Reachability : network .ReachabilityPublic }, nil )
264285 reqs = nextProbe (pm )
265- matest .AssertEqualMultiaddrs (t , []ma.Multiaddr {websocket , webrtc }, extractAddrs (reqs ))
266- pm .CompleteProbe (reqs , autonatv2.Result {Addr : websocket , Idx : 0 , Reachability : network .ReachabilityPrivate }, nil )
286+ matest .AssertEqualMultiaddrs (t , []ma.Multiaddr {quic , webrtc }, extractAddrs (reqs ))
287+ pm .CompleteProbe (reqs , autonatv2.Result {Addr : quic , Idx : 0 , Reachability : network .ReachabilityPrivate }, nil )
267288 reqs = nextProbe (pm )
268289 matest .AssertEqualMultiaddrs (t , []ma.Multiaddr {webrtc }, extractAddrs (reqs ))
269290 pm .CompleteProbe (reqs , autonatv2.Result {Addr : webrtc , Idx : 0 , Reachability : network .ReachabilityPrivate }, nil )
270291
271292 reqs = nextProbe (pm )
272293 require .Empty (t , reqs )
273-
274- reachable , unreachable , _ = pm .AppendConfirmedAddrs (nil , nil , nil )
275- matest .AssertMultiaddrsMatch (t , reachable , []ma.Multiaddr {quic })
276- matest .AssertMultiaddrsMatch (t , unreachable , []ma.Multiaddr {tcp , websocket , webrtc })
277294 })
278295}
279296
0 commit comments