@ -396,6 +396,60 @@ BOOST_AUTO_TEST_CASE(cnetaddr_basic)
BOOST_CHECK ( ! addr . SetSpecial ( " totally bogus " ) ) ;
}
BOOST_AUTO_TEST_CASE ( cnetaddr_tostring_canonical_ipv6 )
{
// Test that CNetAddr::ToString formats IPv6 addresses with zero compression as described in
// RFC 5952 ("A Recommendation for IPv6 Address Text Representation").
const std : : map < std : : string , std : : string > canonical_representations_ipv6 {
{ " 0000:0000:0000:0000:0000:0000:0000:0000 " , " :: " } ,
{ " 000:0000:000:00:0:00:000:0000 " , " :: " } ,
{ " 000:000:000:000:000:000:000:000 " , " :: " } ,
{ " 00:00:00:00:00:00:00:00 " , " :: " } ,
{ " 0:0:0:0:0:0:0:0 " , " :: " } ,
{ " 0:0:0:0:0:0:0:1 " , " ::1 " } ,
{ " 2001:0:0:1:0:0:0:1 " , " 2001:0:0:1::1 " } ,
{ " 2001:0db8:0:0:1:0:0:1 " , " 2001:db8::1:0:0:1 " } ,
{ " 2001:0db8:85a3:0000:0000:8a2e:0370:7334 " , " 2001:db8:85a3::8a2e:370:7334 " } ,
{ " 2001:0db8::0001 " , " 2001:db8::1 " } ,
{ " 2001:0db8::0001:0000 " , " 2001:db8::1:0 " } ,
{ " 2001:0db8::1:0:0:1 " , " 2001:db8::1:0:0:1 " } ,
{ " 2001:db8:0000:0:1::1 " , " 2001:db8::1:0:0:1 " } ,
{ " 2001:db8:0000:1:1:1:1:1 " , " 2001:db8:0:1:1:1:1:1 " } ,
{ " 2001:db8:0:0:0:0:2:1 " , " 2001:db8::2:1 " } ,
{ " 2001:db8:0:0:0::1 " , " 2001:db8::1 " } ,
{ " 2001:db8:0:0:1:0:0:1 " , " 2001:db8::1:0:0:1 " } ,
{ " 2001:db8:0:0:1::1 " , " 2001:db8::1:0:0:1 " } ,
{ " 2001:DB8:0:0:1::1 " , " 2001:db8::1:0:0:1 " } ,
{ " 2001:db8:0:0::1 " , " 2001:db8::1 " } ,
{ " 2001:db8:0:0:aaaa::1 " , " 2001:db8::aaaa:0:0:1 " } ,
{ " 2001:db8:0:1:1:1:1:1 " , " 2001:db8:0:1:1:1:1:1 " } ,
{ " 2001:db8:0::1 " , " 2001:db8::1 " } ,
{ " 2001:db8:85a3:0:0:8a2e:370:7334 " , " 2001:db8:85a3::8a2e:370:7334 " } ,
{ " 2001:db8::0:1 " , " 2001:db8::1 " } ,
{ " 2001:db8::0:1:0:0:1 " , " 2001:db8::1:0:0:1 " } ,
{ " 2001:DB8::1 " , " 2001:db8::1 " } ,
{ " 2001:db8::1 " , " 2001:db8::1 " } ,
{ " 2001:db8::1:0:0:1 " , " 2001:db8::1:0:0:1 " } ,
{ " 2001:db8::1:1:1:1:1 " , " 2001:db8:0:1:1:1:1:1 " } ,
{ " 2001:db8::aaaa:0:0:1 " , " 2001:db8::aaaa:0:0:1 " } ,
{ " 2001:db8:aaaa:bbbb:cccc:dddd:0:1 " , " 2001:db8:aaaa:bbbb:cccc:dddd:0:1 " } ,
{ " 2001:db8:aaaa:bbbb:cccc:dddd::1 " , " 2001:db8:aaaa:bbbb:cccc:dddd:0:1 " } ,
{ " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:0001 " , " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:1 " } ,
{ " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:001 " , " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:1 " } ,
{ " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:01 " , " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:1 " } ,
{ " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:1 " , " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:1 " } ,
{ " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:aaaa " , " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:aaaa " } ,
{ " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:AAAA " , " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:aaaa " } ,
{ " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:AaAa " , " 2001:db8:aaaa:bbbb:cccc:dddd:eeee:aaaa " } ,
} ;
for ( const auto & [ input_address , expected_canonical_representation_output ] : canonical_representations_ipv6 ) {
CNetAddr net_addr ;
BOOST_REQUIRE ( LookupHost ( input_address , net_addr , false ) ) ;
BOOST_REQUIRE ( net_addr . IsIPv6 ( ) ) ;
BOOST_CHECK_EQUAL ( net_addr . ToString ( ) , expected_canonical_representation_output ) ;
}
}
BOOST_AUTO_TEST_CASE ( cnetaddr_serialize_v1 )
{
CNetAddr addr ;