Add GUI/ULA/LLA address groupings

This commit is contained in:
David Kerr 2020-06-28 22:50:17 -04:00 committed by Richard Hansen
parent 29202f5bc1
commit e89f8b1acd

View file

@ -5,6 +5,50 @@ SKIP: { eval { require Test::Warnings; } or skip($@, 1); }
eval { require 'ddclient'; } or BAIL_OUT($@);
# Note, for GUA addresses we use 2001:DB8::/32 as that is reserved for
# documentation per RFC 3849 and so not routable on public internet.
# But we do have to add some others starting in 3xxx:: because they
# are also valid GUA.
my @valid_ipv6_gua = (
"2000::",
"2001:DB8:4341:0781:1111:2222:3333:4444",
"2001:DB8:4341:0781::4444",
"2001:DB8:4341:0781:1111::",
"2001:DB8:4341:0781::100",
"2001:DB8:4341:0781::1",
"2001:DB8:4341:0781::0001",
"2fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
"3000::",
"3001:DB8:4341:0781:1111:2222:3333:4444",
"3001:DB8:4341:0781::4444",
"3001:DB8:4341:0781:1111::",
"3001:DB8:4341:0781::100",
"3001:DB8:4341:0781::1",
"3001:DB8:4341:0781::0001",
"3fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
);
# For ULA addresses we randomly generated a /48 prefix per RFC 4193
# and are using subnet ID of 1 because why not.
my @valid_ipv6_ula = (
"fd00::",
"fdb6:1d86:d9bd:1:1111:2222:3333:4444",
"fdb6:1d86:d9bd:1::4444",
"fdb6:1d86:d9bd:1:1111::",
"fdb6:1d86:d9bd:1::100",
"fdb6:1d86:d9bd:1::1",
"fdb6:1d86:d9bd:1::0001",
"fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
);
my @valid_ipv6_lla = (
"fe80::",
"fe80::1111:2222:3333:4444",
"fe80::4444",
"fe80::1111",
"febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
);
my @valid_ipv6 = (
"::abcd:efAB:CDEF", # case sensitivity
"08:09:0a:0b:0c:0d:0e:0f", # leading zeros
@ -47,7 +91,10 @@ my @valid_ipv6 = (
"1111::3333:4444:5555:6666:7777:8888",
"::3333:4444:5555:6666:7777:8888",
"::2222:3333:4444:5555:6666:7777:8888",
# IPv4-mapped IPv6 addresses
);
my @valid_mixed_ipv6_non_gua = (
# with thanks to http://home.deds.nl/~aeron/regex/valid_ipv6.txt
"1111:2222:3333:4444:5555:6666:0.0.0.0",
"1111:2222:3333:4444:5555:6666:00.00.00.00",
"1111:2222:3333:4444:5555:6666:000.000.000.000",
@ -75,6 +122,25 @@ my @valid_ipv6 = (
"::2222:3333:4444:5555:6666:123.123.123.123",
);
my @valid_mixed_ipv6_gua = (
"2111:2222:3333:4444:5555:6666:123.123.123.123",
"2111:2222:3333:4444:5555::123.123.123.123",
"2111:2222:3333:4444::123.123.123.123",
"2111:2222:3333::123.123.123.123",
"2111:2222::123.123.123.123",
"2111::123.123.123.123",
"2111:2222:3333:4444::6666:123.123.123.123",
"2111:2222:3333::6666:123.123.123.123",
"2111:2222::6666:123.123.123.123",
"2111::6666:123.123.123.123",
"2111:2222:3333::5555:6666:123.123.123.123",
"2111:2222::5555:6666:123.123.123.123",
"2111::5555:6666:123.123.123.123",
"2111:2222::4444:5555:6666:123.123.123.123",
"2111::4444:5555:6666:123.123.123.123",
"2111::3333:4444:5555:6666:123.123.123.123",
);
my @invalid_ipv6 = (
# Empty string and bogus text
undef,
@ -361,6 +427,21 @@ my @invalid_ipv6 = (
"::2222:3333:4444:5555:6666:7777:8888:",
);
my @all_valid_ipv6 = (
@valid_ipv6_gua,
@valid_ipv6_ula,
@valid_ipv6_lla,
@valid_ipv6,
@valid_mixed_ipv6_non_gua,
@valid_mixed_ipv6_gua
);
my @short_valid_ipv6 = (
@valid_ipv6_gua,
@valid_ipv6_ula,
@valid_ipv6_lla,
);
my @if_samples = (
# Sample output from:
# ip -6 -o addr show dev <interface> scope global
@ -417,7 +498,7 @@ EOF
subtest "is_ipv6() with valid addresses" => sub {
foreach my $ip (@valid_ipv6) {
foreach my $ip (@all_valid_ipv6) {
ok(ddclient::is_ipv6($ip), "is_ipv6('$ip')");
}
};
@ -431,7 +512,7 @@ subtest "is_ipv6() with invalid addresses" => sub {
subtest "is_ipv6() with char adjacent to valid address" => sub {
foreach my $ch (split(//, '/.,:z @$#&%!^*()_-+'), "\n") {
subtest perlstring($ch) => sub {
foreach my $ip (@valid_ipv6) {
foreach my $ip (@short_valid_ipv6) {
subtest $ip => sub {
my $test = $ch . $ip; # insert at front
ok(!ddclient::is_ipv6($test), "!is_ipv6('$test')");
@ -465,7 +546,7 @@ subtest "extract_ipv6() of valid addr with adjacent non-word char" => sub {
foreach my $wb (split(//, '/, @$#&%!^*()_-+'), "\n") {
subtest perlstring($wb) => sub {
my $test = "";
foreach my $ip (@valid_ipv6) {
foreach my $ip (@short_valid_ipv6) {
$test = "foo" . $wb . $ip . $wb . "bar"; # wrap front and end
$ip =~ s/\b0+\B//g; ## remove embedded leading zeros for testing
is(ddclient::extract_ipv6($test), $ip, perlstring($test));