@@ -227,4 +227,93 @@ BOOST_AUTO_TEST_CASE(ipv4_peer_with_ipv6_addrMe_test)
227227 BOOST_CHECK (1 );
228228}
229229
230+
231+ BOOST_AUTO_TEST_CASE (LimitedAndReachable_Network)
232+ {
233+ SetLimited (NET_IPV4, true );
234+ SetLimited (NET_IPV6, true );
235+ SetLimited (NET_ONION, true );
236+
237+ BOOST_CHECK_EQUAL (IsLimited (NET_IPV4), true );
238+ BOOST_CHECK_EQUAL (IsLimited (NET_IPV6), true );
239+ BOOST_CHECK_EQUAL (IsLimited (NET_ONION), true );
240+
241+ BOOST_CHECK_EQUAL (IsReachable (NET_IPV4), false );
242+ BOOST_CHECK_EQUAL (IsReachable (NET_IPV6), false );
243+ BOOST_CHECK_EQUAL (IsReachable (NET_ONION), false );
244+
245+
246+ SetLimited (NET_IPV4, false );
247+ SetLimited (NET_IPV6, false );
248+ SetLimited (NET_ONION, false );
249+
250+ BOOST_CHECK_EQUAL (IsLimited (NET_IPV4), false );
251+ BOOST_CHECK_EQUAL (IsLimited (NET_IPV6), false );
252+ BOOST_CHECK_EQUAL (IsLimited (NET_ONION), false );
253+
254+ BOOST_CHECK_EQUAL (IsReachable (NET_IPV4), true );
255+ BOOST_CHECK_EQUAL (IsReachable (NET_IPV6), true );
256+ BOOST_CHECK_EQUAL (IsReachable (NET_ONION), true );
257+ }
258+
259+ BOOST_AUTO_TEST_CASE (LimitedAndReachable_NetworkCaseUnroutableAndInternal)
260+ {
261+ BOOST_CHECK_EQUAL (IsLimited (NET_UNROUTABLE), false );
262+ BOOST_CHECK_EQUAL (IsLimited (NET_INTERNAL), false );
263+
264+ BOOST_CHECK_EQUAL (IsReachable (NET_UNROUTABLE), true );
265+ BOOST_CHECK_EQUAL (IsReachable (NET_INTERNAL), true );
266+
267+ SetLimited (NET_UNROUTABLE, true );
268+ SetLimited (NET_INTERNAL, true );
269+
270+ BOOST_CHECK_EQUAL (IsLimited (NET_UNROUTABLE), false ); // Ignored for both networks
271+ BOOST_CHECK_EQUAL (IsLimited (NET_INTERNAL), false );
272+
273+ BOOST_CHECK_EQUAL (IsReachable (NET_UNROUTABLE), true );
274+ BOOST_CHECK_EQUAL (IsReachable (NET_INTERNAL), true );
275+ }
276+
277+ CNetAddr UtilBuildAddress (unsigned char p1, unsigned char p2, unsigned char p3, unsigned char p4)
278+ {
279+ unsigned char ip[] = {p1, p2, p3, p4};
280+
281+ struct sockaddr_in sa;
282+ memset (&sa, 0 , sizeof (sockaddr_in)); // initialize the memory block
283+ memcpy (&(sa.sin_addr ), &ip, sizeof (ip));
284+ return CNetAddr (sa.sin_addr );
285+ }
286+
287+
288+ BOOST_AUTO_TEST_CASE (LimitedAndReachable_CNetAddr)
289+ {
290+ CNetAddr addr = UtilBuildAddress (0x001 , 0x001 , 0x001 , 0x001 ); // 1.1.1.1
291+
292+ SetLimited (NET_IPV4, false );
293+ BOOST_CHECK_EQUAL (IsLimited (addr), false );
294+ BOOST_CHECK_EQUAL (IsReachable (addr), true );
295+
296+ SetLimited (NET_IPV4, true );
297+ BOOST_CHECK_EQUAL (IsLimited (addr), true );
298+ BOOST_CHECK_EQUAL (IsReachable (addr), false );
299+
300+ SetLimited (NET_IPV4, false ); // have to reset this, because this is stateful.
301+ }
302+
303+
304+ BOOST_AUTO_TEST_CASE (LocalAddress_BasicLifecycle)
305+ {
306+ CService addr = CService (UtilBuildAddress (0x002 , 0x001 , 0x001 , 0x001 ), 1000 ); // 2.1.1.1:1000
307+
308+ SetLimited (NET_IPV4, false );
309+
310+ BOOST_CHECK_EQUAL (IsLocal (addr), false );
311+ BOOST_CHECK_EQUAL (AddLocal (addr, 1000 ), true );
312+ BOOST_CHECK_EQUAL (IsLocal (addr), true );
313+
314+ RemoveLocal (addr);
315+ BOOST_CHECK_EQUAL (IsLocal (addr), false );
316+ }
317+
318+
230319BOOST_AUTO_TEST_SUITE_END ()
0 commit comments