@@ -396,6 +396,60 @@ BOOST_AUTO_TEST_CASE(cnetaddr_basic)
396
396
BOOST_CHECK (!addr.SetSpecial (" totally bogus" ));
397
397
}
398
398
399
+ BOOST_AUTO_TEST_CASE (cnetaddr_tostring_canonical_ipv6)
400
+ {
401
+ // Test that CNetAddr::ToString formats IPv6 addresses with zero compression as described in
402
+ // RFC 5952 ("A Recommendation for IPv6 Address Text Representation").
403
+ const std::map<std::string, std::string> canonical_representations_ipv6{
404
+ {" 0000:0000:0000:0000:0000:0000:0000:0000" , " ::" },
405
+ {" 000:0000:000:00:0:00:000:0000" , " ::" },
406
+ {" 000:000:000:000:000:000:000:000" , " ::" },
407
+ {" 00:00:00:00:00:00:00:00" , " ::" },
408
+ {" 0:0:0:0:0:0:0:0" , " ::" },
409
+ {" 0:0:0:0:0:0:0:1" , " ::1" },
410
+ {" 2001:0:0:1:0:0:0:1" , " 2001:0:0:1::1" },
411
+ {" 2001:0db8:0:0:1:0:0:1" , " 2001:db8::1:0:0:1" },
412
+ {" 2001:0db8:85a3:0000:0000:8a2e:0370:7334" , " 2001:db8:85a3::8a2e:370:7334" },
413
+ {" 2001:0db8::0001" , " 2001:db8::1" },
414
+ {" 2001:0db8::0001:0000" , " 2001:db8::1:0" },
415
+ {" 2001:0db8::1:0:0:1" , " 2001:db8::1:0:0:1" },
416
+ {" 2001:db8:0000:0:1::1" , " 2001:db8::1:0:0:1" },
417
+ {" 2001:db8:0000:1:1:1:1:1" , " 2001:db8:0:1:1:1:1:1" },
418
+ {" 2001:db8:0:0:0:0:2:1" , " 2001:db8::2:1" },
419
+ {" 2001:db8:0:0:0::1" , " 2001:db8::1" },
420
+ {" 2001:db8:0:0:1:0:0:1" , " 2001:db8::1:0:0:1" },
421
+ {" 2001:db8:0:0:1::1" , " 2001:db8::1:0:0:1" },
422
+ {" 2001:DB8:0:0:1::1" , " 2001:db8::1:0:0:1" },
423
+ {" 2001:db8:0:0::1" , " 2001:db8::1" },
424
+ {" 2001:db8:0:0:aaaa::1" , " 2001:db8::aaaa:0:0:1" },
425
+ {" 2001:db8:0:1:1:1:1:1" , " 2001:db8:0:1:1:1:1:1" },
426
+ {" 2001:db8:0::1" , " 2001:db8::1" },
427
+ {" 2001:db8:85a3:0:0:8a2e:370:7334" , " 2001:db8:85a3::8a2e:370:7334" },
428
+ {" 2001:db8::0:1" , " 2001:db8::1" },
429
+ {" 2001:db8::0:1:0:0:1" , " 2001:db8::1:0:0:1" },
430
+ {" 2001:DB8::1" , " 2001:db8::1" },
431
+ {" 2001:db8::1" , " 2001:db8::1" },
432
+ {" 2001:db8::1:0:0:1" , " 2001:db8::1:0:0:1" },
433
+ {" 2001:db8::1:1:1:1:1" , " 2001:db8:0:1:1:1:1:1" },
434
+ {" 2001:db8::aaaa:0:0:1" , " 2001:db8::aaaa:0:0:1" },
435
+ {" 2001:db8:aaaa:bbbb:cccc:dddd:0:1" , " 2001:db8:aaaa:bbbb:cccc:dddd:0:1" },
436
+ {" 2001:db8:aaaa:bbbb:cccc:dddd::1" , " 2001:db8:aaaa:bbbb:cccc:dddd:0:1" },
437
+ {" 2001:db8:aaaa:bbbb:cccc:dddd:eeee:0001" , " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:1" },
438
+ {" 2001:db8:aaaa:bbbb:cccc:dddd:eeee:001" , " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:1" },
439
+ {" 2001:db8:aaaa:bbbb:cccc:dddd:eeee:01" , " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:1" },
440
+ {" 2001:db8:aaaa:bbbb:cccc:dddd:eeee:1" , " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:1" },
441
+ {" 2001:db8:aaaa:bbbb:cccc:dddd:eeee:aaaa" , " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:aaaa" },
442
+ {" 2001:db8:aaaa:bbbb:cccc:dddd:eeee:AAAA" , " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:aaaa" },
443
+ {" 2001:db8:aaaa:bbbb:cccc:dddd:eeee:AaAa" , " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:aaaa" },
444
+ };
445
+ for (const auto & [input_address, expected_canonical_representation_output] : canonical_representations_ipv6) {
446
+ CNetAddr net_addr;
447
+ BOOST_REQUIRE (LookupHost (input_address, net_addr, false ));
448
+ BOOST_REQUIRE (net_addr.IsIPv6 ());
449
+ BOOST_CHECK_EQUAL (net_addr.ToString (), expected_canonical_representation_output);
450
+ }
451
+ }
452
+
399
453
BOOST_AUTO_TEST_CASE (cnetaddr_serialize_v1)
400
454
{
401
455
CNetAddr addr;
0 commit comments