@@ -250,15 +250,117 @@ class ReconnectionTaskSpec extends TestKitBaseClass with FixtureAnyFunSuiteLike
250250 assert(ReconnectionTask .selectNodeAddress(nodeParams, List (clearnet, tor)).contains(clearnet))
251251 }
252252 {
253- // tor supported and enabled for clearnet addresses: return tor addresses when available
253+ // tor supported and enabled for clearnet addresses: return both tor and clearnet addresses when available
254254 val socksParams = mock[Socks5ProxyParams ]
255255 socksParams.useForTor returns true
256256 socksParams.useForIPv4 returns true
257257 socksParams.useForIPv6 returns true
258258 nodeParams.socksProxy_opt returns Some (socksParams)
259259 assert(ReconnectionTask .selectNodeAddress(nodeParams, List (clearnet)).contains(clearnet))
260260 assert(ReconnectionTask .selectNodeAddress(nodeParams, List (tor)).contains(tor))
261- assert(ReconnectionTask .selectNodeAddress(nodeParams, List (clearnet, tor)).contains(tor))
261+ assert(ReconnectionTask .selectNodeAddress(nodeParams, List (clearnet, tor)).exists(Set (clearnet, tor)(_)))
262+ }
263+ {
264+ // tor supported and enabled for clearnet addresses, but disabled for tor: return clearnet addresses when available
265+ val socksParams = mock[Socks5ProxyParams ]
266+ socksParams.useForTor returns false
267+ socksParams.useForIPv4 returns true
268+ socksParams.useForIPv6 returns true
269+ nodeParams.socksProxy_opt returns Some (socksParams)
270+ assert(ReconnectionTask .selectNodeAddress(nodeParams, List (clearnet)).contains(clearnet))
271+ assert(ReconnectionTask .selectNodeAddress(nodeParams, List (tor)).isEmpty)
272+ assert(ReconnectionTask .selectNodeAddress(nodeParams, List (clearnet, tor)).contains(clearnet))
273+ }
274+ }
275+
276+ test(" select node addresses for reconnection" ) { () =>
277+ val nodeParams = mock[NodeParams ]
278+ val clearnetIPv4 = NodeAddress .fromParts(" 1.2.3.4" , 9735 ).get
279+ val clearnetIPv6 = NodeAddress .fromParts(" 2001:db8::1" , 9735 ).get
280+ val tor = NodeAddress .fromParts(" iq7zhmhck54vcax2vlrdcavq2m32wao7ekh6jyeglmnuuvv3js57r4id.onion" , 9735 ).get
281+ val dnsHostname = NodeAddress .fromParts(" example.com" , 9735 ).get
282+
283+ {
284+ // no proxy configured: only return clearnet addresses
285+ nodeParams.socksProxy_opt returns None
286+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4)) == List (clearnetIPv4))
287+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (tor)) == List .empty)
288+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4, tor)) == List (clearnetIPv4))
289+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4, clearnetIPv6, tor)) == List (clearnetIPv4, clearnetIPv6))
290+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (dnsHostname, tor)) == List (dnsHostname))
291+ }
292+ {
293+ // proxy configured but not for tor: only return clearnet addresses
294+ val socksParams = mock[Socks5ProxyParams ]
295+ socksParams.useForTor returns false
296+ socksParams.useForIPv4 returns true
297+ socksParams.useForIPv6 returns true
298+ nodeParams.socksProxy_opt returns Some (socksParams)
299+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4)) == List (clearnetIPv4))
300+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (tor)) == List .empty)
301+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4, tor)) == List (clearnetIPv4))
302+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4, clearnetIPv6, tor)) == List (clearnetIPv4, clearnetIPv6))
303+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (dnsHostname, tor)) == List (dnsHostname))
304+ }
305+ {
306+ // proxy configured for tor but not for IPv4: return tor addresses only if there ar no clearnet addresses, otherwise return clearnet addresses
307+ val socksParams = mock[Socks5ProxyParams ]
308+ socksParams.useForTor returns true
309+ socksParams.useForIPv4 returns false
310+ socksParams.useForIPv6 returns true
311+ nodeParams.socksProxy_opt returns Some (socksParams)
312+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4)) == List (clearnetIPv4))
313+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv6)) == List (clearnetIPv6))
314+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (tor)) == List (tor))
315+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4, tor)) == List (clearnetIPv4))
316+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv6, tor)) == List (clearnetIPv6))
317+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4, clearnetIPv6, tor)) == List (clearnetIPv4, clearnetIPv6))
318+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (dnsHostname, tor)) == List (dnsHostname))
319+ }
320+ {
321+ // proxy configured for tor but not for IPv6: return tor addresses only if there ar no clearnet addresses, otherwise return clearnet addresses
322+ val socksParams = mock[Socks5ProxyParams ]
323+ socksParams.useForTor returns true
324+ socksParams.useForIPv4 returns true
325+ socksParams.useForIPv6 returns false
326+ nodeParams.socksProxy_opt returns Some (socksParams)
327+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4)) == List (clearnetIPv4))
328+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv6)) == List (clearnetIPv6))
329+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (tor)) == List (tor))
330+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4, tor)) == List (clearnetIPv4))
331+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv6, tor)) == List (clearnetIPv6))
332+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4, clearnetIPv6, tor)) == List (clearnetIPv4, clearnetIPv6))
333+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (dnsHostname, tor)) == List (dnsHostname))
334+ }
335+ {
336+ // proxy configured for tor but not for IPv4 and IPv6: return tor addresses only if there ar no clearnet addresses, otherwise return clearnet addresses
337+ val socksParams = mock[Socks5ProxyParams ]
338+ socksParams.useForTor returns true
339+ socksParams.useForIPv4 returns false
340+ socksParams.useForIPv6 returns false
341+ nodeParams.socksProxy_opt returns Some (socksParams)
342+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4)) == List (clearnetIPv4))
343+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv6)) == List (clearnetIPv6))
344+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (tor)) == List (tor))
345+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4, tor)) == List (clearnetIPv4))
346+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv6, tor)) == List (clearnetIPv6))
347+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4, clearnetIPv6, tor)) == List (clearnetIPv4, clearnetIPv6))
348+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (dnsHostname, tor)) == List (dnsHostname))
349+ }
350+ {
351+ // proxy configured for tor and both IPv4/IPv6: return all addresses
352+ val socksParams = mock[Socks5ProxyParams ]
353+ socksParams.useForTor returns true
354+ socksParams.useForIPv4 returns true
355+ socksParams.useForIPv6 returns true
356+ nodeParams.socksProxy_opt returns Some (socksParams)
357+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4)) == List (clearnetIPv4))
358+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv6)) == List (clearnetIPv6))
359+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (tor)) == List (tor))
360+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4, tor)) == List (clearnetIPv4, tor))
361+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv6, tor)) == List (clearnetIPv6, tor))
362+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (clearnetIPv4, clearnetIPv6, tor)) == List (clearnetIPv4, clearnetIPv6, tor))
363+ assert(ReconnectionTask .selectNodeAddresses(nodeParams, List (dnsHostname, tor)) == List (dnsHostname, tor))
262364 }
263365 }
264366
0 commit comments