feat: add full Zonemaster stack with Docker and Spanish UI

- Clone all 5 Zonemaster component repos (LDNS, Engine, CLI, Backend, GUI)
- Dockerfile.backend: 8-stage multi-stage build LDNS→Engine→CLI→Backend
- Dockerfile.gui: Astro static build served via nginx
- docker-compose.yml: backend (internal) + frontend (port 5353)
- nginx.conf: root redirects to /es/, /api/ proxied to backend
- zonemaster-gui/config.ts: defaultLanguage set to 'es' (Spanish)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-21 08:19:24 +02:00
commit 8d4eaa1489
1567 changed files with 204155 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
use 5.014002;
use strict;
use warnings FATAL => 'all';
use Test::More;
plan tests => 1;
BEGIN {
use_ok( 'Zonemaster::Engine' ) || print "Bail out!\n";
}
diag( "Testing Zonemaster Engine $Zonemaster::Engine::VERSION, Perl $], $^X" );
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,108 @@
use Test::More;
use File::Slurp;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Nameserver} );
use_ok( q{Zonemaster::Engine::Test::Address} );
}
my $datafile = q{t/Test-address.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die "Stored data file missing" if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
my $json = read_file( "t/profiles/Test-address-all.json" );
my $profile_test = Zonemaster::Engine::Profile->from_json( $json );
Zonemaster::Engine::Profile->effective->merge( $profile_test );
my @special_addresses = qw(0.255.255.255
10.255.255.255
192.168.255.255
172.17.255.255
100.65.255.255
127.255.255.255
169.254.255.255
192.0.0.255
192.0.0.7
192.0.0.170
192.0.0.171
192.0.2.255
198.51.100.255
203.0.113.255
192.88.99.255
198.19.255.255
240.255.255.255
255.255.255.255
::1
::
::ffff:cafe:cafe
64:ff9b::cafe:cafe
100::cafe:cafe:cafe:cafe
2001:1ff:cafe:cafe:cafe:cafe:cafe:cafe
2001::cafe:cafe:cafe:cafe:cafe:cafe
2001:2::cafe:cafe:cafe:cafe:cafe
2001:db8:cafe:cafe:cafe:cafe:cafe:cafe
2001:1f::cafe:cafe:cafe:cafe:cafe
2002:cafe:cafe:cafe:cafe:cafe:cafe:cafe
fdff:cafe:cafe:cafe:cafe:cafe:cafe:cafe
febf:cafe:cafe:cafe:cafe:cafe:cafe:cafe
);
foreach my $addr ( @special_addresses ) {
ok(
defined(
Zonemaster::Engine::Test::Address->_find_special_address(
Net::IP::XS->new( $addr )
)
),
"Special address: $addr"
);
}
###########
# address
###########
my %res;
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{address}, q{nic.fr} );
ok( $res{NAMESERVER_IP_PTR_MISMATCH}, q{Nameserver IP PTR mismatch} );
ok( $res{A01_GLOBALLY_REACHABLE_ADDR}, q{All Nameserver addresses are in the routable public addressing space} );
ok( $res{NAMESERVERS_IP_WITH_REVERSE}, q{Reverse DNS entry exist for all Nameserver IP addresses} );
###########
# address01
###########
# See t/Test-address01.t
###########
# address02
###########
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{address}, q{address02.zut-root.rd.nic.fr} );
ok( $res{NAMESERVER_IP_WITHOUT_REVERSE}, q{Nameserver IP without PTR} );
my $zone = Zonemaster::Engine->zone( q{torsas.se} );
my @res = Zonemaster::Engine->test_method( q{Address}, q{address02}, $zone );
ok( !( grep { $_->tag eq 'NAMESERVER_IP_WITHOUT_REVERSE' } @res ), 'Classless in-addr.arpa properly handled when querying PTR.' );
###########
# address03
###########
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{address}, q{is.se} );
ok( $res{NAMESERVER_IP_PTR_MATCH}, q{All reverse DNS entry matches name server name} );
@res = Zonemaster::Engine->test_method( q{Address}, q{address03}, $zone );
ok( !( grep { $_->tag eq 'NAMESERVER_IP_WITHOUT_REVERSE' } @res ), 'Classless in-addr.arpa properly handled when querying PTR.' );
###########
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,158 @@
use strict;
use warnings;
use Test::More;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Nameserver} );
use_ok( q{Zonemaster::Engine::Test::Address} );
use_ok( q{TestUtil}, qw( perform_testcase_testing ) );
}
###########
# address01 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/Address-TP/address01.md
my $test_module = 'Address';
my $test_case = 'address01';
my @all_tags = qw(A01_ADDR_NOT_GLOBALLY_REACHABLE
A01_DOCUMENTATION_ADDR
A01_GLOBALLY_REACHABLE_ADDR
A01_LOCAL_USE_ADDR
A01_NO_GLOBALLY_REACHABLE_ADDR
A01_NO_NAME_SERVERS_FOUND);
# Common hint file (test-zone-data/COMMON/hintfile)
Zonemaster::Engine::Recursor->remove_fake_addresses( '.' );
Zonemaster::Engine::Recursor->add_fake_addresses( '.',
{ 'ns1' => [ '127.1.0.1', 'fda1:b2:c3::127:1:0:1' ],
'ns2' => [ '127.1.0.2', 'fda1:b2:c3::127:1:0:2' ],
}
);
# Test zone scenarios
# - Documentation: L<TestUtil/perform_testcase_testing()>
# - Format: { SCENARIO_NAME => [
# testable,
# zone_name,
# [ MANDATORY_MESSAGE_TAGS ],
# [ FORBIDDEN_MESSAGE_TAGS ],
# [ UNDELEGATED_NS ],
# [ UNDELEGATED_DS ],
# ] }
#
# - One of MANDATORY_MESSAGE_TAGS and FORBIDDEN_MESSAGE_TAGS may be undefined.
# See documentation for the meaning of that.
my %subtests = (
'GOOD-1' => [
1,
q(good-1.address01.xa),
[ qw(A01_GLOBALLY_REACHABLE_ADDR) ],
undef,
[],
[],
],
'ALL-NON-REACHABLE' => [
1,
q(all-non-reachable.address01.xa),
[ qw(A01_ADDR_NOT_GLOBALLY_REACHABLE A01_LOCAL_USE_ADDR A01_DOCUMENTATION_ADDR A01_NO_GLOBALLY_REACHABLE_ADDR) ],
undef,
[],
[],
],
'MIXED-LOCAL-DOC-1' => [
1,
q(mixed-local-doc-1.address01.xa),
[ qw(A01_LOCAL_USE_ADDR A01_DOCUMENTATION_ADDR A01_GLOBALLY_REACHABLE_ADDR) ],
undef,
[],
[],
],
'MIXED-LOCAL-DOC-2' => [
1,
q(mixed-local-doc-2.address01.xa),
[ qw(A01_LOCAL_USE_ADDR A01_DOCUMENTATION_ADDR A01_GLOBALLY_REACHABLE_ADDR) ],
undef,
[],
[],
],
'MIXED-LOCAL-OTHER-1' => [
1,
q(mixed-local-other-1.address01.xa),
[ qw(A01_LOCAL_USE_ADDR A01_ADDR_NOT_GLOBALLY_REACHABLE A01_GLOBALLY_REACHABLE_ADDR) ],
undef,
[],
[],
],
'MIXED-LOCAL-OTHER-2' => [
1,
q(mixed-local-other-2.address01.xa),
[ qw(A01_LOCAL_USE_ADDR A01_ADDR_NOT_GLOBALLY_REACHABLE A01_GLOBALLY_REACHABLE_ADDR) ],
undef,
[],
[],
],
'MIXED-DOC-OTHER-1' => [
1,
q(mixed-doc-other-1.address01.xa),
[ qw(A01_DOCUMENTATION_ADDR A01_ADDR_NOT_GLOBALLY_REACHABLE A01_GLOBALLY_REACHABLE_ADDR) ],
undef,
[],
[],
],
'MIXED-DOC-OTHER-2' => [
1,
q(mixed-doc-other-2.address01.xa),
[ qw(A01_DOCUMENTATION_ADDR A01_ADDR_NOT_GLOBALLY_REACHABLE A01_GLOBALLY_REACHABLE_ADDR) ],
undef,
[],
[],
],
'MIXED-ALL-1' => [
1,
q(mixed-all-1.address01.xa),
[ qw(A01_ADDR_NOT_GLOBALLY_REACHABLE A01_DOCUMENTATION_ADDR A01_LOCAL_USE_ADDR A01_GLOBALLY_REACHABLE_ADDR) ],
undef,
[],
[],
],
'MIXED-ALL-2' => [
1,
q(mixed-all-2.address01.xa),
[ qw(A01_ADDR_NOT_GLOBALLY_REACHABLE A01_DOCUMENTATION_ADDR A01_LOCAL_USE_ADDR A01_GLOBALLY_REACHABLE_ADDR) ],
undef,
[],
[],
],
'NO-NAME-SERVERS' => [
1,
q(no-name-servers.address01.xa),
[ qw(A01_NO_NAME_SERVERS_FOUND) ],
undef,
[],
[],
]
);
###########
my $datafile = 't/' . basename ($0, '.t') . '.data';
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
Zonemaster::Engine::Profile->effective->merge( Zonemaster::Engine::Profile->from_json( qq({ "test_cases": [ "$test_case" ] }) ) );
perform_testcase_testing( $test_case, $test_module, \@all_tags, \%subtests, $ENV{ZONEMASTER_SELECTED_SCENARIOS}, $ENV{ZONEMASTER_DISABLED_SCENARIOS} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,58 @@
use strict;
use warnings;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
use TestUtil::DSL;
testing_test_case 'Address', 'address03';
all_tags qw(NAMESERVER_IP_PTR_MATCH
NAMESERVER_IP_PTR_MISMATCH
NAMESERVER_IP_WITHOUT_REVERSE
NO_RESPONSE_PTR_QUERY);
# Common hint file (test-zone-data/COMMON/hintfile)
root_hints 'ns1' => [ qw(127.1.0.1 fda1:b2:c3::127:1:0:1) ],
'ns2' => [ qw(127.1.0.2 fda1:b2:c3::127:1:0:2) ];
zone_name_template '{SCENARIO}.{TESTCASE}.xa';
# Test zone scenarios
scenario 'ALL-NS-HAVE-PTR-{1..2}' => sub {
expect 'NAMESERVER_IP_PTR_MATCH';
forbid_others;
};
scenario 'NO-NS-HAVE-PTR' => sub {
expect 'NAMESERVER_IP_WITHOUT_REVERSE';
forbid_others;
};
scenario 'INCOMPLETE-PTR-{1..2}' => sub {
expect 'NAMESERVER_IP_WITHOUT_REVERSE';
forbid_others;
};
scenario 'NON-MATCHING-NAMES' => sub {
expect 'NAMESERVER_IP_PTR_MISMATCH';
forbid_others;
};
scenario 'PTR-IS-GOOD-CNAME-{1..2}' => sub {
expect 'NAMESERVER_IP_PTR_MATCH';
forbid_others;
};
scenario 'PTR-IS-DANGLING-CNAME' => sub {
expect 'NAMESERVER_IP_WITHOUT_REVERSE';
forbid_others;
};
scenario 'PTR-IS-ILLEGAL-CNAME' => sub {
expect 'NAMESERVER_IP_WITHOUT_REVERSE';
forbid 'NAMESERVER_IP_PTR_MATCH';
};
no_more_scenarios;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,101 @@
use Test::More;
use File::Slurp;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Nameserver} );
use_ok( q{Zonemaster::Engine::Test::Basic} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $checking_module = q{Basic};
sub name_gives {
my ( $test, $name, $gives ) = @_;
my @res = Zonemaster::Engine->test_method( q{Basic}, $test, $name );
ok( ( grep { $_->tag eq $gives } @res ), "$name gives $gives" );
}
sub name_gives_not {
my ( $test, $name, $gives ) = @_;
my @res = Zonemaster::Engine->test_method( q{Basic}, $test, $name );
ok( !( grep { $_->tag eq $gives } @res ), "$name does not give $gives" );
}
sub zone_gives {
my ( $test, $zone, $gives_ref ) = @_;
Zonemaster::Engine->logger->clear_history();
my @res = grep { $_->tag !~ /^TEST_CASE_(END|START)$/ } Zonemaster::Engine->test_method( $checking_module, $test, $zone );
foreach my $gives ( @{$gives_ref} ) {
ok( ( grep { $_->tag eq $gives } @res ), $zone->name->string . " gives $gives" );
}
return scalar( @res );
}
sub zone_gives_not {
my ( $test, $zone, $gives_ref ) = @_;
Zonemaster::Engine->logger->clear_history();
my @res = grep { $_->tag !~ /^TEST_CASE_(END|START)$/ } Zonemaster::Engine->test_method( $checking_module, $test, $zone );
foreach my $gives ( @{$gives_ref} ) {
ok( !( grep { $_->tag eq $gives } @res ), $zone->name->string . " does not give $gives" );
}
return scalar( @res );
}
my $datafile = q{t/Test-basic.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
my ($json, $profile_test);
$json = read_file( 't/profiles/Test-basic-all.json' );
$profile_test = Zonemaster::Engine::Profile->from_json( $json );
Zonemaster::Engine::Profile->effective->merge( $profile_test );
my %res;
my $zone;
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{basic}, q{nic.tf} );
ok( $res{B02_AUTH_RESPONSE_SOA}, q{B02_AUTH_RESPONSE_SOA} );
ok( $res{HAS_NAMESERVER_NO_WWW_A_TEST}, q{HAS_NAMESERVER_NO_WWW_A_TEST} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
Zonemaster::Engine::Profile->effective->set( q{no_network}, 0 );
Zonemaster::Engine::Profile->effective->set( q{net.ipv4}, 0 );
Zonemaster::Engine::Profile->effective->set( q{net.ipv6}, 0 );
$zone = Zonemaster::Engine->zone( q{afnic.fr} );
zone_gives( q{basic02}, $zone, [qw{NO_NETWORK}] );
zone_gives_not( q{basic02}, $zone, [qw{IPV4_ENABLED}] );
zone_gives_not( q{basic02}, $zone, [qw{IPV6_ENABLED}] );
zone_gives_not( q{basic02}, $zone, [qw{IPV4_DISABLED}] );
zone_gives_not( q{basic02}, $zone, [qw{IPV6_DISABLED}] );
zone_gives( q{basic03}, $zone, [qw{NO_NETWORK}] );
zone_gives_not( q{basic03}, $zone, [qw{IPV4_ENABLED}] );
zone_gives_not( q{basic03}, $zone, [qw{IPV6_ENABLED}] );
zone_gives_not( q{basic03}, $zone, [qw{IPV4_DISABLED}] );
zone_gives_not( q{basic03}, $zone, [qw{IPV6_DISABLED}] );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
TODO: {
local $TODO = "Need to find/create zones with that error";
#basic03
ok( $tag{A_QUERY_NO_RESPONSES}, q{A_QUERY_NO_RESPONSES} );
ok( $tag{HAS_A_RECORDS}, q{HAS_A_RECORDS} );
ok( $tag{NO_A_RECORDS}, q{NO_A_RECORDS} );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,126 @@
use strict;
use warnings;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
use TestUtil::DSL;
###########
# basic01 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/Basic-TP/basic01.md
testing_test_case 'Basic', 'basic01';
all_tags qw(B01_CHILD_IS_ALIAS
B01_CHILD_FOUND
B01_INCONSISTENT_ALIAS
B01_INCONSISTENT_DELEGATION
B01_NO_CHILD
B01_PARENT_DISREGARDED
B01_PARENT_FOUND
B01_PARENT_NOT_FOUND
B01_PARENT_UNDETERMINED
B01_ROOT_HAS_NO_PARENT
B01_SERVER_ZONE_ERROR);
# Common hint file (test-zone-data/COMMON/hintfile)
root_hints 'ns1' => [ qw(127.1.0.1 fda1:b2:c3::127:1:0:1) ],
'ns2' => [ qw(127.1.0.2 fda1:b2:c3::127:1:0:2) ];
# Test zone scenarios
zone_name_template 'child.parent.{SCENARIO}.{TESTCASE}.xa';
scenario qw(GOOD-1 GOOD-MIXED-{1..2} GOOD-PARENT-HOST-1 GOOD-GRANDPARENT-HOST-1) => sub {
expect qw(B01_CHILD_FOUND B01_PARENT_FOUND);
forbid_others;
};
scenario qw(GOOD-UNDEL-1 GOOD-MIXED-UNDEL-{1..2} NO-DEL-UNDEL-1 NO-DEL-MIXED-UNDEL-1) => sub {
fake_ns 'ns3-undelegated-child.basic01.xa';
fake_ns 'ns4-undelegated-child.basic01.xa';
expect qw(B01_CHILD_FOUND B01_PARENT_DISREGARDED);
forbid_others;
};
scenario 'NO-DEL-MIXED-UNDEL-2' => sub {
zone 'child.w.x.parent.y.z.{SCENARIO}.{TESTCASE}.xa';
fake_ns 'ns3-undelegated-child.basic01.xa';
fake_ns 'ns4-undelegated-child.basic01.xa';
expect qw(B01_CHILD_FOUND B01_PARENT_DISREGARDED);
forbid_others;
};
scenario 'NO-CHILD-{1..2}' => sub {
expect qw(B01_NO_CHILD B01_PARENT_FOUND);
forbid_others;
};
scenario 'NO-CHLD-PAR-UNDETER-1' => sub {
expect qw(B01_NO_CHILD B01_PARENT_FOUND B01_PARENT_UNDETERMINED);
forbid_others;
};
scenario 'CHLD-FOUND-PAR-UNDET-1' => sub {
expect qw(B01_CHILD_FOUND B01_PARENT_FOUND B01_PARENT_UNDETERMINED);
forbid_others;
};
scenario 'CHLD-FOUND-INCONSIST-{1..3}' => sub {
expect qw(B01_CHILD_FOUND B01_INCONSISTENT_DELEGATION B01_PARENT_FOUND);
forbid_others;
};
scenario 'CHLD-FOUND-INCONSIST-4' => sub {
expect qw(B01_CHILD_IS_ALIAS B01_CHILD_FOUND B01_INCONSISTENT_DELEGATION B01_PARENT_FOUND);
forbid_others;
};
scenario 'CHLD-FOUND-INCONSIST-{5..8}' => sub {
expect qw(B01_CHILD_FOUND B01_INCONSISTENT_DELEGATION B01_PARENT_FOUND);
forbid_others;
};
scenario 'CHLD-FOUND-INCONSIST-9' => sub {
expect qw(B01_CHILD_IS_ALIAS B01_CHILD_FOUND B01_INCONSISTENT_DELEGATION B01_PARENT_FOUND);
forbid_others;
};
scenario 'CHLD-FOUND-INCONSIST-10' => sub {
expect qw(B01_CHILD_FOUND B01_INCONSISTENT_DELEGATION B01_PARENT_FOUND);
forbid_others;
};
scenario qw(NO-DEL-UNDEL-NO-PAR-1 NO-DEL-UNDEL-PAR-UND-1) => sub {
fake_ns 'ns3-undelegated-child.basic01.xa';
fake_ns 'ns4-undelegated-child.basic01.xa';
expect qw(B01_CHILD_FOUND B01_PARENT_DISREGARDED);
forbid_others;
};
scenario 'NO-CHLD-NO-PAR-1' => sub {
expect qw(B01_NO_CHILD B01_PARENT_NOT_FOUND B01_SERVER_ZONE_ERROR);
forbid_others;
};
scenario 'CHILD-ALIAS-1' => sub {
expect qw(B01_CHILD_IS_ALIAS B01_NO_CHILD B01_PARENT_FOUND);
forbid_others;
};
scenario 'CHILD-ALIAS-2' => sub {
expect qw(B01_CHILD_IS_ALIAS B01_NO_CHILD B01_INCONSISTENT_ALIAS
B01_PARENT_FOUND);
forbid_others;
};
scenario 'ZONE-ERR-GRANDPARENT-{1..3}' => sub {
expect qw(B01_CHILD_FOUND B01_PARENT_FOUND B01_SERVER_ZONE_ERROR);
forbid_others;
};
scenario 'ROOT-ZONE' => sub {
zone '.';
expect qw(B01_CHILD_FOUND B01_ROOT_HAS_NO_PARENT);
forbid_others;
};
no_more_scenarios;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,161 @@
use strict;
use warnings;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
use TestUtil::DSL;
###########
# basic02 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/Basic-TP/basic02.md
testing_test_case 'Basic', 'basic02';
all_tags qw(B02_AUTH_RESPONSE_SOA
B02_NO_DELEGATION
B02_NO_WORKING_NS
B02_NS_BROKEN
B02_NS_NOT_AUTH
B02_NS_NO_IP_ADDR
B02_NS_NO_RESPONSE
B02_UNEXPECTED_RCODE);
# Specific hint file (test-zone-data/Basic-TP/basic02/hintfile.zone)
root_hints 'root-ns1.xa' => [ qw(127.12.2.23 fda1:b2:c3::127:12:2:23) ],
'root-ns2.xa' => [ qw(127.12.2.24 fda1:b2:c3::127:12:2:24) ];
zone_name_template '{SCENARIO}.{TESTCASE}.xa';
scenario 'GOOD-{1..2}' => sub {
expect 'B02_AUTH_RESPONSE_SOA';
forbid_others;
};
scenario 'GOOD-UNDEL-1' => sub {
fake_ns 'ns1.good-undel-1.basic02.xa' => '127.12.2.31', 'fda1:b2:c3:0:127:12:2:31';
fake_ns 'ns2.good-undel-1.basic02.xa' => '127.12.2.32', 'fda1:b2:c3:0:127:12:2:32';
expect 'B02_AUTH_RESPONSE_SOA';
forbid_others;
};
scenario 'GOOD-UNDEL-2' => sub {
fake_ns 'ns1.good-undel-2.basic02.xb';
fake_ns 'ns2.good-undel-2.basic02.xb';
expect 'B02_AUTH_RESPONSE_SOA';
forbid_others;
};
scenario 'GOOD-UNDEL-3' => sub {
fake_ns 'ns3.good-undel-3.basic02.xb';
fake_ns 'ns4.good-undel-3.basic02.xb';
expect 'B02_AUTH_RESPONSE_SOA';
forbid_others;
};
scenario 'GOOD-UNDEL-4' => sub {
fake_ns 'ns1.good-undel-4.basic02.xb';
fake_ns 'ns2.good-undel-4.basic02.xb';
expect 'B02_AUTH_RESPONSE_SOA';
forbid_others;
};
scenario 'GOOD-UNDEL-5' => sub {
fake_ns 'ns1.good-undel-5.basic02.xa' => '127.12.2.31', 'fda1:b2:c3:0:127:12:2:31';
fake_ns 'ns2.good-undel-5.basic02.xa' => '127.12.2.32', 'fda1:b2:c3:0:127:12:2:32';
expect 'B02_AUTH_RESPONSE_SOA';
forbid_others;
};
scenario 'GOOD-UNDEL-6' => sub {
fake_ns 'ns3.good-undel-6.basic02.xa' => '127.12.2.33', 'fda1:b2:c3:0:127:12:2:33';
fake_ns 'ns4.good-undel-6.basic02.xa' => '127.12.2.34', 'fda1:b2:c3:0:127:12:2:34';
expect 'B02_AUTH_RESPONSE_SOA';
forbid_others;
};
scenario 'GOOD-UNDEL-7' => sub {
fake_ns 'ns3.good-undel-7.basic02.xb' => '127.12.2.33', 'fda1:b2:c3:0:127:12:2:33';
fake_ns 'ns4.good-undel-7.basic02.xb' => '127.12.2.34';
fake_ns 'ns5.good-undel-7.basic02.xb' => 'fda1:b2:c3:0:127:12:2:34';
expect 'B02_AUTH_RESPONSE_SOA';
forbid_others;
};
scenario 'GOOD-UNDEL-8' => sub {
fake_ns 'dns1.good-undel-8.basic02.xa' => '127.12.2.33', 'fda1:b2:c3:0:127:12:2:33';
fake_ns 'dns2.good-undel-8.basic02.xa' => '127.12.2.34', 'fda1:b2:c3:0:127:12:2:34';
expect 'B02_AUTH_RESPONSE_SOA';
forbid_others;
};
scenario 'GOOD-UNDEL-9' => sub {
fake_ns 'dns1.good-undel-9.basic02.xb' => '127.12.2.33', 'fda1:b2:c3:0:127:12:2:33';
fake_ns 'dns2.good-undel-9.basic02.xb' => '127.12.2.34', 'fda1:b2:c3:0:127:12:2:34';
expect 'B02_AUTH_RESPONSE_SOA';
forbid_others;
};
scenario 'GOOD-UNDEL-10' => sub {
fake_ns 'ns3.good-undel-10.basic02.xb' => '127.12.2.33', 'fda1:b2:c3:0:127:12:2:33';
fake_ns 'ns4.good-undel-10.basic02.xb' => '127.12.2.34', 'fda1:b2:c3:0:127:12:2:34';
expect 'B02_AUTH_RESPONSE_SOA';
forbid_others;
};
scenario 'GOOD-UNDEL-11' => sub {
fake_ns 'ns3.good-undel-11.basic02.xb';
fake_ns 'ns4.good-undel-11.basic02.xb';
expect 'B02_AUTH_RESPONSE_SOA';
forbid_others;
};
scenario 'MIXED-1' => sub {
expect 'B02_AUTH_RESPONSE_SOA';
forbid_others;
};
scenario 'NO-DELEGATION-1' => sub {
zone 'no-delegation.{TESTCASE}.xa';
expect 'B02_NO_DELEGATION';
forbid_others;
};
scenario 'NS-BROKEN-1' => sub {
expect qw(B02_NS_BROKEN B02_NO_WORKING_NS);
forbid_others;
};
scenario 'NS-NOT-AUTH-1' => sub {
expect qw(B02_NS_NOT_AUTH B02_NO_WORKING_NS);
forbid_others;
};
scenario 'NS-NO-IP-{1..3}' => sub {
expect qw(B02_NS_NO_IP_ADDR B02_NO_WORKING_NS);
forbid_others;
};
scenario 'NS-NO-IP-UNDEL-1' => sub {
fake_ns 'ns1.ns-no-ip-undel-1.basic02.xa';
fake_ns 'ns2.ns-no-ip-undel-1.basic02.xa';
expect qw(B02_NS_NO_IP_ADDR B02_NO_WORKING_NS);
forbid_others;
};
scenario 'NS-NO-IP-UNDEL-2' => sub {
fake_ns 'ns1.ns-no-ip-undel-2.basic02.xb';
fake_ns 'ns2.ns-no-ip-undel-2.basic02.xb';
expect qw(B02_NS_NO_IP_ADDR B02_NO_WORKING_NS);
forbid_others;
};
scenario 'NS-NO-RESPONSE-1' => sub {
expect qw(B02_NS_NO_RESPONSE B02_NO_WORKING_NS);
forbid_others;
};
scenario 'UNEXPECTED-RCODE-1' => sub {
expect qw(B02_UNEXPECTED_RCODE B02_NO_WORKING_NS);
forbid_others;
};
no_more_scenarios;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,143 @@
use Test::More;
use Test::Differences;
use File::Slurp;
use List::MoreUtils qw[uniq none any];
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Nameserver} );
use_ok( q{Zonemaster::Engine::Test::Connectivity} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-connectivity.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
my ($json, $profile_test);
foreach my $testcase ( qw{connectivity01 connectivity02 connectivity03 connectivity04} ) {
$json = read_file( 't/profiles/Test-'.$testcase.'-only.json' );
$profile_test = Zonemaster::Engine::Profile->from_json( $json );
Zonemaster::Engine::Profile->effective->merge( $profile_test );
my %testcases;
foreach my $result ( Zonemaster::Engine->test_module( q{connectivity}, q{afnic.fr} ) ) {
if ( $result->testcase && $result->testcase ne 'Unspecified' ) {
$testcases{$result->testcase} = 1;
}
}
eq_or_diff( [ map { lc $_ } keys %testcases ], [ $testcase ], 'expected test-case ('. $testcase .')' );
}
$json = read_file( 't/profiles/Test-connectivity-all.json' );
$profile_test = Zonemaster::Engine::Profile->from_json( $json );
Zonemaster::Engine::Profile->effective->merge( $profile_test );
my @res;
my %res;
my %should_emit;
my $metadata = Zonemaster::Engine::Test::Connectivity->metadata();
my $test_levels = Zonemaster::Engine::Profile->effective->{profile}->{test_levels}->{CONNECTIVITY};
sub check_output_connectivity_testcase {
my ( $testcase, $res, $should_emit ) = @_;
return if ( $testcase !~ q/connectivity0[1-4]/ );
for my $key ( @{ $metadata->{$testcase} } ) {
next if ( $test_levels->{$key} =~ q/DEBUG/ );
if ( $should_emit->{$key} ) {
ok( $res->{$key}, "Should emit $key" );
} else {
ok( !$res->{$key}, "Should NOT emit $key" );
}
}
}
sub check_output_connectivity_all {
my ( $res, $should_emit ) = @_;
check_output_connectivity_testcase( 'connectivity01', $res, $should_emit );
check_output_connectivity_testcase( 'connectivity02', $res, $should_emit );
check_output_connectivity_testcase( 'connectivity03', $res, $should_emit );
check_output_connectivity_testcase( 'connectivity04', $res, $should_emit );
}
subtest 'All good' => sub {
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{connectivity}, q{afnic.fr} );
ok( !$res{MODULE_ERROR}, q{Test module completes normally} );
%should_emit = (
IPV4_DIFFERENT_ASN => 1,
IPV6_DIFFERENT_ASN => 1,
CN04_IPV4_DIFFERENT_PREFIX => 1,
CN04_IPV6_DIFFERENT_PREFIX => 1
);
check_output_connectivity_all( \%res, \%should_emit );
};
subtest 'No IPv6 (profile with IPv4 only)' => sub {
Zonemaster::Engine::Profile->effective->set( q{net.ipv4}, 1 );
Zonemaster::Engine::Profile->effective->set( q{net.ipv6}, 0 );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{connectivity}, q{afnic.fr} );
subtest 'UDP' => sub {
%should_emit = (
CN01_IPV6_DISABLED => 1
);
check_output_connectivity_testcase( 'connectivity01', \%res, \%should_emit );
};
subtest 'TCP (no messages)' => sub {
%should_emit = ();
check_output_connectivity_testcase( 'connectivity02', \%res, \%should_emit );
};
Zonemaster::Engine::Profile->effective->set( q{net.ipv6}, 1 );
};
subtest 'No IPv4 (profile with IPv6 only)' => sub {
Zonemaster::Engine::Profile->effective->set( q{net.ipv4}, 0 );
Zonemaster::Engine::Profile->effective->set( q{net.ipv6}, 1 );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{connectivity}, q{afnic.fr} );
subtest 'UDP' => sub {
%should_emit = (
CN01_IPV4_DISABLED => 1
);
check_output_connectivity_testcase( 'connectivity01', \%res, \%should_emit );
};
subtest 'TCP (no messages)' => sub {
%should_emit = ();
check_output_connectivity_testcase( 'connectivity02', \%res, \%should_emit );
};
Zonemaster::Engine::Profile->effective->set( q{net.ipv4}, 1 );
};
subtest 'No network' => sub {
Zonemaster::Engine::Profile->effective->set( q{net.ipv4}, 0 );
Zonemaster::Engine::Profile->effective->set( q{net.ipv6}, 0 );
%res = map{ $_->tag => 1 } Zonemaster::Engine->test_module( q{connectivity}, q{afnic.fr} );
ok( $res{NO_NETWORK}, 'IPv6 and IPv4 disabled' );
Zonemaster::Engine::Profile->effective->set( q{net.ipv4}, 1 );
Zonemaster::Engine::Profile->effective->set( q{net.ipv6}, 1 );
};
# connectivity03 -- See t/Test-connectivity03.t instead.
# connectivity04 -- See t/Test-connectivity04.t instead.
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,74 @@
use Test::More;
use File::Slurp;
use File::Basename;
use strict;
use warnings;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Nameserver} );
use_ok( q{Zonemaster::Engine::Test::Connectivity} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $checking_module = q{Connectivity};
my $testcase = 'connectivity03';
my $datafile = 't/' . basename ($0, '.t') . '.data';
sub zone_gives {
my ( $test, $zone, $gives_ref ) = @_;
Zonemaster::Engine->logger->clear_history();
my @res = grep { $_->tag !~ /^TEST_CASE_(END|START)$/ } Zonemaster::Engine->test_method( $checking_module, $test, $zone );
foreach my $gives ( @{$gives_ref} ) {
ok( ( grep { $_->tag eq $gives } @res ), $zone->name->string . " gives $gives" );
}
return scalar( @res );
}
sub zone_gives_not {
my ( $test, $zone, $gives_ref ) = @_;
Zonemaster::Engine->logger->clear_history();
my @res = grep { $_->tag !~ /^TEST_CASE_(END|START)$/ } Zonemaster::Engine->test_method( $checking_module, $test, $zone );
foreach my $gives ( @{$gives_ref} ) {
ok( !( grep { $_->tag eq $gives } @res ), $zone->name->string . " does not give $gives" );
}
return scalar( @res );
}
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
my ($json, $profile_test);
$json = qq({ "test_cases": [ "$testcase" ] });
$profile_test = Zonemaster::Engine::Profile->from_json( $json );
Zonemaster::Engine::Profile->effective->merge( $profile_test );
###
my $zone = Zonemaster::Engine->zone( q{001.tf} );
zone_gives( $testcase, $zone, [qw{IPV4_ONE_ASN IPV6_ONE_ASN}] );
zone_gives_not( $testcase, $zone, [qw{EMPTY_ASN_SET ERROR_ASN_DATABASE IPV4_DIFFERENT_ASN IPV4_SAME_ASN IPV6_DIFFERENT_ASN IPV6_SAME_ASN}] );
$zone = Zonemaster::Engine->zone( q{zonemaster.net} );
zone_gives( $testcase, $zone, [qw{IPV4_DIFFERENT_ASN IPV6_DIFFERENT_ASN}] );
zone_gives_not( $testcase, $zone, [qw{EMPTY_ASN_SET ERROR_ASN_DATABASE IPV4_SAME_ASN IPV6_SAME_ASN IPV4_ONE_ASN IPV6_ONE_ASN}] );
$zone = Zonemaster::Engine->zone( q{zut-root.rd.nic.fr} );
zone_gives( $testcase, $zone, [qw{IPV4_ONE_ASN}] );
zone_gives_not( $testcase, $zone, [qw{EMPTY_ASN_SET ERROR_ASN_DATABASE IPV4_DIFFERENT_ASN IPV4_SAME_ASN IPV6_DIFFERENT_ASN IPV6_ONE_ASN IPV6_SAME_ASN}] );
TODO: {
my @missing = qw( EMPTY_ASN_SET ERROR_ASN_DATABASE IPV4_SAME_ASN IPV6_SAME_ASN );
local $TODO = "Need to find/create zones with those errors: ";
warn $TODO, "\n\t", join("\n\t", @missing), "\n";
}
###
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,129 @@
use strict;
use warnings;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
use TestUtil::DSL;
###########
# connectivity04 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/Connectivity-TP/connectivity04.md
testing_test_case 'Connectivity', 'connectivity04';
all_tags qw(CN04_EMPTY_PREFIX_SET
CN04_ERROR_PREFIX_DATABASE
CN04_IPV4_DIFFERENT_PREFIX
CN04_IPV4_SAME_PREFIX
CN04_IPV4_SINGLE_PREFIX
CN04_IPV6_DIFFERENT_PREFIX
CN04_IPV6_SAME_PREFIX
CN04_IPV6_SINGLE_PREFIX);
# Specific hint file (https://github.com/zonemaster/zonemaster/blob/master/test-zone-data/Connectivity-TP/connectivity04/hintfile.zone)
root_hints 'root-ns1.xa' => [ qw(127.13.4.23 fda1:b2:c3::127:13:4:23) ],
'root-ns2.xa' => [ qw(127.13.4.24 fda1:b2:c3::127:13:4:24) ];
# Test zone scenarios
zone_name_template '{SCENARIO}.{TESTCASE}.xa';
scenario 'GOOD-1' => sub {
expect qw(CN04_IPV4_DIFFERENT_PREFIX CN04_IPV6_DIFFERENT_PREFIX);
forbid_others;
};
scenario 'GOOD-2' => sub {
expect qw(CN04_IPV4_DIFFERENT_PREFIX);
forbid_others;
};
scenario 'GOOD-3' => sub {
expect qw(CN04_IPV6_DIFFERENT_PREFIX);
forbid_others;
};
scenario 'EMPTY-PREFIX-SET-{1..2}' => sub {
expect qw(CN04_EMPTY_PREFIX_SET);
forbid_others;
};
scenario 'ERROR-PREFIX-DATABASE-{1..2}' => sub {
expect qw(CN04_ERROR_PREFIX_DATABASE);
forbid_others;
};
# scenario 'ERROR-PREFIX-DATABASE-3' => tested out of order; see end of file.
# scenario 'ERROR-PREFIX-DATABASE-{4..5}' => do not exist
scenario 'ERROR-PREFIX-DATABASE-6' => sub {
expect qw(CN04_IPV4_DIFFERENT_PREFIX CN04_IPV6_DIFFERENT_PREFIX CN04_ERROR_PREFIX_DATABASE);
forbid_others;
};
scenario 'ERROR-PREFIX-DATABASE-{7..8}' => sub {
expect qw(CN04_ERROR_PREFIX_DATABASE);
forbid_others;
};
scenario 'HAS-NON-ASN-TXT-1' => sub {
expect qw(CN04_IPV4_DIFFERENT_PREFIX CN04_IPV6_DIFFERENT_PREFIX);
forbid_others;
};
scenario 'HAS-NON-ASN-TXT-2' => sub {
expect qw(CN04_EMPTY_PREFIX_SET);
forbid_others;
};
scenario 'IPV4-ONE-PREFIX-1' => sub {
expect qw(CN04_IPV4_SAME_PREFIX CN04_IPV4_SINGLE_PREFIX);
forbid_others;
};
scenario 'IPV4-TWO-PREFIXES-1' => sub {
expect qw(CN04_IPV4_SAME_PREFIX CN04_IPV4_DIFFERENT_PREFIX);
forbid_others;
};
scenario 'IPV6-ONE-PREFIX-1' => sub {
expect qw(CN04_IPV6_SAME_PREFIX CN04_IPV6_SINGLE_PREFIX);
forbid_others;
};
scenario 'IPV6-TWO-PREFIXES-1' => sub {
expect qw(CN04_IPV6_SAME_PREFIX CN04_IPV6_DIFFERENT_PREFIX);
forbid_others;
};
scenario 'IPV4-SINGLE-NS-1' => sub {
expect qw(CN04_IPV4_SINGLE_PREFIX CN04_IPV4_DIFFERENT_PREFIX);
forbid_others;
};
scenario 'IPV6-SINGLE-NS-1' => sub {
expect qw(CN04_IPV6_SINGLE_PREFIX CN04_IPV6_DIFFERENT_PREFIX);
forbid_others;
};
scenario 'DOUBLE-PREFIX-1' => sub {
expect qw(CN04_IPV4_DIFFERENT_PREFIX CN04_IPV6_DIFFERENT_PREFIX);
forbid_others;
};
scenario 'DOUBLE-PREFIX-2' => sub {
expect qw(CN04_IPV4_DIFFERENT_PREFIX CN04_IPV6_DIFFERENT_PREFIX);
forbid_others;
};
# The scenario below needs to be tested out of order, and with an empty cache,
# because a previously cached non-response from the ASN lookup zone (which was
# intentional) causes negative side effects when testing this scenario.
clear_cache;
scenario 'ERROR-PREFIX-DATABASE-3' => sub {
expect qw(CN04_ERROR_PREFIX_DATABASE);
forbid_others;
};
no_more_scenarios;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,141 @@
use Test::More;
use Test::Differences;
use File::Slurp;
use List::MoreUtils qw[uniq none any];
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Consistency} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-consistency.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
my ($json, $profile_test);
foreach my $testcase ( qw{consistency01 consistency02 consistency03 consistency04} ) {
$json = read_file( 't/profiles/Test-'.$testcase.'-only.json' );
$profile_test = Zonemaster::Engine::Profile->from_json( $json );
Zonemaster::Engine::Profile->effective->merge( $profile_test );
my %testcases;
Zonemaster::Engine->logger->clear_history();
foreach my $result ( Zonemaster::Engine->test_module( q{consistency}, q{afnic.fr} ) ) {
if ( $result->testcase && $result->testcase ne 'Unspecified' ) {
$testcases{$result->testcase} = 1;
}
}
eq_or_diff( [ map { lc $_ } keys %testcases ], [ $testcase ], 'expected test-case ('. $testcase .')' );
}
$json = read_file( 't/profiles/Test-consistency-all.json' );
$profile_test = Zonemaster::Engine::Profile->from_json( $json );
Zonemaster::Engine::Profile->effective->merge( $profile_test );
my @res;
my %res;
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{consistency}, q{consistency01.zut-root.rd.nic.fr} );
ok( $res{SOA_SERIAL_VARIATION}, q{Big variation between multiple SOA serials} );
ok( $res{MULTIPLE_SOA_SERIALS}, q{Multiple SOA serials} );
ok( $res{SOA_SERIAL}, q{SOA serial details} );
ok( $res{ONE_NS_SET}, q{A unique NS set was seen} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{consistency}, q{consistency02.zut-root.rd.nic.fr} );
ok( $res{MULTIPLE_SOA_RNAMES}, q{Multiple SOA rname} );
ok( $res{SOA_RNAME}, q{SOA rname details} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{consistency}, q{consistency03.zut-root.rd.nic.fr} );
ok( $res{MULTIPLE_SOA_TIME_PARAMETER_SET}, q{Multiple SOA time parameters} );
ok( $res{SOA_TIME_PARAMETER_SET}, q{SOA time parameters details} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{consistency}, q{consistency04.zut-root.rd.nic.fr} );
ok( $res{MULTIPLE_NS_SET}, q{Saw several NS set} );
ok( $res{NS_SET}, q{NS set details} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{consistency}, q{afnic.fr} );
ok( $res{ONE_SOA_SERIAL}, q{One SOA serial} );
ok( $res{ONE_SOA_RNAME}, q{One SOA rname} );
ok( $res{ONE_SOA_TIME_PARAMETER_SET}, q{One SOA time parameters set} );
ok( $res{ADDRESSES_MATCH}, q{Addresses IP match} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
Zonemaster::Engine::Profile->effective->set( q{no_network}, 0 );
Zonemaster::Engine::Profile->effective->set( q{net.ipv4}, 0 );
Zonemaster::Engine::Profile->effective->set( q{net.ipv6}, 0 );
@res = Zonemaster::Engine->test_method( 'Consistency', 'consistency01', Zonemaster::Engine->zone( q{afnic.fr} ) );
ok( ( any { $_->tag eq 'NO_NETWORK' } @res ), 'IPv6 and IPv4 disabled' );
ok( ( none { $_->tag eq 'IPV6_DISABLED' } @res ), 'No network' );
ok( ( none { $_->tag eq 'IPV4_DISABLED' } @res ), 'No network' );
@res = Zonemaster::Engine->test_method( 'Consistency', 'consistency02', Zonemaster::Engine->zone( q{afnic.fr} ) );
ok( ( any { $_->tag eq 'NO_NETWORK' } @res ), 'IPv6 and IPv4 disabled' );
ok( ( none { $_->tag eq 'IPV6_DISABLED' } @res ), 'No network' );
ok( ( none { $_->tag eq 'IPV4_DISABLED' } @res ), 'No network' );
@res = Zonemaster::Engine->test_method( 'Consistency', 'consistency03', Zonemaster::Engine->zone( q{afnic.fr} ) );
ok( ( any { $_->tag eq 'NO_NETWORK' } @res ), 'IPv6 and IPv4 disabled' );
ok( ( none { $_->tag eq 'IPV6_DISABLED' } @res ), 'No network' );
ok( ( none { $_->tag eq 'IPV4_DISABLED' } @res ), 'No network' );
@res = Zonemaster::Engine->test_method( 'Consistency', 'consistency04', Zonemaster::Engine->zone( q{afnic.fr} ) );
ok( ( any { $_->tag eq 'NO_NETWORK' } @res ), 'IPv6 and IPv4 disabled' );
ok( ( none { $_->tag eq 'IPV6_DISABLED' } @res ), 'No network' );
ok( ( none { $_->tag eq 'IPV4_DISABLED' } @res ), 'No network' );
#Zonemaster::Engine::Profile->effective->set( q{net.ipv4}, 1 );
#Zonemaster::Engine::Profile->effective->set( q{net.ipv6}, 0 );
#@res = Zonemaster::Engine->test_method( 'Consistency', 'consistency01', Zonemaster::Engine->zone( q{afnic.fr} ) );
#ok( ( any { $_->tag eq 'IPV6_DISABLED' } @res ), 'IPv6 disabled' );
#ok( ( none { $_->tag eq 'IPV4_DISABLED' } @res ), 'IPv4 not disabled' );
#@res = Zonemaster::Engine->test_method( 'Consistency', 'consistency02', Zonemaster::Engine->zone( q{afnic.fr} ) );
#ok( ( any { $_->tag eq 'IPV6_DISABLED' } @res ), 'IPv6 disabled' );
#ok( ( none { $_->tag eq 'IPV4_DISABLED' } @res ), 'IPv4 not disabled' );
#@res = Zonemaster::Engine->test_method( 'Consistency', 'consistency03', Zonemaster::Engine->zone( q{afnic.fr} ) );
#ok( ( any { $_->tag eq 'IPV6_DISABLED' } @res ), 'IPv6 disabled' );
#ok( ( none { $_->tag eq 'IPV4_DISABLED' } @res ), 'IPv4 not disabled' );
#@res = Zonemaster::Engine->test_method( 'Consistency', 'consistency04', Zonemaster::Engine->zone( q{afnic.fr} ) );
#ok( ( any { $_->tag eq 'IPV6_DISABLED' } @res ), 'IPv6 disabled' );
#ok( ( none { $_->tag eq 'IPV4_DISABLED' } @res ), 'IPv4 not disabled' );
#
#if ( Zonemaster::Engine::Util::supports_ipv6() ) {
#
# Zonemaster::Engine::Profile->effective->set( q{net.ipv4}, 0 );
# Zonemaster::Engine::Profile->effective->set( q{net.ipv6}, 1 );
# @res = Zonemaster::Engine->test_method( 'Consistency', 'consistency01', Zonemaster::Engine->zone( q{afnic.fr} ) );
# ok( ( none { $_->tag eq 'IPV6_DISABLED' } @res ), 'IPv6 not disabled' );
# ok( ( any { $_->tag eq 'IPV4_DISABLED' } @res ), 'IPv4 disabled' );
# @res = Zonemaster::Engine->test_method( 'Consistency', 'consistency02', Zonemaster::Engine->zone( q{afnic.fr} ) );
# ok( ( none { $_->tag eq 'IPV6_DISABLED' } @res ), 'IPv6 not disabled' );
# ok( ( any { $_->tag eq 'IPV4_DISABLED' } @res ), 'IPv4 disabled' );
# @res = Zonemaster::Engine->test_method( 'Consistency', 'consistency03', Zonemaster::Engine->zone( q{afnic.fr} ) );
# ok( ( none { $_->tag eq 'IPV6_DISABLED' } @res ), 'IPv6 not disabled' );
# ok( ( any { $_->tag eq 'IPV4_DISABLED' } @res ), 'IPv4 disabled' );
# @res = Zonemaster::Engine->test_method( 'Consistency', 'consistency04', Zonemaster::Engine->zone( q{afnic.fr} ) );
# ok( ( none { $_->tag eq 'IPV6_DISABLED' } @res ), 'IPv6 not disabled' );
# ok( ( any { $_->tag eq 'IPV4_DISABLED' } @res ), 'IPv4 disabled' );
#
# Zonemaster::Engine::Profile->effective->set( q{net.ipv4}, 1 );
# Zonemaster::Engine::Profile->effective->set( q{net.ipv6}, 1 );
# @res = Zonemaster::Engine->test_method( 'Consistency', 'consistency01', Zonemaster::Engine->zone( q{afnic.fr} ) );
# ok( ( none { $_->tag eq 'IPV6_DISABLED' } @res ), 'IPv6 not disabled' );
# ok( ( none { $_->tag eq 'IPV4_DISABLED' } @res ), 'IPv4 not disabled' );
# @res = Zonemaster::Engine->test_method( 'Consistency', 'consistency02', Zonemaster::Engine->zone( q{afnic.fr} ) );
# ok( ( none { $_->tag eq 'IPV6_DISABLED' } @res ), 'IPv6 not disabled' );
# ok( ( none { $_->tag eq 'IPV4_DISABLED' } @res ), 'IPv4 not disabled' );
# @res = Zonemaster::Engine->test_method( 'Consistency', 'consistency03', Zonemaster::Engine->zone( q{afnic.fr} ) );
# ok( ( none { $_->tag eq 'IPV6_DISABLED' } @res ), 'IPv6 not disabled' );
# ok( ( none { $_->tag eq 'IPV4_DISABLED' } @res ), 'IPv4 not disabled' );
# @res = Zonemaster::Engine->test_method( 'Consistency', 'consistency04', Zonemaster::Engine->zone( q{afnic.fr} ) );
# ok( ( none { $_->tag eq 'IPV6_DISABLED' } @res ), 'IPv6 not disabled' );
# ok( ( none { $_->tag eq 'IPV4_DISABLED' } @res ), 'IPv4 not disabled' );
#
#}
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,130 @@
use strict;
use warnings;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
use TestUtil::DSL;
###########
# consistency05 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/Consistency-TP/consistency05.md
testing_test_case 'Consistency', 'consistency05';
all_tags qw(ADDRESSES_MATCH
IN_BAILIWICK_ADDR_MISMATCH
OUT_OF_BAILIWICK_ADDR_MISMATCH
EXTRA_ADDRESS_CHILD
CHILD_ZONE_LAME
CHILD_NS_FAILED
NO_RESPONSE);
# Common hint file (test-zone-data/COMMON/hintfile)
root_hints 'ns1' => [ qw(127.1.0.1 fda1:b2:c3::127:1:0:1) ],
'ns2' => [ qw(127.1.0.2 fda1:b2:c3::127:1:0:2) ];
# Test zone scenarios
zone_name_template '{SCENARIO}.{TESTCASE}.xa';
scenario 'ADDRESSES-MATCH-{1..2}' => sub {
expect 'ADDRESSES_MATCH';
forbid_others;
};
scenario 'ADDRESSES-MATCH-{3..4}' => sub {
expect qw(ADDRESSES_MATCH CHILD_NS_FAILED);
forbid_others;
};
scenario 'ADDRESSES-MATCH-5' => sub {
expect qw(ADDRESSES_MATCH NO_RESPONSE);
forbid_others;
};
scenario 'ADDRESSES-MATCH-6' => sub {
zone 'child.{SCENARIO}.{TESTCASE}.xa';
expect 'ADDRESSES_MATCH';
forbid_others;
};
scenario 'ADDRESSES-MATCH-7' => sub {
expect 'ADDRESSES_MATCH';
forbid_others;
};
scenario 'ADDR-MATCH-DEL-UNDEL-1' => sub {
fake_ns 'ns3.addr-match-del-undel-1.consistency05.xa' => '127.14.5.33', 'fda1:b2:c3:0:127:14:5:33';
fake_ns 'ns4.addr-match-del-undel-1.consistency05.xa' => '127.14.5.34', 'fda1:b2:c3:0:127:14:5:34';
expect 'ADDRESSES_MATCH';
forbid_others;
};
scenario 'ADDR-MATCH-DEL-UNDEL-2' => sub {
fake_ns 'ns3.addr-match-del-undel-2.consistency05.xb';
fake_ns 'ns4.addr-match-del-undel-2.consistency05.xb';
expect 'ADDRESSES_MATCH';
forbid_others;
};
scenario 'ADDR-MATCH-NO-DEL-UNDEL-1' => sub {
fake_ns 'ns1.addr-match-no-del-undel-1.consistency05.xa' => '127.14.5.31', 'fda1:b2:c3:0:127:14:5:31';
fake_ns 'ns2.addr-match-no-del-undel-1.consistency05.xa' => '127.14.5.32', 'fda1:b2:c3:0:127:14:5:32';
expect 'ADDRESSES_MATCH';
forbid_others;
};
scenario 'ADDR-MATCH-NO-DEL-UNDEL-2' => sub {
fake_ns 'ns3.addr-match-no-del-undel-2.consistency05.xb';
fake_ns 'ns4.addr-match-no-del-undel-2.consistency05.xb';
expect 'ADDRESSES_MATCH';
forbid_others;
};
scenario 'CHILD-ZONE-LAME-1' => sub {
todo 'see https://github.com/zonemaster/zonemaster-engine/issues/1301';
expect qw(CHILD_ZONE_LAME NO_RESPONSE);
forbid_others;
};
scenario 'CHILD-ZONE-LAME-2' => sub {
expect qw(CHILD_ZONE_LAME CHILD_NS_FAILED);
forbid_others;
};
scenario 'IB-ADDR-MISMATCH-1' => sub {
expect qw(IN_BAILIWICK_ADDR_MISMATCH EXTRA_ADDRESS_CHILD);
forbid_others;
};
scenario 'IB-ADDR-MISMATCH-2' => sub {
expect 'IN_BAILIWICK_ADDR_MISMATCH';
forbid_others;
};
scenario 'IB-ADDR-MISMATCH-3' => sub {
todo 'see https://github.com/zonemaster/zonemaster-engine/issues/1301';
expect qw(IN_BAILIWICK_ADDR_MISMATCH NO_RESPONSE);
forbid_others;
};
scenario 'IB-ADDR-MISMATCH-4' => sub {
todo 'see https://github.com/zonemaster/zonemaster-engine/issues/1349';
expect 'IN_BAILIWICK_ADDR_MISMATCH';
forbid_others;
};
scenario 'OOB-ADDR-MISMATCH' => sub {
zone 'child.{SCENARIO}.{TESTCASE}.xa';
expect 'OUT_OF_BAILIWICK_ADDR_MISMATCH';
forbid_others;
};
scenario 'EXTRA-ADDRESS-CHILD' => sub {
expect 'EXTRA_ADDRESS_CHILD';
forbid_others;
};
no_more_scenarios;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,80 @@
use strict;
use warnings;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
use TestUtil::DSL;
###########
# consistency06 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/Consistency-TP/consistency06.md
testing_test_case 'Consistency', 'consistency06';
all_tags qw(ONE_SOA_MNAME
NO_RESPONSE
NO_RESPONSE_SOA_QUERY
MULTIPLE_SOA_MNAMES);
# Common hint file (test-zone-data/COMMON/hintfile)
root_hints 'ns1' => [ qw(127.1.0.1 fda1:b2:c3::127:1:0:1) ],
'ns2' => [ qw(127.1.0.2 fda1:b2:c3::127:1:0:2) ];
zone_name_template '{SCENARIO}.{TESTCASE}.xa';
scenario 'ONE-SOA-MNAME-1' => sub {
expect 'ONE_SOA_MNAME';
forbid_others;
};
scenario 'ONE-SOA-MNAME-2' => sub {
expect qw(ONE_SOA_MNAME NO_RESPONSE);
forbid_others;
};
scenario 'ONE-SOA-MNAME-3' => sub {
expect qw(ONE_SOA_MNAME NO_RESPONSE_SOA_QUERY);
forbid_others;
};
scenario 'ONE-SOA-MNAME-4' => sub {
todo 'see https://github.com/zonemaster/zonemaster-engine/issues/1300';
expect qw(ONE_SOA_MNAME NO_RESPONSE);
forbid_others;
};
scenario 'MULTIPLE-SOA-MNAMES-1' => sub {
expect 'MULTIPLE_SOA_MNAMES';
forbid_others;
};
scenario 'MULTIPLE-SOA-MNAMES-2' => sub {
expect qw(MULTIPLE_SOA_MNAMES NO_RESPONSE);
forbid_others;
};
scenario 'MULT-SOA-MNAMES-NO-DEL-UNDEL-1' => sub {
fake_ns 'ns1.mult-soa-mnames-no-del-undel-1.consistency06.xa' => '127.14.6.31', 'fda1:b2:c3:0:127:14:6:31';
fake_ns 'ns2.mult-soa-mnames-no-del-undel-1.consistency06.xa' => '127.14.6.32', 'fda1:b2:c3:0:127:14:6:32';
expect 'MULTIPLE_SOA_MNAMES';
forbid_others;
};
scenario 'MULT-SOA-MNAMES-NO-DEL-UNDEL-2' => sub {
fake_ns 'ns3.mult-soa-mnames-no-del-undel-2.consistency06.xb';
fake_ns 'ns4.mult-soa-mnames-no-del-undel-2.consistency06.xb';
expect 'MULTIPLE_SOA_MNAMES';
forbid_others;
};
scenario 'NO-RESPONSE' => sub {
todo 'see https://github.com/zonemaster/zonemaster-engine/issues/1300';
expect 'NO_RESPONSE';
forbid_others;
};
no_more_scenarios;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,71 @@
use Test::More;
use File::Slurp;
use List::MoreUtils qw[uniq none any];
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Delegation} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-delegation.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
my ($json, $profile_test);
$json = read_file( 't/profiles/Test-delegation-all.json' );
$profile_test = Zonemaster::Engine::Profile->from_json( $json );
Zonemaster::Engine::Profile->effective->merge( $profile_test );
my @res;
my %res;
my $iis = Zonemaster::Engine->zone( q{iis.se} );
%res = map { $_->tag => $_ } Zonemaster::Engine::Test::Delegation->all( $iis );
ok( $res{NAMES_MATCH}, q{NAMES_MATCH} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{delegation}, q{crystone.se} );
ok( $res{EXTRA_NAME_PARENT}, q{EXTRA_NAME_PARENT} );
ok( $res{EXTRA_NAME_CHILD}, q{EXTRA_NAME_CHILD} );
ok( $res{TOTAL_NAME_MISMATCH}, q{TOTAL_NAME_MISMATCH} );
ok( $res{NO_NS_CNAME}, q{NO_NS_CNAME} );
ok( $res{SOA_EXISTS}, q{SOA_EXISTS} );
ok( $res{ARE_AUTHORITATIVE}, q{ARE_AUTHORITATIVE} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{delegation}, q{woli.se} );
ok( $res{SOA_NOT_EXISTS}, q{SOA_NOT_EXISTS} );
TODO: {
local $TODO = "Need to find domain name with that error";
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{delegation}, q{elsine.se} );
ok( $res{IS_NOT_AUTHORITATIVE}, q{IS_NOT_AUTHORITATIVE} );
ok( $res{NS_IS_CNAME}, q{NS_IS_CNAME} );
}
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
Zonemaster::Engine::Profile->effective->set( q{no_network}, 0 );
Zonemaster::Engine::Profile->effective->set( q{net.ipv4}, 0 );
Zonemaster::Engine::Profile->effective->set( q{net.ipv6}, 0 );
@res = Zonemaster::Engine->test_method( 'Delegation', 'delegation04', Zonemaster::Engine->zone( q{iis.se} ) );
ok( ( any { $_->tag eq 'NO_NETWORK' } @res ), 'IPv6 and IPv4 disabled' );
ok( ( none { $_->tag eq 'IPV6_DISABLED' } @res ), 'No network' );
ok( ( none { $_->tag eq 'IPV4_DISABLED' } @res ), 'No network' );
@res = Zonemaster::Engine->test_method( 'Delegation', 'delegation06', Zonemaster::Engine->zone( q{iis.se} ) );
ok( ( any { $_->tag eq 'NO_NETWORK' } @res ), 'IPv6 and IPv4 disabled' );
ok( ( none { $_->tag eq 'IPV6_DISABLED' } @res ), 'No network' );
ok( ( none { $_->tag eq 'IPV4_DISABLED' } @res ), 'No network' );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,137 @@
use strict;
use warnings;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
use TestUtil::DSL;
###########
# Delegation01 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/Delegation-TP/delegation01.md
testing_test_case 'Delegation', 'delegation01';
all_tags qw(ENOUGH_IPV4_NS_CHILD
ENOUGH_IPV4_NS_DEL
ENOUGH_IPV6_NS_CHILD
ENOUGH_IPV6_NS_DEL
ENOUGH_NS_CHILD
ENOUGH_NS_DEL
NOT_ENOUGH_IPV4_NS_CHILD
NOT_ENOUGH_IPV4_NS_DEL
NOT_ENOUGH_IPV6_NS_CHILD
NOT_ENOUGH_IPV6_NS_DEL
NOT_ENOUGH_NS_CHILD
NOT_ENOUGH_NS_DEL
NO_IPV4_NS_CHILD
NO_IPV4_NS_DEL
NO_IPV6_NS_CHILD
NO_IPV6_NS_DEL);
# Specific hint file (https://github.com/zonemaster/zonemaster/blob/master/test-zone-data/Delegation-TP/delegation01/hintfile.zone)
root_hints 'root-ns1.xa' => [ qw(127.16.1.27 fda1:b2:c3::127:16:1:27) ],
'root-ns2.xa' => [ qw(127.16.1.28 fda1:b2:c3::127:16:1:28) ];
zone_name_template '{SCENARIO}.{TESTCASE}.xa';
# Test zone scenarios
scenario 'ENOUGH-{1..3}' => sub {
expect qw(ENOUGH_IPV4_NS_CHILD
ENOUGH_IPV4_NS_DEL
ENOUGH_IPV6_NS_CHILD
ENOUGH_IPV6_NS_DEL
ENOUGH_NS_CHILD
ENOUGH_NS_DEL);
forbid_others;
};
scenario 'ENOUGH-DEL-NOT-CHILD' => sub {
todo; # FIXME: why?
expect qw(ENOUGH_IPV4_NS_DEL
ENOUGH_IPV6_NS_DEL
ENOUGH_NS_DEL
NOT_ENOUGH_IPV4_NS_CHILD
NOT_ENOUGH_IPV6_NS_CHILD
NOT_ENOUGH_NS_CHILD);
forbid_others;
};
scenario 'ENOUGH-CHILD-NOT-DEL' => sub {
expect qw(ENOUGH_IPV4_NS_CHILD
ENOUGH_IPV6_NS_CHILD
ENOUGH_NS_CHILD
NOT_ENOUGH_IPV4_NS_DEL
NOT_ENOUGH_IPV6_NS_DEL
NOT_ENOUGH_NS_DEL);
forbid_others;
};
scenario 'IPV6-AND-DEL-OK-NO-IPV4-CHILD' => sub {
todo; # FIXME: why?
expect qw(ENOUGH_IPV4_NS_DEL
ENOUGH_IPV6_NS_CHILD
ENOUGH_IPV6_NS_DEL
ENOUGH_NS_CHILD
ENOUGH_NS_DEL
NO_IPV4_NS_CHILD);
forbid_others;
};
scenario 'IPV4-AND-DEL-OK-NO-IPV6-CHILD' => sub {
todo; # FIXME: why?
expect qw(ENOUGH_IPV4_NS_DEL
ENOUGH_IPV4_NS_CHILD
ENOUGH_IPV6_NS_DEL
ENOUGH_NS_CHILD
ENOUGH_NS_DEL
NO_IPV6_NS_CHILD);
forbid_others;
};
scenario 'NO-IPV4-{1..3}' => sub {
expect qw(ENOUGH_IPV6_NS_CHILD
ENOUGH_IPV6_NS_DEL
ENOUGH_NS_CHILD
ENOUGH_NS_DEL
NO_IPV4_NS_CHILD
NO_IPV4_NS_DEL);
forbid_others;
};
scenario 'NO-IPV6-{1..3}' => sub {
expect qw(ENOUGH_IPV4_NS_CHILD
ENOUGH_IPV4_NS_DEL
ENOUGH_NS_CHILD
ENOUGH_NS_DEL
NO_IPV6_NS_CHILD
NO_IPV6_NS_DEL);
forbid_others;
};
scenario 'MISMATCH-DELEGATION-CHILD-1' => sub {
todo; # FIXME: why?
expect qw(ENOUGH_IPV4_NS_CHILD
NOT_ENOUGH_IPV4_NS_DEL
ENOUGH_IPV6_NS_CHILD
NOT_ENOUGH_IPV6_NS_DEL
ENOUGH_NS_CHILD
ENOUGH_NS_DEL);
forbid_others;
};
scenario 'MISMATCH-DELEGATION-CHILD-2' => sub {
todo; # FIXME: why?
expect qw(NOT_ENOUGH_IPV4_NS_CHILD
ENOUGH_IPV4_NS_DEL
NOT_ENOUGH_IPV6_NS_CHILD
ENOUGH_IPV6_NS_DEL
ENOUGH_NS_CHILD
ENOUGH_NS_DEL);
forbid_others;
};
no_more_scenarios;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,170 @@
use strict;
use warnings;
use Test::More;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Delegation} );
use_ok( q{TestUtil}, qw( perform_testcase_testing ) );
}
###########
# Delegation02 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/Delegation-TP/delegation02.md
my $test_module = 'Delegation';
my $test_case = 'delegation02';
my @all_tags = qw(
DEL_DISTINCT_NS_IP
CHILD_DISTINCT_NS_IP
DEL_NS_SAME_IP
CHILD_NS_SAME_IP
);
# Specific hint file (https://github.com/zonemaster/zonemaster/blob/master/test-zone-data/Delegation-TP/delegation02/hintfile.zone)
Zonemaster::Engine::Recursor->remove_fake_addresses( '.' );
Zonemaster::Engine::Recursor->add_fake_addresses( '.',
{ 'root-ns1.xa' => [ '127.16.2.27', 'fda1:b2:c3::127:16:2:27' ],
'root-ns2.xa' => [ '127.16.2.28', 'fda1:b2:c3::127:16:2:28' ],
}
);
# Test zone scenarios
# - Documentation: L<TestUtil/perform_testcase_testing()>
# - Format: { SCENARIO_NAME => [
# testable,
# zone_name,
# [ MANDATORY_MESSAGE_TAGS ],
# [ FORBIDDEN_MESSAGE_TAGS ],
# [ UNDELEGATED_NS ],
# [ UNDELEGATED_DS ],
# ] }
#
# - One of MANDATORY_MESSAGE_TAGS and FORBIDDEN_MESSAGE_TAGS may be undefined.
# See documentation for the meaning of that.
my %subtests = (
'ALL-DISTINCT-1' =>
[
1,
q(all-distinct-1.delegation02.xa),
[ qw( DEL_DISTINCT_NS_IP CHILD_DISTINCT_NS_IP ) ],
undef,
[],
[],
],
'ALL-DISTINCT-2' =>
[
1,
q(all-distinct-2.delegation02.xa),
[ qw( DEL_DISTINCT_NS_IP CHILD_DISTINCT_NS_IP ) ],
undef,
[],
[],
],
'ALL-DISTINCT-3' =>
[
1,
q(all-distinct-3.delegation02.xa),
[ qw( DEL_DISTINCT_NS_IP CHILD_DISTINCT_NS_IP ) ],
undef,
[],
[],
],
'DEL-NON-DISTINCT' =>
[
0,
q(del-non-distinct.delegation02.xa),
[ qw( DEL_NS_SAME_IP CHILD_DISTINCT_NS_IP ) ],
undef,
[],
[],
],
'DEL-NON-DISTINCT-UND' =>
[
1,
q(del-non-distinct.delegation02.xa),
[ qw( DEL_NS_SAME_IP CHILD_DISTINCT_NS_IP ) ],
undef,
[ qw(
ns1a.del-non-distinct-und.delegation02.xa/127.16.2.31
ns1a.del-non-distinct-und.delegation02.xa/fda1:b2:c3:0:127:16:2:31
ns1b.del-non-distinct-und.delegation02.xa/127.16.2.31
ns1b.del-non-distinct-und.delegation02.xa/fda1:b2:c3:0:127:16:2:31
)
],
[],
],
'CHILD-NON-DISTINCT' =>
[
0,
q(child-non-distinct.delegation02.xa),
[ qw( DEL_DISTINCT_NS_IP CHILD_NS_SAME_IP ) ],
undef,
[],
[],
],
'CHILD-NON-DISTINCT-UND' =>
[
1,
q(child-non-distinct.delegation02.xa),
[ qw( DEL_DISTINCT_NS_IP CHILD_NS_SAME_IP ) ],
undef,
[ qw(
ns1a.child-non-distinct-und.delegation02.xa/127.16.2.31
ns1a.child-non-distinct-und.delegation02.xa/fda1:b2:c3:0:127:16:2:31
ns1b.child-non-distinct-und.delegation02.xa/127.16.2.32
ns1b.child-non-distinct-und.delegation02.xa/fda1:b2:c3:0:127:16:2:32
)
],
[],
],
'NON-DISTINCT-1' =>
[
1,
q(non-distinct-1.delegation02.xa),
[ qw( DEL_NS_SAME_IP CHILD_NS_SAME_IP ) ],
undef,
[],
[],
],
'NON-DISTINCT-2' =>
[
1,
q(non-distinct-2.delegation02.xa),
[ qw( DEL_NS_SAME_IP CHILD_NS_SAME_IP ) ],
undef,
[],
[],
],
'NON-DISTINCT-3' =>
[
1,
q(non-distinct-3.delegation02.xa),
[ qw( DEL_NS_SAME_IP CHILD_NS_SAME_IP ) ],
undef,
[],
[],
],
);
###########
my $datafile = 't/' . basename ($0, '.t') . '.data';
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
Zonemaster::Engine::Profile->effective->merge( Zonemaster::Engine::Profile->from_json( qq({ "test_cases": [ "$test_case" ] }) ) );
perform_testcase_testing( $test_case, $test_module, \@all_tags, \%subtests, $ENV{ZONEMASTER_SELECTED_SCENARIOS}, $ENV{ZONEMASTER_DISABLED_SCENARIOS} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,103 @@
use strict;
use warnings;
use Test::More;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Delegation} );
use_ok( q{TestUtil}, qw( perform_testcase_testing ) );
}
###########
# Delegation03 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/Delegation-TP/delegation03.md
my $test_module = 'Delegation';
my $test_case = 'delegation03';
my @all_tags = qw(
REFERRAL_SIZE_OK
REFERRAL_SIZE_TOO_LARGE
);
# Specific hint file (https://github.com/zonemaster/zonemaster/blob/master/test-zone-data/Delegation-TP/delegation03/hintfile.zone)
Zonemaster::Engine::Recursor->remove_fake_addresses( '.' );
Zonemaster::Engine::Recursor->add_fake_addresses( '.',
{ 'root-ns1.xa' => [ '127.16.3.27', 'fda1:b2:c3::127:16:3:27' ],
'root-ns2.xa' => [ '127.16.3.28', 'fda1:b2:c3::127:16:3:28' ],
}
);
# Test zone scenarios
# - Documentation: L<TestUtil/perform_testcase_testing()>
# - Format: { SCENARIO_NAME => [
# testable,
# zone_name,
# [ MANDATORY_MESSAGE_TAGS ],
# [ FORBIDDEN_MESSAGE_TAGS ],
# [ UNDELEGATED_NS ],
# [ UNDELEGATED_DS ],
# ] }
#
# - One of MANDATORY_MESSAGE_TAGS and FORBIDDEN_MESSAGE_TAGS may be undefined.
# See documentation for the meaning of that.
my %subtests = (
'REFERRAL-SIZE-OK-1' =>
[
1,
q(referral-size-ok-1.delegation03.xa.),
[ qw( REFERRAL_SIZE_OK ) ],
undef,
[],
[],
],
'REFERRAL-SIZE-OK-2' =>
[
1,
q(referral-size-ok-2.delegation03.xa.),
[ qw( REFERRAL_SIZE_OK ) ],
undef,
[],
[],
],
'REFERRAL-SIZE-TOO-LARGE-1' =>
[
1,
q(referral-size-too-large-1.delegation03.xa),
[ qw( REFERRAL_SIZE_TOO_LARGE ) ],
undef,
[],
[],
],
'REFERRAL-SIZE-TOO-LARGE-2' =>
[
1,
q(referral-size-too-large-2.delegation03.xa),
[ qw( REFERRAL_SIZE_TOO_LARGE ) ],
undef,
[],
[],
],
);
###########
my $datafile = 't/' . basename ($0, '.t') . '.data';
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
Zonemaster::Engine::Profile->effective->merge( Zonemaster::Engine::Profile->from_json( qq({ "test_cases": [ "$test_case" ] }) ) );
perform_testcase_testing( $test_case, $test_module, \@all_tags, \%subtests, $ENV{ZONEMASTER_SELECTED_SCENARIOS}, $ENV{ZONEMASTER_DISABLED_SCENARIOS} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,80 @@
use Test::More;
use File::Slurp;
BEGIN {
use_ok( 'Zonemaster::Engine' );
use_ok( 'Zonemaster::Engine::Test::DNSSEC' );
}
my $checking_module = q{DNSSEC};
sub zone_gives {
my ( $test, $zone, $gives_ref ) = @_;
Zonemaster::Engine->logger->clear_history();
my @res = Zonemaster::Engine->test_method( $checking_module, $test, $zone );
foreach my $gives ( @{$gives_ref} ) {
ok( ( grep { $_->tag eq $gives } @res ), $zone->name->string . " gives $gives" );
}
return scalar( @res );
}
sub zone_gives_not {
my ( $test, $zone, $gives_ref ) = @_;
Zonemaster::Engine->logger->clear_history();
my @res = Zonemaster::Engine->test_method( $checking_module, $test, $zone );
foreach my $gives ( @{$gives_ref} ) {
ok( !( grep { $_->tag eq $gives } @res ), $zone->name->string . " does not give $gives" );
}
return scalar( @res );
}
my $datafile = 't/Test-dnssec-more.data';
if ( not $ENV{ZONEMASTER_RECORD} ) {
die "Stored data file missing" if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
my ($json, $profile_test);
$json = read_file( 't/profiles/Test-dnssec-more-all.json' );
$profile_test = Zonemaster::Engine::Profile->from_json( $json );
Zonemaster::Engine::Profile->effective->merge( $profile_test );
my $zone;
my @res;
my %tag;
SKIP: {
skip "dnssec01 tests are now in a separate file.", 1;
@res = Zonemaster::Engine->test_module( 'DNSSEC', 'loopia.se' );
%tag = map { $_->tag => 1 } @res;
ok( $tag{NO_RESPONSE_DS}, 'NO_RESPONSE_DS' );
}
$zone = Zonemaster::Engine->zone( 'rsa4096.nxdomain.se' );
zone_gives_not( 'dnssec03', $zone, ['TOO_MANY_ITERATIONS'] );
# dnssec10
SKIP: {
skip "Need to configure another zone for this test cases.", 3;
$zone = Zonemaster::Engine->zone( 'wwwyahoo.se' );
zone_gives( 'dnssec10', $zone, ['INVALID_NAME_RCODE']);
$zone = Zonemaster::Engine->zone( 'denki.se' );
zone_gives( 'dnssec10', $zone, ['NSEC3_COVERS_NOT']);
$zone = Zonemaster::Engine->zone( 'retailacademicsconsulting.se' );
zone_gives( 'dnssec10', $zone, ['NSEC3_SIG_VERIFY_ERROR']);
}
$zone = Zonemaster::Engine->zone( 'y.nu' );
zone_gives_not( 'dnssec03', $zone, ['TOO_MANY_ITERATIONS'] );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,386 @@
use Test::More;
use Test::Differences;
use File::Slurp;
use List::MoreUtils qw[uniq none any];
use Zonemaster::Engine;
use Zonemaster::Engine::Nameserver;
use Zonemaster::Engine::Profile;
use strict;
BEGIN {
use_ok( 'Zonemaster::Engine' );
use_ok( 'Zonemaster::Engine::Test::DNSSEC' );
}
my $checking_module = q{DNSSEC};
use Data::Dumper;
sub zone_gives {
my ( $test, $zone, $gives_ref ) = @_;
Zonemaster::Engine->logger->clear_history();
my @res = grep { $_->tag !~ /^TEST_CASE_(END|START)$/ } Zonemaster::Engine->test_method( $checking_module, $test, $zone );
foreach my $gives ( @{$gives_ref} ) {
ok( ( grep { $_->tag eq $gives } @res ), $zone->name->string . " gives $gives" );
}
return scalar( @res );
}
sub zone_gives_not {
my ( $test, $zone, $gives_ref ) = @_;
Zonemaster::Engine->logger->clear_history();
my @res = grep { $_->tag !~ /^TEST_CASE_(END|START)$/ } Zonemaster::Engine->test_method( $checking_module, $test, $zone );
foreach my $gives ( @{$gives_ref} ) {
ok( !( grep { $_->tag eq $gives } @res ), $zone->name->string . " does not give $gives" );
}
return scalar( @res );
}
my $datafile = 't/Test-dnssec.data';
if ( not $ENV{ZONEMASTER_RECORD} ) {
die "Stored data file missing" if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine->profile->set( q{no_network}, 1 );
}
# Find a way for dnssec06 which has a dependence...
my ($json, $profile_test);
foreach my $testcase ( qw{dnssec01 dnssec02 dnssec04 dnssec05 dnssec07 dnssec08 dnssec09 dnssec10 dnssec11 dnssec13 dnssec14 dnssec15 dnssec17 dnssec18} ) {
$json = read_file( 't/profiles/Test-'.$testcase.'-only.json' );
$profile_test = Zonemaster::Engine::Profile->from_json( $json );
Zonemaster::Engine::Profile->effective->merge( $profile_test );
my %testcases;
Zonemaster::Engine->logger->clear_history();
foreach my $result ( Zonemaster::Engine->test_module( q{dnssec}, q{se} ) ) {
if ( $result->testcase && $result->testcase ne 'Unspecified' ) {
$testcases{$result->testcase} = 1;
}
}
eq_or_diff( [ map { lc $_ } keys %testcases ], [ $testcase ], 'expected test-case ('. $testcase .')' );
}
$json = read_file( 't/profiles/Test-dnssec-all.json' );
$profile_test = Zonemaster::Engine::Profile->from_json( $json );
Zonemaster::Engine::Profile->effective->merge( $profile_test );
my $zone = Zonemaster::Engine->zone( 'nic.se' );
my @res = Zonemaster::Engine->test_method( 'DNSSEC', 'dnssec04', $zone );
my %tag = map { $_->tag => 1 } @res;
ok( ( $tag{DURATION_OK} || $tag{REMAINING_SHORT} || $tag{RRSIG_EXPIRED} ), 'DURATION_OK (sort of)' );
my $zone4 = Zonemaster::Engine->zone( 'nic.fr' );
zone_gives( 'dnssec06', $zone, [q{EXTRA_PROCESSING_OK}] );
###########
# dnssec01 -- See t/Test-dnssec01.t instead.
###########
###########
# dnssec02
###########
$zone = Zonemaster::Engine->zone( 'dnssec02-dnskey-ksk-not-sep.zut-root.rd.nic.fr' );
zone_gives( 'dnssec02', $zone, [qw{DS02_DNSKEY_NOT_SEP}] );
zone_gives_not( 'dnssec02', $zone, [qw{DS02_ALGO_NOT_SUPPORTED_BY_ZM DS02_DNSKEY_NOT_FOR_ZONE_SIGNING DS02_NO_DNSKEY_FOR_DS DS02_NO_MATCHING_DNSKEY_RRSIG DS02_NO_MATCH_DS_DNSKEY DS02_RRSIG_NOT_VALID_BY_DNSKEY DS02_NO_VALID_DNSKEY_FOR_ANY_DS DS02_DNSKEY_NOT_SIGNED_BY_ANY_DS}] );
$zone = Zonemaster::Engine->zone( 'dnssec02-no-common-keytags.zut-root.rd.nic.fr' );
zone_gives( 'dnssec02', $zone, [qw{DS02_NO_DNSKEY_FOR_DS DS02_NO_VALID_DNSKEY_FOR_ANY_DS}] );
zone_gives_not( 'dnssec02', $zone, [qw{DS02_ALGO_NOT_SUPPORTED_BY_ZM DS02_DNSKEY_NOT_FOR_ZONE_SIGNING DS02_DNSKEY_NOT_SEP DS02_NO_MATCHING_DNSKEY_RRSIG DS02_NO_MATCH_DS_DNSKEY DS02_RRSIG_NOT_VALID_BY_DNSKEY DS02_DNSKEY_NOT_SIGNED_BY_ANY_DS}] );
$zone = Zonemaster::Engine->zone( 'dnssec08-dnskey-not-signed.zut-root.rd.nic.fr' );
zone_gives( 'dnssec02', $zone, [qw{DS02_NO_MATCHING_DNSKEY_RRSIG DS02_DNSKEY_NOT_SIGNED_BY_ANY_DS}] );
zone_gives_not( 'dnssec02', $zone, [qw{DS02_ALGO_NOT_SUPPORTED_BY_ZM DS02_DNSKEY_NOT_FOR_ZONE_SIGNING DS02_DNSKEY_NOT_SEP DS02_NO_DNSKEY_FOR_DS DS02_NO_MATCH_DS_DNSKEY DS02_RRSIG_NOT_VALID_BY_DNSKEY DS02_NO_VALID_DNSKEY_FOR_ANY_DS}] );
$zone = Zonemaster::Engine->zone( 'dnssec02-ds-does-not-match-dnskey.zut-root.rd.nic.fr' );
zone_gives( 'dnssec02', $zone, [qw{DS02_NO_MATCH_DS_DNSKEY}] );
zone_gives_not( 'dnssec02', $zone, [qw{DS02_ALGO_NOT_SUPPORTED_BY_ZM DS02_DNSKEY_NOT_FOR_ZONE_SIGNING DS02_DNSKEY_NOT_SEP DS02_NO_DNSKEY_FOR_DS DS02_NO_MATCHING_DNSKEY_RRSIG DS02_RRSIG_NOT_VALID_BY_DNSKEY DS02_NO_VALID_DNSKEY_FOR_ANY_DS DS02_DNSKEY_NOT_SIGNED_BY_ANY_DS}] );
$zone = Zonemaster::Engine->zone( 'dnssec08-dnskey-signature-not-ok-broken.zut-root.rd.nic.fr' );
zone_gives( 'dnssec02', $zone, [qw{DS02_RRSIG_NOT_VALID_BY_DNSKEY DS02_NO_MATCHING_DNSKEY_RRSIG DS02_DNSKEY_NOT_SIGNED_BY_ANY_DS}] );
zone_gives_not( 'dnssec02', $zone, [qw{DS02_ALGO_NOT_SUPPORTED_BY_ZM DS02_DNSKEY_NOT_FOR_ZONE_SIGNING DS02_DNSKEY_NOT_SEP DS02_NO_DNSKEY_FOR_DS DS02_NO_MATCH_DS_DNSKEY DS02_NO_VALID_DNSKEY_FOR_ANY_DS}] );
###########
# dnssec04
###########
$zone = Zonemaster::Engine->zone( 'dnssec04-duration-long.zut-root.rd.nic.fr' );
zone_gives( 'dnssec04', $zone, [q{DURATION_LONG}] );
$zone = Zonemaster::Engine->zone( 'dnssec04-remaining-long.zut-root.rd.nic.fr' );
zone_gives( 'dnssec04', $zone, [q{REMAINING_LONG}] );
###########
# dnssec05 -- See t/Test-dnssec05.t instead.
###########
###########
# dnssec06
###########
$zone = Zonemaster::Engine->zone( 'dnssec06-extra-processing-broken-1.zut-root.rd.nic.fr' );
zone_gives( 'dnssec06', $zone, [q{EXTRA_PROCESSING_BROKEN}] );
zone_gives_not( 'dnssec06', $zone, [q{EXTRA_PROCESSING_OK}] );
$zone = Zonemaster::Engine->zone( 'dnssec06-extra-processing-broken-2.zut-root.rd.nic.fr' );
zone_gives( 'dnssec06', $zone, [q{EXTRA_PROCESSING_BROKEN}] );
zone_gives_not( 'dnssec06', $zone, [q{EXTRA_PROCESSING_OK}] );
###########
# dnssec07 -- See t/Test-dnssec07.t instead.
###########
###########
# dnssec08
###########
$zone = Zonemaster::Engine->zone( 'dnssec08-dnskey-signature-not-ok-broken.zut-root.rd.nic.fr' );
zone_gives( 'dnssec08', $zone, [qw{DS08_DNSKEY_RRSIG_EXPIRED DS08_RRSIG_NOT_VALID_BY_DNSKEY}] );
zone_gives_not( 'dnssec08', $zone, [qw{DS08_ALGO_NOT_SUPPORTED_BY_ZM DS08_DNSKEY_RRSIG_NOT_YET_VALID DS08_MISSING_RRSIG_IN_RESPONSE DS08_NO_MATCHING_DNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec08-dnskey-signature-not-ok.zut-root.rd.nic.fr' );
zone_gives_not( 'dnssec08', $zone, [qw{DS08_DNSKEY_RRSIG_EXPIRED DS08_ALGO_NOT_SUPPORTED_BY_ZM DS08_DNSKEY_RRSIG_NOT_YET_VALID DS08_MISSING_RRSIG_IN_RESPONSE DS08_NO_MATCHING_DNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec08-dnskey-not-signed.zut-root.rd.nic.fr' );
zone_gives( 'dnssec08', $zone, [q{DS08_MISSING_RRSIG_IN_RESPONSE}] );
zone_gives_not( 'dnssec08', $zone, [qw{DS08_ALGO_NOT_SUPPORTED_BY_ZM DS08_DNSKEY_RRSIG_EXPIRED DS08_DNSKEY_RRSIG_NOT_YET_VALID DS08_NO_MATCHING_DNSKEY DS08_RRSIG_NOT_VALID_BY_DNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec08-dnskey-rrsig-not-yet-valid.zft-root.rd.nic.fr' );
zone_gives( 'dnssec08', $zone, [q{DS08_DNSKEY_RRSIG_NOT_YET_VALID}] );
zone_gives_not( 'dnssec08', $zone, [qw{DS08_ALGO_NOT_SUPPORTED_BY_ZM DS08_DNSKEY_RRSIG_EXPIRED DS08_MISSING_RRSIG_IN_RESPONSE DS08_NO_MATCHING_DNSKEY DS08_RRSIG_NOT_VALID_BY_DNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec08-rrsig-no-matching-dnskey.zft-root.rd.nic.fr' );
zone_gives( 'dnssec08', $zone, [qw{DS08_NO_MATCHING_DNSKEY DS08_RRSIG_NOT_VALID_BY_DNSKEY}] );
zone_gives_not( 'dnssec08', $zone, [qw{DS08_ALGO_NOT_SUPPORTED_BY_ZM DS08_DNSKEY_RRSIG_EXPIRED DS08_DNSKEY_RRSIG_NOT_YET_VALID DS08_MISSING_RRSIG_IN_RESPONSE}] );
###########
# dnssec09
###########
$zone = Zonemaster::Engine->zone( 'dnssec09-soa-rrsig-not-yet-valid.zft-root.rd.nic.fr' );
zone_gives( 'dnssec09', $zone, [qw{DS09_SOA_RRSIG_NOT_YET_VALID}] );
zone_gives_not( 'dnssec09', $zone, [qw{DS09_ALGO_NOT_SUPPORTED_BY_ZM DS09_MISSING_RRSIG_IN_RESPONSE DS09_NO_MATCHING_DNSKEY DS09_RRSIG_NOT_VALID_BY_DNSKEY DS09_SOA_RRSIG_EXPIRED}] );
$zone = Zonemaster::Engine->zone( 'dnssec09-rrsig-no-matching-dnskey.zft-root.rd.nic.fr' );
zone_gives( 'dnssec09', $zone, [qw{DS09_NO_MATCHING_DNSKEY}] );
zone_gives_not( 'dnssec09', $zone, [qw{DS09_ALGO_NOT_SUPPORTED_BY_ZM DS09_MISSING_RRSIG_IN_RESPONSE DS09_RRSIG_NOT_VALID_BY_DNSKEY DS09_SOA_RRSIG_EXPIRED DS09_SOA_RRSIG_NOT_YET_VALID}] );
$zone = Zonemaster::Engine->zone( 'dnssec09-soa-not-signed.zft-root.rd.nic.fr' );
zone_gives( 'dnssec09', $zone, [qw{DS09_MISSING_RRSIG_IN_RESPONSE}] );
zone_gives_not( 'dnssec09', $zone, [qw{DS09_ALGO_NOT_SUPPORTED_BY_ZM DS09_NO_MATCHING_DNSKEY DS09_RRSIG_NOT_VALID_BY_DNSKEY DS09_SOA_RRSIG_EXPIRED DS09_SOA_RRSIG_NOT_YET_VALID}] );
$zone = Zonemaster::Engine->zone( 'dnssec09-soa-rrsig-expired.zft-root.rd.nic.fr' );
zone_gives( 'dnssec09', $zone, [qw{DS09_SOA_RRSIG_EXPIRED}] );
zone_gives_not( 'dnssec09', $zone, [qw{DS09_ALGO_NOT_SUPPORTED_BY_ZM DS09_MISSING_RRSIG_IN_RESPONSE DS09_NO_MATCHING_DNSKEY DS09_RRSIG_NOT_VALID_BY_DNSKEY DS09_SOA_RRSIG_NOT_YET_VALID}] );
$zone = Zonemaster::Engine->zone( 'dnssec09-rrsig-not-valid-by-dnskey.zft-root.rd.nic.fr' );
zone_gives( 'dnssec09', $zone, [qw{DS09_RRSIG_NOT_VALID_BY_DNSKEY}] );
zone_gives_not( 'dnssec09', $zone, [qw{DS09_ALGO_NOT_SUPPORTED_BY_ZM DS09_MISSING_RRSIG_IN_RESPONSE DS09_NO_MATCHING_DNSKEY DS09_SOA_RRSIG_EXPIRED DS09_SOA_RRSIG_NOT_YET_VALID}] );
###########
# dnssec10 -- See t/Test-dnssec10.t instead.
###########
# GOST
#$zone = Zonemaster::Engine->zone( 'caint.su' );
#@res = Zonemaster::Engine->test_method( 'DNSSEC', 'dnssec08', $zone );
#ok( ( grep { $_->string =~ /error=no GOST support/s } @res ), $zone->name->string . " no GOST support" );
#@res = Zonemaster::Engine->test_method( 'DNSSEC', 'dnssec09', $zone );
#ok( ( grep { $_->string =~ /error=no GOST support/s } @res ), $zone->name->string . " no GOST support" );
#@res = Zonemaster::Engine->test_method( 'DNSSEC', 'dnssec10', $zone );
#ok( ( grep { $_->string =~ /error=no GOST support/s } @res ), $zone->name->string . " no GOST support" );
###########
# dnssec11
###########
$zone = Zonemaster::Engine->zone( 'zone-does-not-exist.zut-root.rd.nic.fr' );
zone_gives( 'dnssec11', $zone, [qw{DS11_UNDETERMINED_DS}] );
zone_gives_not( 'dnssec11', $zone, [qw{DS11_INCONSISTENT_DS DS11_INCONSISTENT_SIGNED_ZONE DS11_UNDETERMINED_SIGNED_ZONE DS11_PARENT_WITHOUT_DS DS11_PARENT_WITH_DS DS11_NS_WITH_SIGNED_ZONE DS11_NS_WITH_UNSIGNED_ZONE DS11_DS_BUT_UNSIGNED_ZONE}] );
$zone = Zonemaster::Engine->zone( 'dnssec11-inconsistent-ds.dnssec11-parent.zft-root.rd.nic.fr' );
zone_gives( 'dnssec11', $zone, [qw{DS11_INCONSISTENT_DS DS11_PARENT_WITHOUT_DS DS11_PARENT_WITH_DS}] );
zone_gives_not( 'dnssec11', $zone, [qw{DS11_INCONSISTENT_SIGNED_ZONE DS11_UNDETERMINED_DS DS11_UNDETERMINED_SIGNED_ZONE DS11_NS_WITH_SIGNED_ZONE DS11_NS_WITH_UNSIGNED_ZONE DS11_DS_BUT_UNSIGNED_ZONE}] );
$zone = Zonemaster::Engine->zone( 'dnssec11-ds-but-unsigned.zft-root.rd.nic.fr' );
zone_gives( 'dnssec11', $zone, [qw{DS11_DS_BUT_UNSIGNED_ZONE}] );
zone_gives_not( 'dnssec11', $zone, [qw{DS11_INCONSISTENT_DS DS11_INCONSISTENT_SIGNED_ZONE DS11_UNDETERMINED_DS DS11_UNDETERMINED_SIGNED_ZONE DS11_PARENT_WITHOUT_DS DS11_PARENT_WITH_DS DS11_NS_WITH_SIGNED_ZONE DS11_NS_WITH_UNSIGNED_ZONE}] );
$zone = Zonemaster::Engine->zone( 'dnssec11-inconsistent-dnskey.zft-root.rd.nic.fr' );
zone_gives( 'dnssec11', $zone, [qw{DS11_INCONSISTENT_SIGNED_ZONE DS11_NS_WITH_UNSIGNED_ZONE DS11_NS_WITH_SIGNED_ZONE}] );
zone_gives_not( 'dnssec11', $zone, [qw{DS11_INCONSISTENT_DS DS11_UNDETERMINED_DS DS11_UNDETERMINED_SIGNED_ZONE DS11_PARENT_WITHOUT_DS DS11_PARENT_WITH_DS DS11_DS_BUT_UNSIGNED_ZONE}] );
###########
# dnssec13
###########
$zone = Zonemaster::Engine->zone( 'dnssec13-algo-not-signed-dnskey.zft-root.rd.nic.fr' );
zone_gives_not('dnssec13', $zone, [qw{DS13_ALGO_NOT_SIGNED_NS DS13_ALGO_NOT_SIGNED_SOA}] );
$zone = Zonemaster::Engine->zone( 'dnssec13-algo-not-signed-ns.zft-root.rd.nic.fr' );
zone_gives( 'dnssec13', $zone, [qw{DS13_ALGO_NOT_SIGNED_NS}] );
zone_gives_not('dnssec13', $zone, [qw{DS13_ALGO_NOT_SIGNED_DNSKEY DS13_ALGO_NOT_SIGNED_SOA}] );
$zone = Zonemaster::Engine->zone( 'dnssec13-algo-not-signed-soa.zft-root.rd.nic.fr' );
zone_gives( 'dnssec13', $zone, [qw{DS13_ALGO_NOT_SIGNED_SOA}] );
zone_gives_not('dnssec13', $zone, [qw{DS13_ALGO_NOT_SIGNED_DNSKEY DS13_ALGO_NOT_SIGNED_NS}] );
$zone = Zonemaster::Engine->zone( 'afnic.fr' );
zone_gives_not('dnssec13', $zone, [qw{DS13_ALGO_NOT_SIGNED_DNSKEY DS13_ALGO_NOT_SIGNED_NS DS13_ALGO_NOT_SIGNED_SOA}] );
###########
# dnssec15
###########
$zone = Zonemaster::Engine->zone( 'dnssec15-no-cds-no-cdnskey.zft-root.rd.nic.fr' );
zone_gives( 'dnssec15', $zone, [q{DS15_NO_CDS_CDNSKEY}] );
zone_gives_not('dnssec15', $zone, [qw{DS15_HAS_CDNSKEY_NO_CDS DS15_HAS_CDS_AND_CDNSKEY DS15_HAS_CDS_NO_CDNSKEY DS15_INCONSISTENT_CDNSKEY DS15_INCONSISTENT_CDS DS15_MISMATCH_CDS_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec15-cds-no-cdnskey.zft-root.rd.nic.fr' );
zone_gives( 'dnssec15', $zone, [q{DS15_HAS_CDS_NO_CDNSKEY}] );
zone_gives_not('dnssec15', $zone, [qw{DS15_HAS_CDNSKEY_NO_CDS DS15_HAS_CDS_AND_CDNSKEY DS15_INCONSISTENT_CDNSKEY DS15_INCONSISTENT_CDS DS15_MISMATCH_CDS_CDNSKEY DS15_NO_CDS_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec15-cdnskey-no-cds.zft-root.rd.nic.fr' );
zone_gives( 'dnssec15', $zone, [q{DS15_HAS_CDNSKEY_NO_CDS}] );
zone_gives_not('dnssec15', $zone, [qw{DS15_HAS_CDS_AND_CDNSKEY DS15_HAS_CDS_NO_CDNSKEY DS15_INCONSISTENT_CDNSKEY DS15_INCONSISTENT_CDS DS15_MISMATCH_CDS_CDNSKEY DS15_NO_CDS_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec15-cds-cdnskey-01.zft-root.rd.nic.fr' );
zone_gives( 'dnssec15', $zone, [q{DS15_HAS_CDS_AND_CDNSKEY}] );
zone_gives_not('dnssec15', $zone, [qw{DS15_HAS_CDNSKEY_NO_CDS DS15_HAS_CDS_NO_CDNSKEY DS15_INCONSISTENT_CDNSKEY DS15_INCONSISTENT_CDS DS15_MISMATCH_CDS_CDNSKEY DS15_NO_CDS_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec15-cds-cdnskey-02.zft-root.rd.nic.fr' );
zone_gives( 'dnssec15', $zone, [q{DS15_HAS_CDS_AND_CDNSKEY}] );
zone_gives_not('dnssec15', $zone, [qw{DS15_HAS_CDNSKEY_NO_CDS DS15_HAS_CDS_NO_CDNSKEY DS15_INCONSISTENT_CDNSKEY DS15_INCONSISTENT_CDS DS15_MISMATCH_CDS_CDNSKEY DS15_NO_CDS_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec15-cds-cdnskey-03.zft-root.rd.nic.fr' );
zone_gives( 'dnssec15', $zone, [q{DS15_HAS_CDS_AND_CDNSKEY}] );
zone_gives_not('dnssec15', $zone, [qw{DS15_HAS_CDNSKEY_NO_CDS DS15_HAS_CDS_NO_CDNSKEY DS15_INCONSISTENT_CDNSKEY DS15_INCONSISTENT_CDS DS15_MISMATCH_CDS_CDNSKEY DS15_NO_CDS_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec15-inconsistent-cds-01.zft-root.rd.nic.fr' );
zone_gives( 'dnssec15', $zone, [qw{DS15_HAS_CDS_NO_CDNSKEY DS15_INCONSISTENT_CDS}] );
zone_gives_not('dnssec15', $zone, [qw{DS15_HAS_CDNSKEY_NO_CDS DS15_HAS_CDS_AND_CDNSKEY DS15_INCONSISTENT_CDNSKEY DS15_MISMATCH_CDS_CDNSKEY DS15_NO_CDS_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec15-inconsistent-cds-02.zft-root.rd.nic.fr' );
zone_gives( 'dnssec15', $zone, [qw{DS15_HAS_CDS_NO_CDNSKEY DS15_INCONSISTENT_CDS}] );
zone_gives_not('dnssec15', $zone, [qw{DS15_HAS_CDNSKEY_NO_CDS DS15_HAS_CDS_AND_CDNSKEY DS15_INCONSISTENT_CDNSKEY DS15_MISMATCH_CDS_CDNSKEY DS15_NO_CDS_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec15-inconsistent-cds-03.zft-root.rd.nic.fr' );
zone_gives( 'dnssec15', $zone, [qw{DS15_HAS_CDS_NO_CDNSKEY DS15_INCONSISTENT_CDS}] );
zone_gives_not('dnssec15', $zone, [qw{DS15_HAS_CDNSKEY_NO_CDS DS15_HAS_CDS_AND_CDNSKEY DS15_INCONSISTENT_CDNSKEY DS15_MISMATCH_CDS_CDNSKEY DS15_NO_CDS_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec15-inconsistent-cds-04.zft-root.rd.nic.fr' );
zone_gives( 'dnssec15', $zone, [qw{DS15_HAS_CDS_NO_CDNSKEY DS15_INCONSISTENT_CDS}] );
zone_gives_not('dnssec15', $zone, [qw{DS15_HAS_CDNSKEY_NO_CDS DS15_HAS_CDS_AND_CDNSKEY DS15_INCONSISTENT_CDNSKEY DS15_MISMATCH_CDS_CDNSKEY DS15_NO_CDS_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec15-inconsistent-cdnskey-01.zft-root.rd.nic.fr' );
zone_gives( 'dnssec15', $zone, [qw{DS15_HAS_CDNSKEY_NO_CDS DS15_INCONSISTENT_CDNSKEY}] );
zone_gives_not('dnssec15', $zone, [qw{DS15_HAS_CDS_AND_CDNSKEY DS15_HAS_CDS_NO_CDNSKEY DS15_INCONSISTENT_CDS DS15_MISMATCH_CDS_CDNSKEY DS15_NO_CDS_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec15-inconsistent-cdnskey-02.zft-root.rd.nic.fr' );
zone_gives( 'dnssec15', $zone, [qw{DS15_HAS_CDNSKEY_NO_CDS DS15_INCONSISTENT_CDNSKEY}] );
zone_gives_not('dnssec15', $zone, [qw{DS15_HAS_CDS_AND_CDNSKEY DS15_HAS_CDS_NO_CDNSKEY DS15_INCONSISTENT_CDS DS15_MISMATCH_CDS_CDNSKEY DS15_NO_CDS_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec15-inconsistent-cdnskey-03.zft-root.rd.nic.fr' );
zone_gives( 'dnssec15', $zone, [qw{DS15_HAS_CDNSKEY_NO_CDS DS15_INCONSISTENT_CDNSKEY}] );
zone_gives_not('dnssec15', $zone, [qw{DS15_HAS_CDS_AND_CDNSKEY DS15_HAS_CDS_NO_CDNSKEY DS15_INCONSISTENT_CDS DS15_MISMATCH_CDS_CDNSKEY DS15_NO_CDS_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec15-inconsistent-cdnskey-04.zft-root.rd.nic.fr' );
zone_gives( 'dnssec15', $zone, [qw{DS15_HAS_CDNSKEY_NO_CDS DS15_INCONSISTENT_CDNSKEY}] );
zone_gives_not('dnssec15', $zone, [qw{DS15_HAS_CDS_AND_CDNSKEY DS15_HAS_CDS_NO_CDNSKEY DS15_INCONSISTENT_CDS DS15_MISMATCH_CDS_CDNSKEY DS15_NO_CDS_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec15-mismatch-cds-cdnskey.zft-root.rd.nic.fr' );
zone_gives( 'dnssec15', $zone, [qw{DS15_HAS_CDS_AND_CDNSKEY DS15_MISMATCH_CDS_CDNSKEY}] );
zone_gives_not('dnssec15', $zone, [qw{DS15_HAS_CDNSKEY_NO_CDS DS15_HAS_CDS_NO_CDNSKEY DS15_INCONSISTENT_CDNSKEY DS15_INCONSISTENT_CDS DS15_NO_CDS_CDNSKEY}] );
###########
# dnssec16 -- See t/Test-dnssec16.t instead.
###########
###########
# dnssec17
###########
$zone = Zonemaster::Engine->zone( 'dnssec16-cds-cdnskey-signed.zft-root.rd.nic.fr' );
zone_gives_not('dnssec17', $zone, [qw{DS17_CDNSKEY_INVALID_RRSIG DS17_CDNSKEY_IS_NON_SEP DS17_CDNSKEY_IS_NON_ZONE DS17_CDNSKEY_MATCHES_NO_DNSKEY DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEY DS17_CDNSKEY_UNSIGNED DS17_CDNSKEY_WITHOUT_DNSKEY DS17_DELETE_CDNSKEY DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_MIXED_DELETE_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec16-cds-cdnskey-unsigned.zft-root.rd.nic.fr' );
zone_gives( 'dnssec17', $zone, [qw{DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEY}]);
zone_gives_not('dnssec17', $zone, [qw{DS17_CDNSKEY_INVALID_RRSIG DS17_CDNSKEY_IS_NON_SEP DS17_CDNSKEY_IS_NON_ZONE DS17_CDNSKEY_MATCHES_NO_DNSKEY DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEY DS17_CDNSKEY_UNSIGNED DS17_CDNSKEY_WITHOUT_DNSKEY DS17_DELETE_CDNSKEY DS17_MIXED_DELETE_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec16-cds-cdnskey-invalid-rrsig-01.zft-root.rd.nic.fr' );
zone_gives( 'dnssec17', $zone, [q{DS17_CDNSKEY_INVALID_RRSIG}]);
zone_gives_not('dnssec17', $zone, [qw{DS17_CDNSKEY_IS_NON_SEP DS17_CDNSKEY_IS_NON_ZONE DS17_CDNSKEY_MATCHES_NO_DNSKEY DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEY DS17_CDNSKEY_UNSIGNED DS17_CDNSKEY_WITHOUT_DNSKEY DS17_DELETE_CDNSKEY DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_MIXED_DELETE_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec16-cds-cdnskey-invalid-rrsig-02.zft-root.rd.nic.fr' );
zone_gives( 'dnssec17', $zone, [q{DS17_CDNSKEY_INVALID_RRSIG}]);
zone_gives_not('dnssec17', $zone, [qw{DS17_CDNSKEY_IS_NON_SEP DS17_CDNSKEY_IS_NON_ZONE DS17_CDNSKEY_MATCHES_NO_DNSKEY DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEY DS17_CDNSKEY_UNSIGNED DS17_CDNSKEY_WITHOUT_DNSKEY DS17_DELETE_CDNSKEY DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_MIXED_DELETE_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec17-cdnskey-unsigned.zft-root.rd.nic.fr' );
zone_gives( 'dnssec17', $zone, [qw{DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_CDNSKEY_UNSIGNED}]);
zone_gives_not('dnssec17', $zone, [qw{DS17_CDNSKEY_INVALID_RRSIG DS17_CDNSKEY_IS_NON_SEP DS17_CDNSKEY_IS_NON_ZONE DS17_CDNSKEY_MATCHES_NO_DNSKEY DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEY DS17_CDNSKEY_WITHOUT_DNSKEY DS17_DELETE_CDNSKEY DS17_MIXED_DELETE_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec16-cds-without-dnskey.zft-root.rd.nic.fr' );
zone_gives( 'dnssec17', $zone, [q{DS17_CDNSKEY_WITHOUT_DNSKEY}]);
zone_gives_not('dnssec17', $zone, [qw{DS17_CDNSKEY_INVALID_RRSIG DS17_CDNSKEY_IS_NON_SEP DS17_CDNSKEY_IS_NON_ZONE DS17_CDNSKEY_MATCHES_NO_DNSKEY DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEY DS17_CDNSKEY_UNSIGNED DS17_DELETE_CDNSKEY DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_MIXED_DELETE_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec17-cdnskey-signed-by-unknown-dnskey.zft-root.rd.nic.fr' );
zone_gives_not('dnssec17', $zone, [qw{DS17_CDNSKEY_INVALID_RRSIG DS17_CDNSKEY_IS_NON_ZONE DS17_CDNSKEY_MATCHES_NO_DNSKEY DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_CDNSKEY_UNSIGNED DS17_CDNSKEY_WITHOUT_DNSKEY DS17_DELETE_CDNSKEY DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_MIXED_DELETE_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec17-cdnskey-matches-no-dnskey.zft-root.rd.nic.fr' );
zone_gives( 'dnssec17', $zone, [qw{DS17_CDNSKEY_MATCHES_NO_DNSKEY DS17_CDNSKEY_IS_NON_SEP}]);
zone_gives_not('dnssec17', $zone, [qw{DS17_CDNSKEY_INVALID_RRSIG DS17_CDNSKEY_IS_NON_ZONE DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEY DS17_CDNSKEY_UNSIGNED DS17_CDNSKEY_WITHOUT_DNSKEY DS17_DELETE_CDNSKEY DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_MIXED_DELETE_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec17-delete-cdnskey.zft-root.rd.nic.fr' );
zone_gives( 'dnssec17', $zone, [q{DS17_DELETE_CDNSKEY}]);
zone_gives_not('dnssec17', $zone, [qw{DS17_CDNSKEY_INVALID_RRSIG DS17_CDNSKEY_IS_NON_SEP DS17_CDNSKEY_IS_NON_ZONE DS17_CDNSKEY_MATCHES_NO_DNSKEY DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEY DS17_CDNSKEY_UNSIGNED DS17_CDNSKEY_WITHOUT_DNSKEY DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_MIXED_DELETE_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec17-mixed-delete-cdnskey.zft-root.rd.nic.fr' );
zone_gives( 'dnssec17', $zone, [q{DS17_MIXED_DELETE_CDNSKEY}]);
zone_gives_not('dnssec17', $zone, [qw{DS17_CDNSKEY_INVALID_RRSIG DS17_CDNSKEY_IS_NON_SEP DS17_CDNSKEY_IS_NON_ZONE DS17_CDNSKEY_MATCHES_NO_DNSKEY DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEY DS17_CDNSKEY_UNSIGNED DS17_CDNSKEY_WITHOUT_DNSKEY DS17_DELETE_CDNSKEY DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEY}] );
$zone = Zonemaster::Engine->zone( 'dnssec17-cdnskey-is-non-zone.zft-root.rd.nic.fr' );
zone_gives( 'dnssec17', $zone, [q{DS17_CDNSKEY_IS_NON_ZONE}]);
zone_gives_not('dnssec17', $zone, [qw{DS17_CDNSKEY_INVALID_RRSIG DS17_CDNSKEY_IS_NON_SEP DS17_CDNSKEY_MATCHES_NO_DNSKEY DS17_CDNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEY DS17_CDNSKEY_UNSIGNED DS17_CDNSKEY_WITHOUT_DNSKEY DS17_DELETE_CDNSKEY DS17_DNSKEY_NOT_SIGNED_BY_CDNSKEY DS17_MIXED_DELETE_CDNSKEY}] );
###########
# dnssec18
###########
$zone = Zonemaster::Engine->zone( 'dnssec18-no-match-cds-rrsig-ds.zft-root.rd.nic.fr' );
zone_gives( 'dnssec18', $zone, [q{DS18_NO_MATCH_CDS_RRSIG_DS}]);
zone_gives_not( 'dnssec18', $zone, [q{DS18_NO_MATCH_CDNSKEY_RRSIG_DS}]);
$zone = Zonemaster::Engine->zone( 'dnssec18-no-match-cdnskey-rrsig-ds.zft-root.rd.nic.fr' );
zone_gives( 'dnssec18', $zone, [q{DS18_NO_MATCH_CDNSKEY_RRSIG_DS}]);
zone_gives_not( 'dnssec18', $zone, [q{DS18_NO_MATCH_CDS_RRSIG_DS}]);
TODO: {
local $TODO = "Need to find/create zones with that error";
# dnssec02
ok( $tag{DS02_ALGO_NOT_SUPPORTED_BY_ZM}, q{DS02_ALGO_NOT_SUPPORTED_BY_ZM} );
ok( $tag{DS02_DNSKEY_NOT_FOR_ZONE_SIGNING}, q{DS02_DNSKEY_NOT_FOR_ZONE_SIGNING} );
# dnssec06
ok( $tag{EXTRA_PROCESSING_BROKEN}, q{EXTRA_PROCESSING_BROKEN} );
local $TODO = "Need to check these zones with that error";
# dnssec08: dnssec08-dnskey-signature-not-ok.zut-root.rd.nic.fr
# Commented out for now because zone doesn't give this message tag anymore. Reason unknown, investigation required. See https://github.com/zonemaster/zonemaster-engine/pull/1147#issuecomment-1318896623
ok( $tag{DS08_RRSIG_NOT_VALID_BY_DNSKEY}, q{DS08_RRSIG_NOT_VALID_BY_DNSKEY});
# dnssec13: dnssec13-algo-not-signed-dnskey.zft-root.rd.nic.fr
# Commented out for now because zone doesn't give this message tag anymore. Reason unknown, investigation required. See https://github.com/zonemaster/zonemaster-engine/pull/1147#issuecomment-1318896623
ok( $tag{DS13_ALGO_NOT_SIGNED_DNSKEY}, q{DS13_ALGO_NOT_SIGNED_DNSKEY} );
# dnssec17: dnssec17-cdnskey-signed-by-unknown-dnskey.zft-root.rd.nic.fr
# Commented out for now because zone doesn't give these message tags anymore. Reason unknown, investigation required. See https://github.com/zonemaster/zonemaster-engine/pull/1147#issuecomment-1318896623
ok( $tag{DS17_CDNSKEY_IS_NON_SEP}, q{DS17_CDNSKEY_IS_NON_SEP} );
ok( $tag{DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEY}, q{DS17_CDNSKEY_SIGNED_BY_UNKNOWN_DNSKEY} );
}
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,284 @@
use strict;
use warnings;
use Test::More;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::DNSSEC} );
use_ok( q{TestUtil}, qw( perform_testcase_testing ) );
}
###########
# DNSSEC01 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/DNSSEC-TP/dnssec01.md
my $test_module = 'DNSSEC';
my $test_case = 'dnssec01';
my @all_tags = qw(
DS01_DS_ALGO_2_MISSING
DS01_DS_ALGO_DEPRECATED
DS01_DS_ALGO_NOT_DS
DS01_DS_ALGO_OK
DS01_DS_ALGO_PRIVATE
DS01_DS_ALGO_RESERVED
DS01_DS_ALGO_UNASSIGNED
DS01_NO_RESPONSE
DS01_PARENT_SERVER_NO_DS
DS01_PARENT_ZONE_NO_DS
DS01_ROOT_N_NO_UNDEL_DS
DS01_UNDEL_N_NO_UNDEL_DS
);
# Specific hint file (https://github.com/zonemaster/zonemaster/blob/master/test-zone-data/DNSSEC-TP/dnssec01/hintfile.zone)
Zonemaster::Engine::Recursor->remove_fake_addresses( '.' );
Zonemaster::Engine::Recursor->add_fake_addresses( '.',
{ 'root-ns1.xa' => [ '127.15.1.27', 'fda1:b2:c3::127:15:1:27' ],
'root-ns2.xa' => [ '127.15.1.28', 'fda1:b2:c3::127:15:1:28' ],
}
);
# Test zone scenarios
# - Documentation: L<TestUtil/perform_testcase_testing()>
# - Format: { SCENARIO_NAME => [
# testable,
# zone_name,
# [ MANDATORY_MESSAGE_TAGS ],
# [ FORBIDDEN_MESSAGE_TAGS ],
# [ UNDELEGATED_NS ],
# [ UNDELEGATED_DS ],
# ] }
#
# - One of MANDATORY_MESSAGE_TAGS and FORBIDDEN_MESSAGE_TAGS may be undefined.
# See documentation for the meaning of that.
my %subtests = (
'ALGO-DEPRECATED-1' => [
1,
q(algo-deprecated-1.dnssec01.xa),
[ qw( DS01_DS_ALGO_DEPRECATED DS01_DS_ALGO_2_MISSING ) ],
undef,
[],
[],
],
'ALGO-DEPRECATED-3' => [
1,
q(algo-deprecated-3.dnssec01.xa),
[ qw( DS01_DS_ALGO_DEPRECATED DS01_DS_ALGO_2_MISSING ) ],
undef,
[],
[],
],
'ALGO-NOT-DS-0' => [
1,
q(algo-not-ds-0.dnssec01.xa),
[ qw( DS01_DS_ALGO_NOT_DS DS01_DS_ALGO_2_MISSING ) ],
undef,
[],
[],
],
'ALGO-OK-2' => [
1,
q(algo-ok-2.dnssec01.xa),
[ qw( DS01_DS_ALGO_OK ) ],
undef,
[],
[],
],
'ALGO-OK-4' => [
1,
q(algo-ok-4.dnssec01.xa),
[ qw( DS01_DS_ALGO_OK DS01_DS_ALGO_2_MISSING ) ],
undef,
[],
[],
],
'ALGO-OK-5' => [
1,
q(algo-ok-5.dnssec01.xa),
[ qw( DS01_DS_ALGO_OK DS01_DS_ALGO_2_MISSING ) ],
undef,
[],
[],
],
'ALGO-OK-6' => [
1,
q(algo-ok-6.dnssec01.xa),
[ qw( DS01_DS_ALGO_OK DS01_DS_ALGO_2_MISSING ) ],
undef,
[],
[],
],
'ALGO-PRIVATE-253' => [
1,
q(algo-private-253.dnssec01.xa),
[ qw( DS01_DS_ALGO_PRIVATE DS01_DS_ALGO_2_MISSING ) ],
undef,
[],
[],
],
'ALGO-PRIVATE-254' => [
1,
q(algo-private-254.dnssec01.xa),
[ qw( DS01_DS_ALGO_PRIVATE DS01_DS_ALGO_2_MISSING ) ],
undef,
[],
[],
],
'ALGO-RESERVED-128' => [
1,
q(algo-reserved-128.dnssec01.xa),
[ qw( DS01_DS_ALGO_RESERVED DS01_DS_ALGO_2_MISSING ) ],
undef,
[],
[],
],
'ALGO-RESERVED-188' => [
1,
q(algo-reserved-188.dnssec01.xa),
[ qw( DS01_DS_ALGO_RESERVED DS01_DS_ALGO_2_MISSING ) ],
undef,
[],
[],
],
'ALGO-RESERVED-252' => [
1,
q(algo-reserved-252.dnssec01.xa),
[ qw( DS01_DS_ALGO_RESERVED DS01_DS_ALGO_2_MISSING ) ],
undef,
[],
[],
],
'ALGO-UNASSIGNED-7' => [
1,
q(algo-unassigned-7.dnssec01.xa),
[ qw( DS01_DS_ALGO_UNASSIGNED DS01_DS_ALGO_2_MISSING ) ],
undef,
[],
[],
],
'ALGO-UNASSIGNED-67' => [
1,
q(algo-unassigned-67.dnssec01.xa),
[ qw( DS01_DS_ALGO_UNASSIGNED DS01_DS_ALGO_2_MISSING ) ],
undef,
[],
[],
],
'ALGO-UNASSIGNED-127' => [
1,
q(algo-unassigned-127.dnssec01.xa),
[ qw( DS01_DS_ALGO_UNASSIGNED DS01_DS_ALGO_2_MISSING ) ],
undef,
[],
[],
],
'MIXED-ALGO-1' => [
1,
q(mixed-algo-1.dnssec01.xa),
[ qw( DS01_DS_ALGO_DEPRECATED DS01_DS_ALGO_PRIVATE DS01_DS_ALGO_OK ) ],
undef,
[],
[],
],
'SHARED-IP-1' => [
1,
q(child.shared-ip-1.dnssec01.xa),
[ qw( DS01_DS_ALGO_OK ) ],
undef,
[],
[],
],
'SHARED-IP-2' => [
1,
q(child.shared-ip-2.dnssec01.xa),
[ qw( DS01_DS_ALGO_OK ) ],
undef,
[],
[],
],
'NO-RESPONSE-1' => [
1,
q(child.no-response-1.dnssec01.xa),
[ qw( DS01_NO_RESPONSE ) ],
undef,
[],
[],
],
'NO-VALID-RESPONSE-1' => [
1,
q(child.no-valid-response-1.dnssec01.xa),
[ qw( DS01_NO_RESPONSE ) ],
undef,
[],
[],
],
'PARENT-SERVER-NO-DS-1' => [
1,
q(child.parent-server-no-ds-1.dnssec01.xa),
[ qw( DS01_PARENT_SERVER_NO_DS DS01_DS_ALGO_OK ) ],
undef,
[],
[],
],
'PARENT-ZONE-NO-DS-1' => [
1,
q(parent-zone-no-ds-1.dnssec01.xa),
[ qw( DS01_PARENT_ZONE_NO_DS ) ],
undef,
[],
[],
],
'UNDEL-NO-UNDEL-DS-1' => [
1,
q(undel-no-undel-ds-1.dnssec01.xa),
[ qw( DS01_UNDEL_N_NO_UNDEL_DS ) ],
undef,
[ qw( ns1.undel-no-undel-ds-1.dnssec01.xa/127.15.1.41 ns1.undel-no-undel-ds-1.dnssec01.xa/fda1:b2:c3:0:127:15:1:41 ns2.undel-no-undel-ds-1.dnssec01.xa/127.15.1.42 ns2.undel-no-undel-ds-1.dnssec01.xa/fda1:b2:c3:0:127:15:1:42 ) ],
[],
],
'UNDEL-WITH-UNDEL-DS-1' => [
1,
q(undel-with-undel-ds-1.dnssec01.xa),
[ qw( DS01_DS_ALGO_OK ) ],
undef,
[],
[ '42581,13,2,F28391C1ED4DC0F151EDD251A3103DCE0B9A5A251ACF6E24073771D71F3C40F9' ],
],
'ROOT-NO-UNDEL-DS-1' => [
1,
q(.),
[ qw( DS01_ROOT_N_NO_UNDEL_DS ) ],
undef,
[],
[],
],
'ROOT-WITH-UNDEL-DS-1' => [
1,
q(.),
[ qw( DS01_DS_ALGO_OK ) ],
undef,
[],
[ '42581,13,2,F28391C1ED4DC0F151EDD251A3103DCE0B9A5A251ACF6E24073771D71F3C40F9' ],
],
);
###########
my $datafile = 't/' . basename ($0, '.t') . '.data';
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
Zonemaster::Engine::Profile->effective->merge( Zonemaster::Engine::Profile->from_json( qq({ "test_cases": [ "$test_case" ] }) ) );
perform_testcase_testing( $test_case, $test_module, \@all_tags, \%subtests, $ENV{ZONEMASTER_SELECTED_SCENARIOS}, $ENV{ZONEMASTER_DISABLED_SCENARIOS} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,188 @@
use strict;
use warnings;
use Test::More;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Nameserver} );
use_ok( q{Zonemaster::Engine::Test::DNSSEC} );
use_ok( q{TestUtil}, qw( perform_testcase_testing ) );
}
###########
# dnssec03 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/DNSSEC-TP/dnssec03.md
my $test_module = q{DNSSEC};
my $test_case = 'dnssec03';
my @all_tags = qw(DS03_NO_DNSSEC_SUPPORT
DS03_ERR_MULT_NSEC3
DS03_ILLEGAL_HASH_ALGO
DS03_ILLEGAL_ITERATION_VALUE
DS03_ILLEGAL_SALT_LENGTH
DS03_INCONSISTENT_HASH_ALGO
DS03_INCONSISTENT_ITERATION
DS03_INCONSISTENT_NSEC3_FLAGS
DS03_INCONSISTENT_SALT_LENGTH
DS03_LEGAL_EMPTY_SALT
DS03_LEGAL_HASH_ALGO
DS03_LEGAL_ITERATION_VALUE
DS03_NO_NSEC3
DS03_NSEC3_OPT_OUT_DISABLED
DS03_NSEC3_OPT_OUT_ENABLED_NON_TLD
DS03_NSEC3_OPT_OUT_ENABLED_TLD
DS03_SERVER_NO_DNSSEC_SUPPORT
DS03_SERVER_NO_NSEC3
DS03_UNASSIGNED_FLAG_USED
DS03_ERROR_RESPONSE_NSEC_QUERY
DS03_NO_RESPONSE_NSEC_QUERY);
# Common hint file (test-zone-data/COMMON/hintfile)
Zonemaster::Engine::Recursor->remove_fake_addresses( '.' );
Zonemaster::Engine::Recursor->add_fake_addresses( '.',
{ 'ns1' => [ '127.1.0.1', 'fda1:b2:c3::127:1:0:1' ],
'ns2' => [ '127.1.0.2', 'fda1:b2:c3::127:1:0:2' ],
}
);
# Test zone scenarios
# - Documentation: L<TestUtil/perform_testcase_testing()>
# - Format: { SCENARIO_NAME => [
# testable,
# zone_name,
# [ MANDATORY_MESSAGE_TAGS ],
# [ FORBIDDEN_MESSAGE_TAGS ],
# [ UNDELEGATED_NS ],
# [ UNDELEGATED_DS ],
# ] }
#
# - One of MANDATORY_MESSAGE_TAGS and FORBIDDEN_MESSAGE_TAGS may be undefined.
# See documentation for the meaning of that.
my %subtests = (
'NO-DNSSEC-SUPPORT' => [
1,
q(no-dnssec-support.dnssec03.xa),
[ qw(DS03_NO_DNSSEC_SUPPORT) ],
undef,
[],
[]
],
'NO-NSEC3' => [
1,
q(no-nsec3.dnssec03.xa),
[ qw(DS03_NO_NSEC3) ],
undef,
[],
[]
],
'GOOD-VALUES' => [
1,
q(good-values.dnssec03.xa),
[ qw(DS03_LEGAL_EMPTY_SALT DS03_LEGAL_HASH_ALGO DS03_LEGAL_ITERATION_VALUE DS03_NSEC3_OPT_OUT_DISABLED) ],
undef,
[],
[]
],
'ERR-MULT-NSEC3' => [
1,
q(err-mult-nsec3.dnssec03.xa),
[ qw(DS03_ERR_MULT_NSEC3 DS03_LEGAL_EMPTY_SALT DS03_LEGAL_HASH_ALGO DS03_LEGAL_ITERATION_VALUE DS03_NSEC3_OPT_OUT_DISABLED) ],
undef,
[],
[]
],
'BAD-VALUES' => [
1,
q(bad-values.dnssec03.xa),
[ qw(DS03_ILLEGAL_HASH_ALGO DS03_ILLEGAL_ITERATION_VALUE DS03_ILLEGAL_SALT_LENGTH DS03_NSEC3_OPT_OUT_ENABLED_NON_TLD) ],
undef,
[],
[]
],
'INCONSISTENT-VALUES' => [
1,
q(inconsistent-values.dnssec03.xa),
undef,
[ qw(DS03_ERR_MULT_NSEC3 DS03_NO_DNSSEC_SUPPORT DS03_NO_NSEC3 DS03_NSEC3_OPT_OUT_ENABLED_TLD DS03_SERVER_NO_DNSSEC_SUPPORT DS03_SERVER_NO_NSEC3 DS03_UNASSIGNED_FLAG_USED DS03_ERROR_RESPONSE_NSEC_QUERY DS03_NO_RESPONSE_NSEC_QUERY) ],
[],
[]
],
'NSEC3-OPT-OUT-ENABLED-TLD' => [
1,
q(nsec3-opt-out-enabled-tld-dnssec03),
[ qw(DS03_NSEC3_OPT_OUT_ENABLED_TLD DS03_LEGAL_EMPTY_SALT DS03_LEGAL_HASH_ALGO DS03_LEGAL_ITERATION_VALUE) ],
undef,
[],
[]
],
'SERVER-NO-DNSSEC-SUPPORT' => [
1,
q(server-no-dnssec-support.dnssec03.xa),
[ qw(DS03_SERVER_NO_DNSSEC_SUPPORT DS03_LEGAL_EMPTY_SALT DS03_LEGAL_HASH_ALGO DS03_LEGAL_ITERATION_VALUE DS03_NSEC3_OPT_OUT_DISABLED) ],
undef,
[],
[]
],
'SERVER-NO-NSEC3' => [
1,
q(server-no-nsec3.dnssec03.xa),
[ qw(DS03_SERVER_NO_NSEC3 DS03_LEGAL_EMPTY_SALT DS03_LEGAL_HASH_ALGO DS03_LEGAL_ITERATION_VALUE DS03_NSEC3_OPT_OUT_DISABLED) ],
undef,
[],
[]
],
'UNASSIGNED-FLAG-USED' => [
1,
q(unassigned-flag-used.dnssec03.xa),
[ qw(DS03_UNASSIGNED_FLAG_USED DS03_LEGAL_EMPTY_SALT DS03_LEGAL_HASH_ALGO DS03_LEGAL_ITERATION_VALUE DS03_NSEC3_OPT_OUT_DISABLED) ],
undef,
[],
[]
],
'ERROR-RESPONSE-NSEC-QUERY' => [
1,
q(error-response-nsec-query.dnssec03.xa),
[ qw(DS03_LEGAL_EMPTY_SALT DS03_LEGAL_HASH_ALGO DS03_LEGAL_ITERATION_VALUE DS03_NSEC3_OPT_OUT_DISABLED DS03_ERROR_RESPONSE_NSEC_QUERY) ],
undef,
[],
[]
],
'NO-RESPONSE-NSEC-QUERY' => [
1,
q(no-response-nsec-query.dnssec03.xa),
[ qw(DS03_LEGAL_EMPTY_SALT DS03_LEGAL_HASH_ALGO DS03_LEGAL_ITERATION_VALUE DS03_NSEC3_OPT_OUT_DISABLED DS03_NO_RESPONSE_NSEC_QUERY) ],
undef,
[],
[]
],
'ERROR-NSEC-QUERY' => [
1,
q(error-nsec-query.dnssec03.xa),
[ qw(DS03_ERROR_RESPONSE_NSEC_QUERY DS03_NO_RESPONSE_NSEC_QUERY) ],
undef,
[],
[]
]
);
###########
my $datafile = 't/' . basename ($0, '.t') . '.data';
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
Zonemaster::Engine::Profile->effective->merge( Zonemaster::Engine::Profile->from_json( qq({ "test_cases": [ "$test_case" ] }) ) );
perform_testcase_testing( $test_case, $test_module, \@all_tags, \%subtests, $ENV{ZONEMASTER_SELECTED_SCENARIOS}, $ENV{ZONEMASTER_DISABLED_SCENARIOS} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,338 @@
use strict;
use warnings;
use Test::More;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::DNSSEC} );
use_ok( q{TestUtil}, qw( perform_testcase_testing ) );
}
###########
# DNSSEC05 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/DNSSEC-TP/dnssec05.md
my $test_module = 'DNSSEC';
my $test_case = 'dnssec05';
my @all_tags = qw(
DS05_ALGO_DEPRECATED
DS05_ALGO_NOT_RECOMMENDED
DS05_ALGO_NOT_ZONE_SIGN
DS05_ALGO_OK
DS05_ALGO_PRIVATE
DS05_ALGO_RESERVED
DS05_ALGO_UNASSIGNED
DS05_NO_RESPONSE
DS05_SERVER_NO_DNSSEC
DS05_ZONE_NO_DNSSEC
);
# Specific hint file (https://github.com/zonemaster/zonemaster/blob/master/test-zone-data/DNSSEC-TP/dnssec05/hintfile.zone)
Zonemaster::Engine::Recursor->remove_fake_addresses( '.' );
Zonemaster::Engine::Recursor->add_fake_addresses( '.',
{ 'root-ns1.xa' => [ '127.15.5.27', 'fda1:b2:c3::127:15:5:27' ],
'root-ns2.xa' => [ '127.15.5.28', 'fda1:b2:c3::127:15:5:28' ],
}
);
# Test zone scenarios
# - Documentation: L<TestUtil/perform_testcase_testing()>
# - Format: { SCENARIO_NAME => [
# testable,
# zone_name,
# [ MANDATORY_MESSAGE_TAGS ],
# [ FORBIDDEN_MESSAGE_TAGS ],
# [ UNDELEGATED_NS ],
# [ UNDELEGATED_DS ],
# ] }
#
# - One of MANDATORY_MESSAGE_TAGS and FORBIDDEN_MESSAGE_TAGS may be undefined.
# See documentation for the meaning of that.
my %subtests = (
'ALGO-DEPRECATED-1' => [
1,
q(algo-deprecated-1.dnssec05.xa),
[ qw( DS05_ALGO_DEPRECATED ) ],
undef,
[],
[],
],
'ALGO-DEPRECATED-3' => [
1,
q(algo-deprecated-3.dnssec05.xa),
[ qw( DS05_ALGO_DEPRECATED ) ],
undef,
[],
[],
],
'ALGO-DEPRECATED-5' => [
1,
q(algo-deprecated-5.dnssec05.xa),
[ qw( DS05_ALGO_DEPRECATED ) ],
undef,
[],
[],
],
'ALGO-DEPRECATED-6' => [
1,
q(algo-deprecated-6.dnssec05.xa),
[ qw( DS05_ALGO_DEPRECATED ) ],
undef,
[],
[],
],
'ALGO-DEPRECATED-7' => [
1,
q(algo-deprecated-7.dnssec05.xa),
[ qw( DS05_ALGO_DEPRECATED ) ],
undef,
[],
[],
],
'ALGO-DEPRECATED-12' => [
1,
q(algo-deprecated-12.dnssec05.xa),
[ qw( DS05_ALGO_DEPRECATED ) ],
undef,
[],
[],
],
'ALGO-NOT-RECOMMENDED-10' => [
1,
q(algo-not-recommended-10.dnssec05.xa),
[ qw( DS05_ALGO_NOT_RECOMMENDED ) ],
undef,
[],
[],
],
'ALGO-NOT-ZONE-SIGN-0' => [
1,
q(algo-not-zone-sign-0.dnssec05.xa),
[ qw( DS05_ALGO_NOT_ZONE_SIGN ) ],
undef,
[],
[],
],
'ALGO-NOT-ZONE-SIGN-2' => [
1,
q(algo-not-zone-sign-2.dnssec05.xa),
[ qw( DS05_ALGO_NOT_ZONE_SIGN ) ],
undef,
[],
[],
],
'ALGO-NOT-ZONE-SIGN-252' => [
1,
q(algo-not-zone-sign-252.dnssec05.xa),
[ qw( DS05_ALGO_NOT_ZONE_SIGN ) ],
undef,
[],
[],
],
'ALGO-OK-8' => [
1,
q(algo-ok-8.dnssec05.xa),
[ qw( DS05_ALGO_OK ) ],
undef,
[],
[],
],
'ALGO-OK-13' => [
1,
q(algo-ok-13.dnssec05.xa),
[ qw( DS05_ALGO_OK ) ],
undef,
[],
[],
],
'ALGO-OK-14' => [
1,
q(algo-ok-14.dnssec05.xa),
[ qw( DS05_ALGO_OK ) ],
undef,
[],
[],
],
'ALGO-OK-15' => [
1,
q(algo-ok-15.dnssec05.xa),
[ qw( DS05_ALGO_OK ) ],
undef,
[],
[],
],
'ALGO-OK-16' => [
1,
q(algo-ok-16.dnssec05.xa),
[ qw( DS05_ALGO_OK ) ],
undef,
[],
[],
],
'ALGO-OK-17' => [
1,
q(algo-ok-17.dnssec05.xa),
[ qw( DS05_ALGO_OK ) ],
undef,
[],
[],
],
'ALGO-OK-23' => [
1,
q(algo-ok-23.dnssec05.xa),
[ qw( DS05_ALGO_OK ) ],
undef,
[],
[],
],
'ALGO-PRIVATE-253' => [
1,
q(algo-private-253.dnssec05.xa),
[ qw( DS05_ALGO_PRIVATE ) ],
undef,
[],
[],
],
'ALGO-PRIVATE-254' => [
1,
q(algo-private-254.dnssec05.xa),
[ qw( DS05_ALGO_PRIVATE ) ],
undef,
[],
[],
],
'ALGO-RESERVED-4' => [
1,
q(algo-reserved-4.dnssec05.xa),
[ qw( DS05_ALGO_RESERVED ) ],
undef,
[],
[],
],
'ALGO-RESERVED-9' => [
1,
q(algo-reserved-9.dnssec05.xa),
[ qw( DS05_ALGO_RESERVED ) ],
undef,
[],
[],
],
'ALGO-RESERVED-11' => [
1,
q(algo-reserved-11.dnssec05.xa),
[ qw( DS05_ALGO_RESERVED ) ],
undef,
[],
[],
],
'ALGO-RESERVED-123' => [
1,
q(algo-reserved-123.dnssec05.xa),
[ qw( DS05_ALGO_RESERVED ) ],
undef,
[],
[],
],
'ALGO-RESERVED-251' => [
1,
q(algo-reserved-251.dnssec05.xa),
[ qw( DS05_ALGO_RESERVED ) ],
undef,
[],
[],
],
'ALGO-RESERVED-255' => [
1,
q(algo-reserved-255.dnssec05.xa),
[ qw( DS05_ALGO_RESERVED ) ],
undef,
[],
[],
],
'ALGO-UNASSIGNED-20' => [
1,
q(algo-unassigned-20.dnssec05.xa),
[ qw( DS05_ALGO_UNASSIGNED ) ],
undef,
[],
[],
],
'ALGO-UNASSIGNED-122' => [
1,
q(algo-unassigned-122.dnssec05.xa),
[ qw( DS05_ALGO_UNASSIGNED ) ],
undef,
[],
[],
],
'MIXED-ALGO-1' => [
1,
q(mixed-algo-1.dnssec05.xa),
[ qw( DS05_ALGO_DEPRECATED DS05_ALGO_NOT_RECOMMENDED DS05_ALGO_OK ) ],
undef,
[],
[],
],
'NO-RESPONSE-1' => [
1,
q(no-response-1.dnssec05.xa),
[ qw( DS05_NO_RESPONSE ) ],
undef,
[],
[],
],
'NO-RESPONSE-2' => [
1,
q(no-response-2.dnssec05.xa),
[ qw( DS05_NO_RESPONSE ) ],
undef,
[],
[],
],
'SERVER-NO-DNSSEC-1' => [
1,
q(server-no-dnssec-1.dnssec05.xa),
[ qw( DS05_SERVER_NO_DNSSEC DS05_ALGO_OK ) ],
undef,
[],
[],
],
'SHARED-IP-1' => [
1,
q(shared-ip-1.dnssec05.xa),
[ qw( DS05_ALGO_OK ) ],
undef,
[],
[],
],
'ZONE-NO-DNSSEC-1' => [
1,
q(zone-no-dnssec-1.dnssec05.xa),
[ qw( DS05_ZONE_NO_DNSSEC ) ],
undef,
[],
[],
],
);
###########
my $datafile = 't/' . basename ($0, '.t') . '.data';
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
Zonemaster::Engine::Profile->effective->merge( Zonemaster::Engine::Profile->from_json( qq({ "test_cases": [ "$test_case" ] }) ) );
perform_testcase_testing( $test_case, $test_module, \@all_tags, \%subtests, $ENV{ZONEMASTER_SELECTED_SCENARIOS}, $ENV{ZONEMASTER_DISABLED_SCENARIOS} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,157 @@
use strict;
use warnings;
use Test::More;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::DNSSEC} );
use_ok( q{TestUtil}, qw( perform_testcase_testing ) );
}
###########
# DNSSEC07 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/DNSSEC-TP/dnssec07.md
my $test_module = 'DNSSEC';
my $test_case = 'dnssec07';
my @all_tags = qw(
DS07_DS_FOR_SIGNED_ZONE
DS07_DS_ON_PARENT_SERVER
DS07_INCONSISTENT_DS
DS07_INCONSISTENT_SIGNED
DS07_NON_AUTH_RESPONSE_DNSKEY
DS07_NOT_SIGNED
DS07_NOT_SIGNED_ON_SERVER
DS07_NO_DS_ON_PARENT_SERVER
DS07_NO_DS_FOR_SIGNED_ZONE
DS07_NO_RESPONSE_DNSKEY
DS07_SIGNED
DS07_SIGNED_ON_SERVER
DS07_UNEXP_RCODE_RESP_DNSKEY
);
# Specific hint file (https://github.com/zonemaster/zonemaster/blob/master/test-zone-data/DNSSEC-TP/dnssec07/hintfile.zone)
Zonemaster::Engine::Recursor->remove_fake_addresses( '.' );
Zonemaster::Engine::Recursor->add_fake_addresses( '.',
{ 'root-ns1.xa' => [ '127.15.7.27', 'fda1:b2:c3::127:15:7:27' ],
'root-ns2.xa' => [ '127.15.7.28', 'fda1:b2:c3::127:15:7:28' ],
}
);
# Test zone scenarios
# - Documentation: L<TestUtil/perform_testcase_testing()>
# - Format: { SCENARIO_NAME => [
# testable,
# zone_name,
# [ MANDATORY_MESSAGE_TAGS ],
# [ FORBIDDEN_MESSAGE_TAGS ],
# [ UNDELEGATED_NS ],
# [ UNDELEGATED_DS ],
# ] }
#
# - One of MANDATORY_MESSAGE_TAGS and FORBIDDEN_MESSAGE_TAGS may be undefined.
# See documentation for the meaning of that.
my %subtests = (
'SIGNED-AND-DS-1' => [
1,
q(signed-and-ds-1.dnssec07.xa),
[ qw( DS07_DS_FOR_SIGNED_ZONE DS07_DS_ON_PARENT_SERVER DS07_SIGNED DS07_SIGNED_ON_SERVER ) ],
undef,
[],
[],
],
'SIGNED-NO-DS-1' => [
1,
q(signed-no-ds-1.dnssec07.xa),
[ qw( DS07_NO_DS_ON_PARENT_SERVER DS07_NO_DS_FOR_SIGNED_ZONE DS07_SIGNED DS07_SIGNED_ON_SERVER ) ],
undef,
[],
[],
],
'INCONSIST-SIGNED-AND-DS-1' => [
1,
q(inconsist-signed-and-ds-1.dnssec07.xa),
[ qw( DS07_DS_ON_PARENT_SERVER DS07_INCONSISTENT_SIGNED DS07_NOT_SIGNED_ON_SERVER DS07_SIGNED_ON_SERVER ) ],
undef,
[],
[],
],
'INCONSIST-SIGNED-NO-DS-1' => [
1,
q(inconsist-signed-no-ds-1.dnssec07.xa),
[ qw( DS07_INCONSISTENT_SIGNED DS07_NOT_SIGNED_ON_SERVER DS07_NO_DS_ON_PARENT_SERVER DS07_SIGNED_ON_SERVER ) ],
undef,
[],
[],
],
'SIGNED-AND-INCONSIST-DS-1' => [
1,
q(child.signed-and-inconsist-ds-1.dnssec07.xa),
[ qw( DS07_DS_ON_PARENT_SERVER DS07_INCONSISTENT_DS DS07_NO_DS_ON_PARENT_SERVER DS07_SIGNED DS07_SIGNED_ON_SERVER ) ],
undef,
[],
[],
],
'UNSIGNED-AND-DS-1' => [
1,
q(unsigned-and-ds-1.dnssec07.xa),
[ qw( DS07_NOT_SIGNED DS07_NOT_SIGNED_ON_SERVER ) ],
undef,
[],
[],
],
'UNSIGNED-NO-DS-1' => [
1,
q(unsigned-no-ds-1.dnssec07.xa),
[ qw( DS07_NOT_SIGNED DS07_NOT_SIGNED_ON_SERVER ) ],
undef,
[],
[],
],
'NON-AUTH-RESPONSE-DNSKEY-1' => [
1,
q(non-auth-response-dnskey-1.dnssec07.xa),
[ qw( DS07_NON_AUTH_RESPONSE_DNSKEY DS07_SIGNED DS07_SIGNED_ON_SERVER DS07_DS_ON_PARENT_SERVER DS07_DS_FOR_SIGNED_ZONE ) ],
undef,
[],
[],
],
'NO-RESPONSE-DNSKEY-1' => [
1,
q(no-response-dnskey-1.dnssec07.xa),
[ qw( DS07_SIGNED DS07_SIGNED_ON_SERVER DS07_NO_RESPONSE_DNSKEY DS07_DS_ON_PARENT_SERVER DS07_DS_FOR_SIGNED_ZONE ) ],
undef,
[],
[],
],
'UNEXP-RCODE-RESP-DNSKEY-1' => [
1,
q(unexp-rcode-resp-dnskey-1.dnssec07.xa),
[ qw( DS07_SIGNED DS07_SIGNED_ON_SERVER DS07_UNEXP_RCODE_RESP_DNSKEY DS07_DS_ON_PARENT_SERVER DS07_DS_FOR_SIGNED_ZONE ) ],
undef,
[],
[],
],
);
###########
my $datafile = 't/' . basename ($0, '.t') . '.data';
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
Zonemaster::Engine::Profile->effective->merge( Zonemaster::Engine::Profile->from_json( qq({ "test_cases": [ "$test_case" ] }) ) );
perform_testcase_testing( $test_case, $test_module, \@all_tags, \%subtests, $ENV{ZONEMASTER_SELECTED_SCENARIOS}, $ENV{ZONEMASTER_DISABLED_SCENARIOS} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,542 @@
use strict;
use warnings;
use Test::More;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::DNSSEC} );
use_ok( q{TestUtil}, qw( perform_testcase_testing ) );
}
###########
# DNSSEC10 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/DNSSEC-TP/dnssec10.md
my $test_module = 'DNSSEC';
my $test_case = 'dnssec10';
my @all_tags = qw(
DS10_ALGO_NOT_SUPPORTED_BY_ZM
DS10_ERR_MULT_NSEC
DS10_ERR_MULT_NSEC3
DS10_ERR_MULT_NSEC3PARAM
DS10_EXPECTED_NSEC_NSEC3_MISSING
DS10_HAS_NSEC
DS10_HAS_NSEC3
DS10_INCONSISTENT_NSEC
DS10_INCONSISTENT_NSEC3
DS10_INCONSISTENT_NSEC_NSEC3
DS10_MIXED_NSEC_NSEC3
DS10_NSEC3PARAM_GIVES_ERR_ANSWER
DS10_NSEC3PARAM_MISMATCHES_APEX
DS10_NSEC3PARAM_QUERY_RESPONSE_ERR
DS10_NSEC3_ERR_TYPE_LIST
DS10_NSEC3_MISMATCHES_APEX
DS10_NSEC3_MISSING_SIGNATURE
DS10_NSEC3_NODATA_MISSING_SOA
DS10_NSEC3_NODATA_WRONG_SOA
DS10_NSEC3_NO_VERIFIED_SIGNATURE
DS10_NSEC3_RRSIG_EXPIRED
DS10_NSEC3_RRSIG_NOT_YET_VALID
DS10_NSEC3_RRSIG_NO_DNSKEY
DS10_NSEC3_RRSIG_VERIFY_ERROR
DS10_NSEC_ERR_TYPE_LIST
DS10_NSEC_GIVES_ERR_ANSWER
DS10_NSEC_MISMATCHES_APEX
DS10_NSEC_MISSING_SIGNATURE
DS10_NSEC_NODATA_MISSING_SOA
DS10_NSEC_NODATA_WRONG_SOA
DS10_NSEC_NO_VERIFIED_SIGNATURE
DS10_NSEC_QUERY_RESPONSE_ERR
DS10_NSEC_RRSIG_EXPIRED
DS10_NSEC_RRSIG_NOT_YET_VALID
DS10_NSEC_RRSIG_NO_DNSKEY
DS10_NSEC_RRSIG_VERIFY_ERROR
DS10_SERVER_NO_DNSSEC
DS10_ZONE_NO_DNSSEC
);
# Common hint file (https://github.com/zonemaster/zonemaster/blob/master/test-zone-data/COMMON/hintfile.zone)
Zonemaster::Engine::Recursor->remove_fake_addresses( '.' );
Zonemaster::Engine::Recursor->add_fake_addresses( '.',
{ 'ns1' => [ '127.1.0.1', 'fda1:b2:c3::127:1:0:1' ],
'ns2' => [ '127.1.0.2', 'fda1:b2:c3::127:1:0:2' ],
}
);
# Test zone scenarios
# - Documentation: L<TestUtil/perform_testcase_testing()>
# - Format: { SCENARIO_NAME => [
# testable,
# zone_name,
# [ MANDATORY_MESSAGE_TAGS ],
# [ FORBIDDEN_MESSAGE_TAGS ],
# [ UNDELEGATED_NS ],
# [ UNDELEGATED_DS ],
# ] }
#
# - One of MANDATORY_MESSAGE_TAGS and FORBIDDEN_MESSAGE_TAGS may be undefined.
# See documentation for the meaning of that.
my %subtests = (
'GOOD-NSEC-1' => [
1,
q(good-nsec-1.dnssec10.xa),
[ qw( DS10_HAS_NSEC ) ],
undef,
[],
[],
],
'GOOD-NSEC-2' => [
1,
q(good-nsec-2.dnssec10.xa),
[ qw( DS10_HAS_NSEC ) ],
undef,
[],
[],
],
'GOOD-NSEC-3' => [
1,
q(good-nsec-3.dnssec10.xa),
[ qw( DS10_HAS_NSEC ) ],
undef,
[],
[],
],
'GOOD-NSEC3-1' => [
1,
q(good-nsec3-1.dnssec10.xa),
[ qw( DS10_HAS_NSEC3 ) ],
undef,
[],
[],
],
'GOOD-NSEC3-2' => [
1,
q(good-nsec3-2.dnssec10.xa),
[ qw( DS10_HAS_NSEC3 ) ],
undef,
[],
[],
],
'GOOD-NSEC3-3' => [
1,
q(good-nsec3-3.dnssec10.xa),
[ qw( DS10_HAS_NSEC3 ) ],
undef,
[],
[],
],
'ALGO-NOT-SUPP-BY-ZM-1' => [
1,
q(algo-not-supp-by-zm-1.dnssec10.xa),
[ qw( DS10_ALGO_NOT_SUPPORTED_BY_ZM DS10_HAS_NSEC ) ],
undef,
[],
[],
],
'ALGO-NOT-SUPP-BY-ZM-2' => [
1,
q(algo-not-supp-by-zm-2.dnssec10.xa),
[ qw( DS10_ALGO_NOT_SUPPORTED_BY_ZM DS10_HAS_NSEC3 ) ],
undef,
[],
[],
],
'BAD-SERVERS-BUT-GOOD-NSEC-1' => [
1,
q(bad-servers-but-good-nsec-1.dnssec10.xa),
[ qw( DS10_HAS_NSEC ) ],
undef,
[],
[],
],
'ERR-MULT-NSEC-1' => [
1,
q(err-mult-nsec-1.dnssec10.xa),
[ qw( DS10_ERR_MULT_NSEC DS10_HAS_NSEC ) ],
undef,
[],
[],
],
'ERR-MULT-NSEC-2' => [
1,
q(err-mult-nsec-2.dnssec10.xa),
[ qw( DS10_ERR_MULT_NSEC DS10_HAS_NSEC ) ],
undef,
[],
[],
],
'ERR-MULT-NSEC3-1' => [
1,
q(err-mult-nsec3-1.dnssec10.xa),
[ qw( DS10_ERR_MULT_NSEC3 DS10_HAS_NSEC3 ) ],
undef,
[],
[],
],
'ERR-MULT-NSEC3PARAM-1' => [
1,
q(err-mult-nsec3param-1.dnssec10.xa),
[ qw( DS10_ERR_MULT_NSEC3PARAM DS10_HAS_NSEC3 ) ],
undef,
[],
[],
],
'EXP-NSEC-NSEC3-MISS-1' => [
1,
q(exp-nsec-nsec3-miss-1.dnssec10.xa),
[ qw( DS10_EXPECTED_NSEC_NSEC3_MISSING ) ],
undef,
[],
[],
],
'INCONSISTENT-NSEC-1' => [
1,
q(inconsistent-nsec-1.dnssec10.xa),
[ qw( DS10_INCONSISTENT_NSEC DS10_HAS_NSEC ) ],
undef,
[],
[],
],
'INCONSISTENT-NSEC3-1' => [
1,
q(inconsistent-nsec3-1.dnssec10.xa),
[ qw( DS10_INCONSISTENT_NSEC3 DS10_HAS_NSEC3 ) ],
undef,
[],
[],
],
'INCONSIST-NSEC-NSEC3-1' => [
1,
q(inconsist-nsec-nsec3-1.dnssec10.xa),
[ qw( DS10_INCONSISTENT_NSEC_NSEC3 ) ],
undef,
[],
[],
],
'INCONSIST-NSEC-NSEC3-2' => [
1,
q(inconsist-nsec-nsec3-2.dnssec10.xa),
[ qw( DS10_INCONSISTENT_NSEC_NSEC3 DS10_INCONSISTENT_NSEC DS10_INCONSISTENT_NSEC3 ) ],
undef,
[],
[],
],
'MIXED-NSEC-NSEC3-1' => [
1,
q(mixed-nsec-nsec3-1.dnssec10.xa),
[ qw( DS10_MIXED_NSEC_NSEC3 ) ],
undef,
[],
[],
],
'MIXED-NSEC-NSEC3-2' => [
1,
q(mixed-nsec-nsec3-2.dnssec10.xa),
[ qw( DS10_MIXED_NSEC_NSEC3 ) ],
undef,
[],
[],
],
'NSEC3PARAM-GIVES-ERR-ANSWER-1' => [
1,
q(nsec3param-gives-err-answer-1.dnssec10.xa),
[ qw( DS10_NSEC3PARAM_GIVES_ERR_ANSWER DS10_HAS_NSEC3 DS10_INCONSISTENT_NSEC3 ) ],
undef,
[],
[],
],
'NSEC3PARAM-GIVES-ERR-ANSWER-2' => [
1,
q(nsec3param-gives-err-answer-2.dnssec10.xa),
[ qw( DS10_NSEC3PARAM_GIVES_ERR_ANSWER DS10_EXPECTED_NSEC_NSEC3_MISSING DS10_INCONSISTENT_NSEC3 DS10_HAS_NSEC3 ) ],
undef,
[],
[],
],
'NSEC3PARAM-MISMATCHES-APEX-1' => [
1,
q(nsec3param-mismatches-apex-1.dnssec10.xa),
[ qw( DS10_NSEC3PARAM_MISMATCHES_APEX DS10_HAS_NSEC3 ) ],
undef,
[],
[],
],
'NSEC3PARAM-Q-RESPONSE-ERR-1' => [
1,
q(nsec3param-q-response-err-1.dnssec10.xa),
[ qw( DS10_NSEC3PARAM_QUERY_RESPONSE_ERR DS10_HAS_NSEC3 DS10_INCONSISTENT_NSEC3 ) ],
undef,
[],
[],
],
'NSEC3PARAM-Q-RESPONSE-ERR-2' => [
1,
q(nsec3param-q-response-err-2.dnssec10.xa),
[ qw( DS10_NSEC3PARAM_QUERY_RESPONSE_ERR DS10_HAS_NSEC3 DS10_INCONSISTENT_NSEC3 ) ],
undef,
[],
[],
],
'NSEC3PARAM-Q-RESPONSE-ERR-3' => [
0,
q(nsec3param-q-response-err-3.dnssec10.xa),
[ qw( DS10_NSEC3PARAM_QUERY_RESPONSE_ERR DS10_EXPECTED_NSEC_NSEC3_MISSING DS10_INCONSISTENT_NSEC3 ) ],
undef,
[],
[],
],
'NSEC3-ERR-TYPE-LIST-1' => [
1,
q(nsec3-err-type-list-1.dnssec10.xa),
[ qw( DS10_NSEC3_ERR_TYPE_LIST DS10_HAS_NSEC3 ) ],
undef,
[],
[],
],
'NSEC3-ERR-TYPE-LIST-2' => [
1,
q(nsec3-err-type-list-2.dnssec10.xa),
[ qw( DS10_NSEC3_ERR_TYPE_LIST DS10_HAS_NSEC3 ) ],
undef,
[],
[],
],
'NSEC3-MISMATCHES-APEX-1' => [
1,
q(nsec3-mismatches-apex-1.dnssec10.xa),
[ qw( DS10_NSEC3_MISMATCHES_APEX DS10_HAS_NSEC3 ) ],
undef,
[],
[],
],
'NSEC3-MISSING-SIGNATURE-1' => [
1,
q(nsec3-missing-signature-1.dnssec10.xa),
[ qw( DS10_NSEC3_MISSING_SIGNATURE DS10_HAS_NSEC3 ) ],
undef,
[],
[],
],
'NSEC3-NODATA-MISSING-SOA-1' => [
1,
q(nsec3-nodata-missing-soa-1.dnssec10.xa),
[ qw( DS10_NSEC3_NODATA_MISSING_SOA DS10_HAS_NSEC3 ) ],
undef,
[],
[],
],
'NSEC3-NODATA-WRONG-SOA-1' => [
1,
q(nsec3-nodata-wrong-soa-1.dnssec10.xa),
[ qw( DS10_NSEC3_NODATA_WRONG_SOA DS10_HAS_NSEC3 ) ],
undef,
[],
[],
],
'NSEC3-NO-VERIFIED-SIGNATURE-1' => [
1,
q(nsec3-no-verified-signature-1.dnssec10.xa),
[ qw( DS10_NSEC3_NO_VERIFIED_SIGNATURE DS10_HAS_NSEC3 DS10_NSEC3_RRSIG_NO_DNSKEY ) ],
undef,
[],
[],
],
'NSEC3-NO-VERIFIED-SIGNATURE-2' => [
1,
q(nsec3-no-verified-signature-2.dnssec10.xa),
[ qw( DS10_NSEC3_NO_VERIFIED_SIGNATURE DS10_HAS_NSEC3 DS10_NSEC3_RRSIG_EXPIRED ) ],
undef,
[],
[],
],
'NSEC3-NO-VERIFIED-SIGNATURE-3' => [
1,
q(nsec3-no-verified-signature-3.dnssec10.xa),
[ qw( DS10_NSEC3_NO_VERIFIED_SIGNATURE DS10_HAS_NSEC3 DS10_NSEC3_RRSIG_NOT_YET_VALID ) ],
undef,
[],
[],
],
'NSEC3-NO-VERIFIED-SIGNATURE-4' => [
1,
q(nsec3-no-verified-signature-4.dnssec10.xa),
[ qw( DS10_NSEC3_NO_VERIFIED_SIGNATURE DS10_HAS_NSEC3 DS10_NSEC3_RRSIG_VERIFY_ERROR ) ],
undef,
[],
[],
],
'NSEC-ERR-TYPE-LIST-1' => [
1,
q(nsec-err-type-list-1.dnssec10.xa),
[ qw( DS10_NSEC_ERR_TYPE_LIST DS10_HAS_NSEC ) ],
undef,
[],
[],
],
'NSEC-ERR-TYPE-LIST-2' => [
1,
q(nsec-err-type-list-2.dnssec10.xa),
[ qw( DS10_NSEC_ERR_TYPE_LIST DS10_HAS_NSEC ) ],
undef,
[],
[],
],
'NSEC-GIVES-ERR-ANSWER-1' => [
1,
q(nsec-gives-err-answer-1.dnssec10.xa),
[ qw( DS10_NSEC_GIVES_ERR_ANSWER DS10_HAS_NSEC DS10_INCONSISTENT_NSEC ) ],
undef,
[],
[],
],
'NSEC-GIVES-ERR-ANSWER-2' => [
1,
q(nsec-gives-err-answer-2.dnssec10.xa),
[ qw( DS10_NSEC_GIVES_ERR_ANSWER DS10_EXPECTED_NSEC_NSEC3_MISSING DS10_INCONSISTENT_NSEC DS10_HAS_NSEC ) ],
undef,
[],
[],
],
'NSEC-MISMATCHES-APEX-1' => [
1,
q(nsec-mismatches-apex-1.dnssec10.xa),
[ qw( DS10_NSEC_MISMATCHES_APEX DS10_HAS_NSEC ) ],
undef,
[],
[],
],
'NSEC-MISMATCHES-APEX-2' => [
1,
q(nsec-mismatches-apex-2.dnssec10.xa),
[ qw( DS10_NSEC_MISMATCHES_APEX DS10_HAS_NSEC ) ],
undef,
[],
[],
],
'NSEC-MISSING-SIGNATURE-1' => [
1,
q(nsec-missing-signature-1.dnssec10.xa),
[ qw( DS10_NSEC_MISSING_SIGNATURE DS10_HAS_NSEC ) ],
undef,
[],
[],
],
'NSEC-NODATA-MISSING-SOA-1' => [
1,
q(nsec-nodata-missing-soa-1.dnssec10.xa),
[ qw( DS10_NSEC_NODATA_MISSING_SOA DS10_HAS_NSEC ) ],
undef,
[],
[],
],
'NSEC-NODATA-WRONG-SOA-1' => [
1,
q(nsec-nodata-wrong-soa-1.dnssec10.xa),
[ qw( DS10_NSEC_NODATA_WRONG_SOA DS10_HAS_NSEC ) ],
undef,
[],
[],
],
'NSEC-NO-VERIFIED-SIGNATURE-1' => [
1,
q(nsec-no-verified-signature-1.dnssec10.xa),
[ qw( DS10_NSEC_NO_VERIFIED_SIGNATURE DS10_HAS_NSEC DS10_NSEC_RRSIG_NO_DNSKEY ) ],
undef,
[],
[],
],
'NSEC-NO-VERIFIED-SIGNATURE-2' => [
1,
q(nsec-no-verified-signature-2.dnssec10.xa),
[ qw( DS10_NSEC_NO_VERIFIED_SIGNATURE DS10_HAS_NSEC DS10_NSEC_RRSIG_EXPIRED ) ],
undef,
[],
[],
],
'NSEC-NO-VERIFIED-SIGNATURE-3' => [
1,
q(nsec-no-verified-signature-3.dnssec10.xa),
[ qw( DS10_NSEC_NO_VERIFIED_SIGNATURE DS10_HAS_NSEC DS10_NSEC_RRSIG_NOT_YET_VALID ) ],
undef,
[],
[],
],
'NSEC-NO-VERIFIED-SIGNATURE-4' => [
1,
q(nsec-no-verified-signature-4.dnssec10.xa),
[ qw( DS10_NSEC_NO_VERIFIED_SIGNATURE DS10_HAS_NSEC DS10_NSEC_RRSIG_VERIFY_ERROR ) ],
undef,
[],
[],
],
'NSEC-QUERY-RESPONSE-ERR-1' => [
1,
q(nsec-query-response-err-1.dnssec10.xa),
[ qw( DS10_NSEC_QUERY_RESPONSE_ERR DS10_HAS_NSEC DS10_INCONSISTENT_NSEC ) ],
undef,
[],
[],
],
'NSEC-QUERY-RESPONSE-ERR-2' => [
1,
q(nsec-query-response-err-2.dnssec10.xa),
[ qw( DS10_NSEC_QUERY_RESPONSE_ERR DS10_HAS_NSEC DS10_INCONSISTENT_NSEC ) ],
undef,
[],
[],
],
'NSEC-QUERY-RESPONSE-ERR-3' => [
0,
q(nsec-query-response-err-3.dnssec10.xa),
[ qw( DS10_NSEC_QUERY_RESPONSE_ERR DS10_EXPECTED_NSEC_NSEC3_MISSING DS10_INCONSISTENT_NSEC ) ],
undef,
[],
[],
],
'SERVER-NO-DNSSEC-1' => [
1,
q(server-no-dnssec-1.dnssec10.xa),
[ qw( DS10_SERVER_NO_DNSSEC DS10_HAS_NSEC ) ],
undef,
[],
[],
],
'SERVER-NO-DNSSEC-2' => [
1,
q(server-no-dnssec-2.dnssec10.xa),
[ qw( DS10_SERVER_NO_DNSSEC DS10_HAS_NSEC3 ) ],
undef,
[],
[],
],
'ZONE-NO-DNSSEC-1' => [
1,
q(zone-no-dnssec-1.dnssec10.xa),
[ qw( DS10_ZONE_NO_DNSSEC ) ],
undef,
[],
[],
],
);
###########
my $datafile = 't/' . basename ($0, '.t') . '.data';
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
Zonemaster::Engine::Profile->effective->merge( Zonemaster::Engine::Profile->from_json( qq({ "test_cases": [ "$test_case" ] }) ) );
perform_testcase_testing( $test_case, $test_module, \@all_tags, \%subtests, $ENV{ZONEMASTER_SELECTED_SCENARIOS}, $ENV{ZONEMASTER_DISABLED_SCENARIOS} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,186 @@
use strict;
use warnings;
use Test::More;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Nameserver} );
use_ok( q{Zonemaster::Engine::Test::DNSSEC} );
use_ok( q{TestUtil}, qw( perform_testcase_testing ) );
}
###########
# dnssec16 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/DNSSEC-TP/dnssec16.md
my $test_module = q{DNSSEC};
my $test_case = 'dnssec16';
my @all_tags = qw(DS16_CDS_INVALID_RRSIG
DS16_CDS_MATCHES_NON_SEP_DNSKEY
DS16_CDS_MATCHES_NON_ZONE_DNSKEY
DS16_CDS_MATCHES_NO_DNSKEY
DS16_CDS_NOT_SIGNED_BY_CDS
DS16_CDS_SIGNED_BY_UNKNOWN_DNSKEY
DS16_CDS_UNSIGNED
DS16_CDS_WITHOUT_DNSKEY
DS16_DELETE_CDS
DS16_DNSKEY_NOT_SIGNED_BY_CDS
DS16_MIXED_DELETE_CDS);
# Common hint file (test-zone-data/COMMON/hintfile)
Zonemaster::Engine::Recursor->remove_fake_addresses( '.' );
Zonemaster::Engine::Recursor->add_fake_addresses( '.',
{ 'ns1' => [ '127.1.0.1', 'fda1:b2:c3::127:1:0:1' ],
'ns2' => [ '127.1.0.2', 'fda1:b2:c3::127:1:0:2' ],
}
);
# Test zone scenarios
# - Documentation: L<TestUtil/perform_testcase_testing()>
# - Format: { SCENARIO_NAME => [
# testable,
# zone_name,
# [ MANDATORY_MESSAGE_TAGS ],
# [ FORBIDDEN_MESSAGE_TAGS ],
# [ UNDELEGATED_NS ],
# [ UNDELEGATED_DS ],
# ] }
#
# - One of MANDATORY_MESSAGE_TAGS and FORBIDDEN_MESSAGE_TAGS may be undefined.
# See documentation for the meaning of that.
my %subtests = (
'CDS-INVALID-RRSIG' => [
1,
q(cds-invalid-rrsig.dnssec16.xa),
[ qw(DS16_CDS_INVALID_RRSIG) ],
undef,
[],
[]
],
'CDS-MATCHES-NO-DNSKEY' => [
1,
q(cds-matches-no-dnskey.dnssec16.xa),
[ qw(DS16_CDS_MATCHES_NO_DNSKEY) ],
undef,
[],
[]
],
'CDS-MATCHES-NON-SEP-DNSKEY' => [
1,
q(cds-matches-non-sep-dnskey.dnssec16.xa),
[ qw(DS16_CDS_MATCHES_NON_SEP_DNSKEY) ],
undef,
[],
[]
],
'CDS-MATCHES-NON-ZONE-DNSKEY' => [
1,
q(cds-matches-non-zone-dnskey.dnssec16.xa),
[ qw(DS16_CDS_MATCHES_NON_ZONE_DNSKEY) ],
undef,
[],
[]
],
'CDS-NOT-SIGNED-BY-CDS' => [
1,
q(cds-not-signed-by-cds.dnssec16.xa),
[ qw(DS16_CDS_NOT_SIGNED_BY_CDS) ],
undef,
[],
[]
],
'CDS-SIGNED-BY-UNKNOWN-DNSKEY' => [
1,
q(cds-signed-by-unknown-dnskey.dnssec16.xa),
[ qw(DS16_CDS_SIGNED_BY_UNKNOWN_DNSKEY) ],
undef,
[],
[]
],
'CDS-UNSIGNED' => [
1,
q(cds-unsigned.dnssec16.xa),
[ qw(DS16_CDS_UNSIGNED DS16_CDS_NOT_SIGNED_BY_CDS) ],
undef,
[],
[]
],
'CDS-WITHOUT-DNSKEY' => [
1,
q(cds-without-dnskey.dnssec16.xa),
[ qw(DS16_CDS_WITHOUT_DNSKEY) ],
undef,
[],
[]
],
'DELETE-CDS' => [
1,
q(delete-cds.dnssec16.xa),
[ qw(DS16_DELETE_CDS) ],
undef,
[],
[]
],
'DNSKEY-NOT-SIGNED-BY-CDS' => [
1,
q(dnskey-not-signed-by-cds.dnssec16.xa),
[ qw(DS16_DNSKEY_NOT_SIGNED_BY_CDS) ],
undef,
[],
[]
],
'MIXED-DELETE-CDS' => [
1,
q(mixed-delete-cds.dnssec16.xa),
[ qw(DS16_MIXED_DELETE_CDS) ],
undef,
[],
[]
],
'NO-CDS' => [
1,
q(no-cds.dnssec16.xa),
[],
undef,
[],
[]
],
'NOT-AA' => [
1,
q(not-aa.dnssec16.xa),
[],
undef,
[],
[]
],
'VALID-CDS' => [
1,
q(valid-cds.dnssec16.xa),
[],
undef,
[],
[]
]
);
###########
my $datafile = 't/' . basename ($0, '.t') . '.data';
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
Zonemaster::Engine::Profile->effective->merge( Zonemaster::Engine::Profile->from_json( qq({ "test_cases": [ "$test_case" ] }) ) );
perform_testcase_testing( $test_case, $test_module, \@all_tags, \%subtests, $ENV{ZONEMASTER_SELECTED_SCENARIOS}, $ENV{ZONEMASTER_DISABLED_SCENARIOS} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,192 @@
use Test::More;
use Test::Differences;
use File::Slurp;
use List::MoreUtils qw[uniq none any];
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Nameserver} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $checking_module = q{Nameserver};
sub zone_gives {
my ( $test, $zone, $gives_ref ) = @_;
Zonemaster::Engine->logger->clear_history();
my @res = Zonemaster::Engine->test_method( $checking_module, $test, $zone );
foreach my $gives ( @{$gives_ref} ) {
ok( ( grep { $_->tag eq $gives } @res ), $zone->name->string . " gives $gives" );
}
return scalar( @res );
}
sub zone_gives_not {
my ( $test, $zone, $gives_ref ) = @_;
Zonemaster::Engine->logger->clear_history();
my @res = Zonemaster::Engine->test_method( $checking_module, $test, $zone );
foreach my $gives ( @{$gives_ref} ) {
ok( !( grep { $_->tag eq $gives } @res ), $zone->name->string . " does not give $gives" );
}
return scalar( @res );
}
my $datafile = q{t/Test-nameserver.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
my ($json, $profile_test);
my @testcases_with_network = (qw{nameserver01 nameserver02 nameserver06 nameserver07 nameserver08 nameserver09});
foreach my $testcase ( qw{nameserver01 nameserver02 nameserver03 nameserver04 nameserver05 nameserver06 nameserver07 nameserver08 nameserver09} ) {
next if grep { $_ eq $testcase } @testcases_with_network;
$json = read_file( 't/profiles/Test-'.$testcase.'-only.json' );
$profile_test = Zonemaster::Engine::Profile->from_json( $json );
Zonemaster::Engine::Profile->effective->merge( $profile_test );
my %testcases;
Zonemaster::Engine->logger->clear_history();
foreach my $result ( Zonemaster::Engine->test_module( q{nameserver}, q{afnic.fr} ) ) {
if ( $result->testcase && $result->testcase ne 'Unspecified' ) {
$testcases{$result->testcase} = 1;
}
}
eq_or_diff( [ map { lc $_ } keys %testcases ], [ $testcase ], 'expected test-case ('. $testcase .')' );
}
$json = read_file( 't/profiles/Test-nameserver-all.json' );
$profile_test = Zonemaster::Engine::Profile->from_json( $json );
Zonemaster::Engine::Profile->effective->merge( $profile_test );
my $zone;
my @res;
my %tag;
# nameserver01
$zone = Zonemaster::Engine->zone( 'fr' );
zone_gives( 'nameserver01', $zone, [q{NO_RECURSOR}] );
zone_gives_not( 'nameserver01', $zone, [q{IS_A_RECURSOR}] );
# nameserver02
$zone = Zonemaster::Engine->zone( 'flagday.rootcanary.net' );
zone_gives( 'nameserver02', $zone, ['BREAKS_ON_EDNS']);
$zone = Zonemaster::Engine->zone( 'dyad.se' );
zone_gives( 'nameserver02', $zone, ['EDNS0_SUPPORT'] );
# nameserver03
$zone = Zonemaster::Engine->zone( 'nameserver03-axfr-failure.zut-root.rd.nic.fr' );
zone_gives( 'nameserver03', $zone, [q{AXFR_FAILURE}] );
zone_gives_not( 'nameserver03', $zone, [q{AXFR_AVAILABLE}] );
# nameserver04
$zone = Zonemaster::Engine->zone( 'afnic.fr' );
zone_gives( 'nameserver04', $zone, [q{SAME_SOURCE_IP}] );
# nameserver05
$zone = Zonemaster::Engine->zone( 'afnic.fr' );
zone_gives( 'nameserver05', $zone, [q{AAAA_WELL_PROCESSED}] );
SKIP: {
skip "Zone does not actually have tested problem", 1,
$zone = Zonemaster::Engine->zone( 'uddevallafiber.se' );
zone_gives( 'nameserver05', $zone, ['QUERY_DROPPED'] );
}
# nameserver06
$zone = Zonemaster::Engine->zone( 'nameserver06-can-not-be-resolved.zut-root.rd.nic.fr' );
zone_gives( 'nameserver06', $zone, [q{CAN_NOT_BE_RESOLVED}] );
$zone = Zonemaster::Engine->zone( 'nameserver06-no-resolution.zut-root.rd.nic.fr' );
zone_gives( 'nameserver06', $zone, [q{NO_RESOLUTION}] );
$zone = Zonemaster::Engine->zone( 'nameserver06-can-be-resolved.zut-root.rd.nic.fr' );
zone_gives( 'nameserver06', $zone, [q{CAN_BE_RESOLVED}] );
# nameserver07
$zone = Zonemaster::Engine->zone( '.' );
zone_gives( 'nameserver07', $zone, [q{UPWARD_REFERRAL_IRRELEVANT}] );
zone_gives_not( 'nameserver07', $zone, [qw{UPWARD_REFERRAL NO_UPWARD_REFERRAL}] );
# nameserver{08,09,10} -- no unit tests yet, see https://github.com/zonemaster/zonemaster-engine/issues/1146
# nameserver11
$zone = Zonemaster::Engine->zone( 'bemacom.se' );
zone_gives( 'nameserver11', $zone, [q{N11_UNEXPECTED_RCODE}] );
zone_gives_not( 'nameserver11', $zone, [qw{N11_NO_EDNS N11_NO_RESPONSE N11_RETURNS_UNKNOWN_OPTION_CODE N11_UNEXPECTED_ANSWER_SECTION N11_UNSET_AA}] );
# nameserver{12,13,14} -- no unit tests yet, see https://github.com/zonemaster/zonemaster-engine/issues/1146
# nameserver15 -- see t/Test-nameserver15.t instead.
SKIP: {
skip "Zone does not actually have tested problem", 1,
$zone = Zonemaster::Engine->zone( 'escargot.se' );
zone_gives( 'nameserver05', $zone, ['AAAA_UNEXPECTED_RCODE'] );
}
TODO: {
local $TODO = "Need to find/create zones with that error";
# nameserver04
ok( $tag{DIFFERENT_SOURCE_IP}, q{DIFFERENT_SOURCE_IP} );
# nameserver07
ok( $tag{UPWARD_REFERRAL}, q{UPWARD_REFERRAL} );
ok( $tag{NO_UPWARD_REFERRAL}, q{NO_UPWARD_REFERRAL} );
# nameserver08
ok( $tag{QNAME_CASE_INSENSITIVE}, q{QNAME_CASE_INSENSITIVE} );
ok( $tag{QNAME_CASE_SENSITIVE}, q{QNAME_CASE_SENSITIVE} );
}
SKIP: {
# Default behaviour changed. It's always skipped unless we have network
# available.
skip 'no network', 2 if not $ENV{ZONEMASTER_RECORD};
# AXFR results not well cached. Cannot test cases where AXFR is available
# without network, even in case of ZONEMASTER_RECORD is not set.
# $zone = Zonemaster::Engine->zone( 'nameserver03-axfr-available.zut-root.rd.nic.fr' );
# zone_gives( 'nameserver03', $zone, [q{AXFR_AVAILABLE}] );
$zone = Zonemaster::Engine->zone( 'arpa' );
zone_gives( 'nameserver03', $zone, [q{AXFR_AVAILABLE}] );
zone_gives( 'nameserver03', $zone, [q{AXFR_FAILURE}] );
}
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
Zonemaster::Engine::Profile->effective->set( q{no_network}, 0 );
Zonemaster::Engine::Profile->effective->set( q{net.ipv4}, 0 );
Zonemaster::Engine::Profile->effective->set( q{net.ipv6}, 0 );
$zone = Zonemaster::Engine->zone( 'fr' );
zone_gives( 'nameserver01', $zone, [q{NO_NETWORK}] );
zone_gives_not( 'nameserver01', $zone, [qw{NO_RECURSOR IS_A_RECURSOR}] );
$zone = Zonemaster::Engine->zone( 'perennaguiden.se' );
zone_gives( 'nameserver02', $zone, [q{NO_NETWORK}] );
zone_gives_not( 'nameserver02', $zone, [qw{EDNS0_BAD_ANSWER EDNS0_BAD_QUERY EDNS0_SUPPORT}] );
$zone = Zonemaster::Engine->zone( 'nameserver03-axfr-failure.zut-root.rd.nic.fr' );
zone_gives( 'nameserver03', $zone, [q{NO_NETWORK}] );
zone_gives_not( 'nameserver03', $zone, [qw{AXFR_FAILURE AXFR_AVAILABLE}] );
$zone = Zonemaster::Engine->zone( 'afnic.fr' );
zone_gives( 'nameserver04', $zone, [q{NO_NETWORK}] );
zone_gives_not( 'nameserver04', $zone, [qw{SAME_SOURCE_IP DIFFERENT_SOURCE_IP}] );
zone_gives( 'nameserver05', $zone, [q{NO_NETWORK}] );
zone_gives_not( 'nameserver05', $zone, [qw{IPV6_DISABLED IPV4_DISABLED}] );
$zone = Zonemaster::Engine->zone( 'nameserver06-can-not-be-resolved.zut-root.rd.nic.fr' );
zone_gives( 'nameserver06', $zone, [q{NO_NETWORK}] );
zone_gives_not( 'nameserver06', $zone, [qw{CAN_NOT_BE_RESOLVED NO_RESOLUTION CAN_BE_RESOLVED}] );
$zone = Zonemaster::Engine->zone( '.' );
zone_gives( 'nameserver07', $zone, [q{NO_NETWORK}] );
zone_gives_not( 'nameserver07', $zone, [qw{UPWARD_REFERRAL_IRRELEVANT UPWARD_REFERRAL NO_UPWARD_REFERRAL}] );
zone_gives( 'nameserver08', $zone, [q{NO_NETWORK}] );
zone_gives_not( 'nameserver08', $zone, [qw{QNAME_CASE_INSENSITIVE QNAME_CASE_SENSITIVE}] );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,37 @@
use Test::More;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Nameserver} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-nameserver01-A.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine->profile->set( q{no_network}, 1 );
}
Zonemaster::Engine->add_fake_delegation(
'a.nameserver01.exempelvis.se' => {
'ns1.a.nameserver01.exempelvis.se' => [ '46.21.97.97', '2a02:750:12:77::97' ],
'ns2.a.nameserver01.exempelvis.se' => [ '194.18.226.122', '2001:2040:2b:1c13::53' ],
},
fill_in_empty_oob_glue => 0,
);
my $zone = Zonemaster::Engine->zone( q{a.nameserver01.exempelvis.se} );
my %res = map { $_->tag => $_ } Zonemaster::Engine::Test::Nameserver->nameserver01( $zone );
ok( $res{NO_RESPONSE}, q{should emit NO_RESPONSE} );
ok( !$res{IS_A_RECURSOR}, q{should not emit IS_A_RECURSOR} );
ok( $res{NO_RECURSOR}, q{should emit NO_RECURSOR} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,37 @@
use Test::More;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Nameserver} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-nameserver01-B.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine->profile->set( q{no_network}, 1 );
}
Zonemaster::Engine->add_fake_delegation(
'b.nameserver01.exempelvis.se' => {
'ns1.b.nameserver01.exempelvis.se' => [ '46.21.97.97', '2a02:750:12:77::97' ],
'ns2.b.nameserver01.exempelvis.se' => [ '194.18.226.122', '2001:2040:2b:1c13::53' ],
},
fill_in_empty_oob_glue => 0,
);
my $zone = Zonemaster::Engine->zone( q{b.nameserver01.exempelvis.se} );
my %res = map { $_->tag => $_ } Zonemaster::Engine::Test::Nameserver->nameserver01( $zone );
ok( !$res{NO_RESPONSE}, q{should not emit NO_RESPONSE} );
ok( $res{IS_A_RECURSOR}, q{should emit IS_A_RECURSOR} );
ok( $res{NO_RECURSOR}, q{should emit NO_RECURSOR} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,37 @@
use Test::More;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Nameserver} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-nameserver01-C.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine->profile->set( q{no_network}, 1 );
}
Zonemaster::Engine->add_fake_delegation(
'c.nameserver01.exempelvis.se' => {
'ns1.c.nameserver01.exempelvis.se' => [ '46.21.97.97', '2a02:750:12:77::97' ],
'ns2.c.nameserver01.exempelvis.se' => [ '194.18.226.122', '2001:2040:2b:1c13::53' ],
},
fill_in_empty_oob_glue => 0,
);
my $zone = Zonemaster::Engine->zone( q{c.nameserver01.exempelvis.se} );
my %res = map { $_->tag => $_ } Zonemaster::Engine::Test::Nameserver->nameserver01( $zone );
ok( !$res{NO_RESPONSE}, q{should not emit NO_RESPONSE} );
ok( !$res{IS_A_RECURSOR}, q{should not emit IS_A_RECURSOR} );
ok( $res{NO_RECURSOR}, q{should emit NO_RECURSOR} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,37 @@
use Test::More;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Nameserver} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-nameserver01-D.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine->profile->set( q{no_network}, 1 );
}
Zonemaster::Engine->add_fake_delegation(
'd.nameserver01.exempelvis.se' => {
'resolver1.exempelvis.se' => ['8.8.8.8'],
'resolver2.exempelvis.se' => ['9.9.9.9'],
},
fill_in_empty_oob_glue => 0,
);
my $zone = Zonemaster::Engine->zone( q{d.nameserver01.exempelvis.se} );
my %res = map { $_->tag => $_ } Zonemaster::Engine::Test::Nameserver->nameserver01( $zone );
ok( !$res{NO_RESPONSE}, q{should not emit NO_RESPONSE} );
ok( $res{IS_A_RECURSOR}, q{should emit IS_A_RECURSOR} );
ok( !$res{NO_RECURSOR}, q{should not emit NO_RECURSOR} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,163 @@
use strict;
use warnings;
use Test::More;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Nameserver} );
use_ok( q{Zonemaster::Engine::Test::Nameserver} );
use_ok( q{TestUtil}, qw( perform_testcase_testing ) );
}
###########
# nameserver15 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/Nameserver-TP/nameserver15.md
my $test_module = 'Nameserver';
my $test_case = 'nameserver15';
my @all_tags = qw(N15_NO_VERSION_REVEALED
N15_ERROR_ON_VERSION_QUERY
N15_SOFTWARE_VERSION
N15_WRONG_CLASS);
# Common hint file (test-zone-data/COMMON/hintfile)
Zonemaster::Engine::Recursor->remove_fake_addresses( '.' );
Zonemaster::Engine::Recursor->add_fake_addresses( '.',
{ 'ns1' => [ '127.1.0.1', 'fda1:b2:c3::127:1:0:1' ],
'ns2' => [ '127.1.0.2', 'fda1:b2:c3::127:1:0:2' ],
}
);
# Test zone scenarios
# - Documentation: L<TestUtil/perform_testcase_testing()>
# - Format: { SCENARIO_NAME => [
# testable,
# zone_name,
# [ MANDATORY_MESSAGE_TAGS ],
# [ FORBIDDEN_MESSAGE_TAGS ],
# [ UNDELEGATED_NS ],
# [ UNDELEGATED_DS ],
# ] }
#
# - One of MANDATORY_MESSAGE_TAGS and FORBIDDEN_MESSAGE_TAGS may be undefined.
# See documentation for the meaning of that.
my %subtests = (
'NO-VERSION-REVEALED-1' => [
1,
q(no-version-revealed-1.nameserver15.xa),
[ qw(N15_NO_VERSION_REVEALED) ],
undef,
[],
[]
],
'NO-VERSION-REVEALED-2' => [
1,
q(no-version-revealed-2.nameserver15.xa),
[ qw(N15_NO_VERSION_REVEALED) ],
undef,
[],
[]
],
'NO-VERSION-REVEALED-3' => [
1,
q(no-version-revealed-3.nameserver15.xa),
[ qw(N15_NO_VERSION_REVEALED) ],
undef,
[],
[]
],
'NO-VERSION-REVEALED-4' => [
1,
q(no-version-revealed-4.nameserver15.xa),
[ qw(N15_NO_VERSION_REVEALED) ],
undef,
[],
[]
],
'NO-VERSION-REVEALED-5' => [
1,
q(no-version-revealed-5.nameserver15.xa),
[ qw(N15_NO_VERSION_REVEALED) ],
undef,
[],
[]
],
'NO-VERSION-REVEALED-6' => [
1,
q(no-version-revealed-6.nameserver15.xa),
[ qw(N15_NO_VERSION_REVEALED) ],
undef,
[],
[]
],
'ERROR-ON-VERSION-QUERY-1' => [
1,
q(error-on-version-query-1.nameserver15.xa),
[ qw(N15_ERROR_ON_VERSION_QUERY N15_NO_VERSION_REVEALED) ],
undef,
[],
[]
],
'ERROR-ON-VERSION-QUERY-2' => [
1,
q(error-on-version-query-2.nameserver15.xa),
[ qw(N15_ERROR_ON_VERSION_QUERY N15_NO_VERSION_REVEALED) ],
undef,
[],
[]
],
'SOFTWARE-VERSION-1' => [
1,
q(software-version-1.nameserver15.xa),
[ qw(N15_SOFTWARE_VERSION) ],
undef,
[],
[]
],
'SOFTWARE-VERSION-2' => [
1,
q(software-version-2.nameserver15.xa),
[ qw(N15_SOFTWARE_VERSION) ],
undef,
[],
[]
],
'WRONG-CLASS-1' => [
1,
q(wrong-class-1.nameserver15.xa),
[ qw(N15_SOFTWARE_VERSION N15_WRONG_CLASS) ],
undef,
[],
[]
],
'WRONG-CLASS-2' => [
1,
q(wrong-class-2.nameserver15.xa),
[ qw(N15_SOFTWARE_VERSION N15_WRONG_CLASS) ],
undef,
[],
[]
]
);
###########
my $datafile = 't/' . basename ($0, '.t') . '.data';
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
Zonemaster::Engine::Profile->effective->merge( Zonemaster::Engine::Profile->from_json( qq({ "test_cases": [ "$test_case" ] }) ) );
perform_testcase_testing( $test_case, $test_module, \@all_tags, \%subtests, $ENV{ZONEMASTER_SELECTED_SCENARIOS}, $ENV{ZONEMASTER_DISABLED_SCENARIOS} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,144 @@
use Test::More;
use Test::Differences;
use File::Slurp;
use List::MoreUtils qw[uniq none any];
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Nameserver} );
use_ok( q{Zonemaster::Engine::DNSName} );
use_ok( q{Zonemaster::Engine::Zone} );
use_ok( q{Zonemaster::Engine::Test::Syntax} );
}
sub zone_gives {
my ( $test, $zone, $gives ) = @_;
my @res = Zonemaster::Engine->test_method( q{Syntax}, $test, $zone );
ok( ( grep { $_->tag eq $gives } @res ), $zone->name->string . " gives $gives" );
}
sub zone_gives_not {
my ( $test, $zone, $gives ) = @_;
my @res = Zonemaster::Engine->test_method( q{Syntax}, $test, $zone );
ok( !( grep { $_->tag eq $gives } @res ), $zone->name->string . " does not give $gives" );
}
my $datafile = q{t/Test-syntax.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
# Find a way with dependences for syntax04 syntax05 syntax06 syntax07 syntax08
my ($json, $profile_test);
foreach my $testcase ( qw{syntax01 syntax02 syntax03} ) {
$json = read_file( 't/profiles/Test-'.$testcase.'-only.json' );
$profile_test = Zonemaster::Engine::Profile->from_json( $json );
Zonemaster::Engine::Profile->effective->merge( $profile_test );
my %testcases;
foreach my $result ( Zonemaster::Engine->test_module( q{syntax}, q{afnic.fr} ) ) {
if ( $result->testcase && $result->testcase ne 'Unspecified' ) {
$testcases{$result->testcase} = 1;
}
}
eq_or_diff( [ map { lc $_ } keys %testcases ], [ $testcase ], 'expected test-case ('. $testcase .')' );
}
$json = read_file( 't/profiles/Test-syntax-all.json' );
$profile_test = Zonemaster::Engine::Profile->from_json( $json );
Zonemaster::Engine::Profile->effective->merge( $profile_test );
my $ns_ok = Zonemaster::Engine->zone( q{ns1.nic.fr} );
my $dn_ok = Zonemaster::Engine->zone( q{www.nic.se} );
my $dn_ko = Zonemaster::Engine->zone( q{www.nic&nac.se} );
zone_gives( q{syntax01}, $dn_ok, q{ONLY_ALLOWED_CHARS} );
zone_gives_not( q{syntax01}, $dn_ko, q{ONLY_ALLOWED_CHARS} );
zone_gives( q{syntax01}, $dn_ko, q{NON_ALLOWED_CHARS} );
zone_gives_not( q{syntax01}, $dn_ok, q{NON_ALLOWED_CHARS} );
$dn_ko = Zonemaster::Engine->zone( q{www.-nic.se} );
zone_gives( q{syntax02}, $dn_ko, q{INITIAL_HYPHEN} );
zone_gives_not( q{syntax02}, $dn_ko, q{NO_ENDING_HYPHENS} );
zone_gives_not( q{syntax02}, $dn_ok, q{INITIAL_HYPHEN} );
zone_gives( q{syntax02}, $dn_ok, q{NO_ENDING_HYPHENS} );
$dn_ko = Zonemaster::Engine->zone( q{www.nic-.se} );
zone_gives( q{syntax02}, $dn_ko, q{TERMINAL_HYPHEN} );
zone_gives_not( q{syntax02}, $dn_ko, q{NO_ENDING_HYPHENS} );
zone_gives_not( q{syntax02}, $dn_ok, q{TERMINAL_HYPHEN} );
my $dn_idn_ok = Zonemaster::Engine->zone( q{www.xn--nic.se} );
$dn_ko = Zonemaster::Engine->zone( q{www.ni--c.se} );
zone_gives( q{syntax03}, $dn_ko, q{DISCOURAGED_DOUBLE_DASH} );
zone_gives_not( q{syntax03}, $dn_ko, q{NO_DOUBLE_DASH} );
zone_gives_not( q{syntax03}, $dn_ok, q{DISCOURAGED_DOUBLE_DASH} );
zone_gives_not( q{syntax03}, $dn_idn_ok, q{DISCOURAGED_DOUBLE_DASH} );
zone_gives( q{syntax03}, $dn_ok, q{NO_DOUBLE_DASH} );
zone_gives( q{syntax03}, $dn_idn_ok, q{NO_DOUBLE_DASH} );
my $zone_double_dash = Zonemaster::Engine->zone( q{ns1.ns--nic.fr} );
zone_gives_not( q{syntax04}, $ns_ok, q{NAMESERVER_DISCOURAGED_DOUBLE_DASH} );
zone_gives_not( q{syntax04}, $zone_double_dash, q{NAMESERVER_DISCOURAGED_DOUBLE_DASH} );
SKIP: {
skip "need test zone", 1;
my $ns_num_tld; # TODO specify test zone
zone_gives( q{syntax04}, $ns_num_tld, q{NAMESERVER_NUMERIC_TLD} );
}
my $zone_num_tld = Zonemaster::Engine->zone( q{ns1.nic.47} );
zone_gives_not( q{syntax04}, $ns_ok, q{NAMESERVER_NUMERIC_TLD} );
zone_gives_not( q{syntax04}, $zone_num_tld, q{NAMESERVER_NUMERIC_TLD} );
SKIP: {
skip "need test zone", 1;
my $ns_double_dash; # TODO specify test zone
zone_gives( q{syntax04}, $ns_double_dash, q{NAMESERVER_DISCOURAGED_DOUBLE_DASH} );
}
my %res;
my $zone;
$zone = Zonemaster::Engine->zone( q{afnic.fr} );
zone_gives( q{syntax05}, $zone, q{RNAME_NO_AT_SIGN} );
zone_gives_not( q{syntax05}, $zone, q{RNAME_MISUSED_AT_SIGN} );
zone_gives( q{syntax06}, $zone, q{RNAME_RFC822_VALID} );
zone_gives_not( q{syntax06}, $zone, q{RNAME_RFC822_INVALID} );
zone_gives_not( q{syntax06}, $zone, q{NO_RESPONSE_SOA_QUERY} );
zone_gives_not( q{syntax06}, $zone, q{RNAME_MAIL_ILLEGAL_CNAME} );
zone_gives_not( q{syntax06}, $zone, q{RNAME_MAIL_DOMAIN_LOCALHOST} );
zone_gives_not( q{syntax07}, $zone, q{MNAME_DISCOURAGED_DOUBLE_DASH} );
zone_gives_not( q{syntax07}, $zone, q{MNAME_NUMERIC_TLD} );
zone_gives_not( q{syntax07}, $zone, q{NO_RESPONSE_SOA_QUERY} );
zone_gives_not( q{syntax08}, $zone, q{MX_DISCOURAGED_DOUBLE_DASH} );
zone_gives_not( q{syntax08}, $zone, q{MX_NUMERIC_TLD} );
zone_gives_not( q{syntax08}, $zone, q{NO_RESPONSE_MX_QUERY} );
$zone = Zonemaster::Engine->zone( q{syntax01.zut-root.rd.nic.fr} );
zone_gives( q{syntax05}, $zone, q{RNAME_MISUSED_AT_SIGN} );
zone_gives_not( q{syntax05}, $zone, q{RNAME_NO_AT_SIGN} );
zone_gives_not( q{syntax06}, $zone, q{RNAME_RFC822_VALID} );
zone_gives( q{syntax06}, $zone, q{RNAME_RFC822_INVALID} );
zone_gives_not( q{syntax06}, $zone, q{NO_RESPONSE} );
zone_gives_not( q{syntax06}, $zone, q{NO_RESPONSE_SOA_QUERY} );
zone_gives_not( q{syntax06}, $zone, q{RNAME_MAIL_ILLEGAL_CNAME} );
zone_gives_not( q{syntax06}, $zone, q{RNAME_MAIL_DOMAIN_LOCALHOST} );
zone_gives( q{syntax07}, $zone, q{MNAME_DISCOURAGED_DOUBLE_DASH} );
zone_gives( q{syntax07}, $zone, q{MNAME_NUMERIC_TLD} );
zone_gives( q{syntax08}, $zone, q{MX_NUMERIC_TLD} );
zone_gives( q{syntax08}, $zone, q{MX_DISCOURAGED_DOUBLE_DASH} );
zone_gives_not( q{syntax08}, $zone, q{NO_RESPONSE_MX_QUERY} );
$zone = Zonemaster::Engine->zone( 'name.doesnotexist' );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Syntax}, q{syntax05}, $zone );
ok( $res{NO_RESPONSE_SOA_QUERY}, q{No response from nameserver(s) on SOA queries} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Syntax}, q{syntax07}, $zone );
ok( $res{NO_RESPONSE_SOA_QUERY}, q{No response from nameserver(s) on SOA queries} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,41 @@
use Test::More;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Syntax} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-syntax06-A.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine->profile->set( q{no_network}, 1 );
}
Zonemaster::Engine->add_fake_delegation(
'a.syntax06.exempelvis.se' => {
'ns1.a.syntax06.exempelvis.se' => [ '46.21.97.97', '2a02:750:12:77::97' ],
'ns2.a.syntax06.exempelvis.se' => [ '194.18.226.122', '2001:2040:2b:1c13::53' ],
},
fill_in_empty_oob_glue => 0,
);
my $zone = Zonemaster::Engine->zone( q{a.syntax06.exempelvis.se} );
my %res = map { $_->tag => $_ } Zonemaster::Engine::Test::Syntax->syntax06( $zone );
ok( !$res{NO_RESPONSE}, q{should not emit NO_RESPONSE} );
ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} );
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( !$res{RNAME_MAIL_DOMAIN_INVALID}, q{should not emit RNAME_MAIL_DOMAIN_INVALID} );
ok( $res{RNAME_RFC822_VALID}, q{should emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,41 @@
use Test::More;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Syntax} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-syntax06-B.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine->profile->set( q{no_network}, 1 );
}
Zonemaster::Engine->add_fake_delegation(
'b.syntax06.exempelvis.se' => {
'drip.ip.se' => ['192.0.2.1'],
'drop.ip.se' => ['192.0.2.2'],
},
fill_in_empty_oob_glue => 0,
);
my $zone = Zonemaster::Engine->zone( q{b.syntax06.exempelvis.se} );
my %res = map { $_->tag => $_ } Zonemaster::Engine::Test::Syntax->syntax06( $zone );
ok( $res{NO_RESPONSE}, q{should emit NO_RESPONSE} );
ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} );
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( !$res{RNAME_MAIL_DOMAIN_INVALID}, q{should not emit RNAME_MAIL_DOMAIN_INVALID} );
ok( !$res{RNAME_RFC822_VALID}, q{should not emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,41 @@
use Test::More;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Syntax} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-syntax06-C.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine->profile->set( q{no_network}, 1 );
}
Zonemaster::Engine->add_fake_delegation(
'c.syntax06.exempelvis.se' => {
'ns1.c.syntax06.exempelvis.se' => [ '46.21.97.97', '2a02:750:12:77::97' ],
'ns2.c.syntax06.exempelvis.se' => [ '194.18.226.122', '2001:2040:2b:1c13::53' ],
},
fill_in_empty_oob_glue => 0,
);
my $zone = Zonemaster::Engine->zone( q{c.syntax06.exempelvis.se} );
my %res = map { $_->tag => $_ } Zonemaster::Engine::Test::Syntax->syntax06( $zone );
ok( !$res{NO_RESPONSE}, q{should not emit NO_RESPONSE} );
ok( $res{NO_RESPONSE_SOA_QUERY}, q{should emit NO_RESPONSE_SOA_QUERY} );
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( !$res{RNAME_MAIL_DOMAIN_INVALID}, q{should not emit RNAME_MAIL_DOMAIN_INVALID} );
ok( !$res{RNAME_RFC822_VALID}, q{should not emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,41 @@
use Test::More;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Syntax} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-syntax06-D.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine->profile->set( q{no_network}, 1 );
}
Zonemaster::Engine->add_fake_delegation(
'd.syntax06.exempelvis.se' => {
'ns1.d.syntax06.exempelvis.se' => [ '46.21.97.97', '2a02:750:12:77::97' ],
'ns2.d.syntax06.exempelvis.se' => [ '194.18.226.122', '2001:2040:2b:1c13::53' ],
},
fill_in_empty_oob_glue => 0,
);
my $zone = Zonemaster::Engine->zone( q{d.syntax06.exempelvis.se} );
my %res = map { $_->tag => $_ } Zonemaster::Engine::Test::Syntax->syntax06( $zone );
ok( !$res{NO_RESPONSE}, q{should not emit NO_RESPONSE} );
ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} );
ok( $res{RNAME_RFC822_INVALID}, q{should emit RNAME_RFC822_INVALID} );
ok( !$res{RNAME_MAIL_DOMAIN_INVALID}, q{should not emit RNAME_MAIL_DOMAIN_INVALID} );
ok( !$res{RNAME_RFC822_VALID}, q{should not emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,41 @@
use Test::More;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Syntax} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-syntax06-E.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine->profile->set( q{no_network}, 1 );
}
Zonemaster::Engine->add_fake_delegation(
'e.syntax06.exempelvis.se' => {
'ns1.e.syntax06.exempelvis.se' => [ '46.21.97.97', '2a02:750:12:77::97' ],
'ns2.e.syntax06.exempelvis.se' => [ '194.18.226.122', '2001:2040:2b:1c13::53' ],
},
fill_in_empty_oob_glue => 0,
);
my $zone = Zonemaster::Engine->zone( q{e.syntax06.exempelvis.se} );
my %res = map { $_->tag => $_ } Zonemaster::Engine::Test::Syntax->syntax06( $zone );
ok( !$res{NO_RESPONSE}, q{should not emit NO_RESPONSE} );
ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} );
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( $res{RNAME_MAIL_DOMAIN_INVALID}, q{should emit RNAME_MAIL_DOMAIN_INVALID} );
ok( !$res{RNAME_RFC822_VALID}, q{should not emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,41 @@
use Test::More;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Syntax} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-syntax06-F.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine->profile->set( q{no_network}, 1 );
}
Zonemaster::Engine->add_fake_delegation(
'f.syntax06.exempelvis.se' => {
'ns1.f.syntax06.exempelvis.se' => [ '46.21.97.97', '2a02:750:12:77::97' ],
'ns2.f.syntax06.exempelvis.se' => [ '194.18.226.122', '2001:2040:2b:1c13::53' ],
},
fill_in_empty_oob_glue => 0,
);
my $zone = Zonemaster::Engine->zone( q{f.syntax06.exempelvis.se} );
my %res = map { $_->tag => $_ } Zonemaster::Engine::Test::Syntax->syntax06( $zone );
ok( !$res{NO_RESPONSE}, q{should not emit NO_RESPONSE} );
ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} );
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( !$res{RNAME_MAIL_DOMAIN_INVALID}, q{should not emit RNAME_MAIL_DOMAIN_INVALID} );
ok( $res{RNAME_RFC822_VALID}, q{should emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,41 @@
use Test::More;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Syntax} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-syntax06-G.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine->profile->set( q{no_network}, 1 );
}
Zonemaster::Engine->add_fake_delegation(
'g.syntax06.exempelvis.se' => {
'ns1.g.syntax06.exempelvis.se' => [ '46.21.97.97', '2a02:750:12:77::97' ],
'ns2.g.syntax06.exempelvis.se' => [ '194.18.226.122', '2001:2040:2b:1c13::53' ],
},
fill_in_empty_oob_glue => 0,
);
my $zone = Zonemaster::Engine->zone( q{g.syntax06.exempelvis.se} );
my %res = map { $_->tag => $_ } Zonemaster::Engine::Test::Syntax->syntax06( $zone );
ok( !$res{NO_RESPONSE}, q{should not emit NO_RESPONSE} );
ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} );
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( $res{RNAME_MAIL_DOMAIN_INVALID}, q{should emit RNAME_MAIL_DOMAIN_INVALID} );
ok( !$res{RNAME_RFC822_VALID}, q{should not emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,41 @@
use Test::More;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Syntax} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-syntax06-I.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine->profile->set( q{no_network}, 1 );
}
Zonemaster::Engine->add_fake_delegation(
'i.syntax06.exempelvis.se' => {
'ns1.i.syntax06.exempelvis.se' => [ '46.21.97.97', '2a02:750:12:77::97' ],
'ns2.i.syntax06.exempelvis.se' => [ '194.18.226.122', '2001:2040:2b:1c13::53' ],
},
fill_in_empty_oob_glue => 0,
);
my $zone = Zonemaster::Engine->zone( q{i.syntax06.exempelvis.se} );
my %res = map { $_->tag => $_ } Zonemaster::Engine::Test::Syntax->syntax06( $zone );
ok( !$res{NO_RESPONSE}, q{should not emit NO_RESPONSE} );
ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} );
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( $res{RNAME_MAIL_DOMAIN_INVALID}, q{should emit RNAME_MAIL_DOMAIN_INVALID} );
ok( !$res{RNAME_RFC822_VALID}, q{should not emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( $res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should emit RNAME_MAIL_DOMAIN_LOCALHOST} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,41 @@
use Test::More;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Syntax} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-syntax06-J.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine->profile->set( q{no_network}, 1 );
}
Zonemaster::Engine->add_fake_delegation(
'j.syntax06.exempelvis.se' => {
'ns1.j.syntax06.exempelvis.se' => [ '46.21.97.97', '2a02:750:12:77::97' ],
'ns2.j.syntax06.exempelvis.se' => [ '194.18.226.122', '2001:2040:2b:1c13::53' ],
},
fill_in_empty_oob_glue => 0,
);
my $zone = Zonemaster::Engine->zone( q{j.syntax06.exempelvis.se} );
my %res = map { $_->tag => $_ } Zonemaster::Engine::Test::Syntax->syntax06( $zone );
ok( !$res{NO_RESPONSE}, q{should not emit NO_RESPONSE} );
ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} );
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( $res{RNAME_MAIL_DOMAIN_INVALID}, q{should emit RNAME_MAIL_DOMAIN_INVALID} );
ok( !$res{RNAME_RFC822_VALID}, q{should not emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( $res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should emit RNAME_MAIL_DOMAIN_LOCALHOST} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,41 @@
use Test::More;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Syntax} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-syntax06-K.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine->profile->set( q{no_network}, 1 );
}
Zonemaster::Engine->add_fake_delegation(
'k.syntax06.exempelvis.se' => {
'ns1.k.syntax06.exempelvis.se' => [ '46.21.97.97', '2a02:750:12:77::97' ],
'ns2.k.syntax06.exempelvis.se' => [ '194.18.226.122', '2001:2040:2b:1c13::53' ],
},
fill_in_empty_oob_glue => 0,
);
my $zone = Zonemaster::Engine->zone( q{k.syntax06.exempelvis.se} );
my %res = map { $_->tag => $_ } Zonemaster::Engine::Test::Syntax->syntax06( $zone );
ok( !$res{NO_RESPONSE}, q{should not emit NO_RESPONSE} );
ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} );
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( !$res{RNAME_MAIL_DOMAIN_INVALID}, q{should not emit RNAME_MAIL_DOMAIN_INVALID} );
ok( $res{RNAME_RFC822_VALID}, q{should emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,41 @@
use Test::More;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Syntax} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-syntax06-L.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine->profile->set( q{no_network}, 1 );
}
Zonemaster::Engine->add_fake_delegation(
'l.syntax06.exempelvis.se' => {
'ns1.l.syntax06.exempelvis.se' => [ '46.21.97.97', '2a02:750:12:77::97' ],
'ns2.l.syntax06.exempelvis.se' => [ '194.18.226.122', '2001:2040:2b:1c13::53' ],
},
fill_in_empty_oob_glue => 0,
);
my $zone = Zonemaster::Engine->zone( q{l.syntax06.exempelvis.se} );
my %res = map { $_->tag => $_ } Zonemaster::Engine::Test::Syntax->syntax06( $zone );
ok( !$res{NO_RESPONSE}, q{should not emit NO_RESPONSE} );
ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} );
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( !$res{RNAME_MAIL_DOMAIN_INVALID}, q{should not emit RNAME_MAIL_DOMAIN_INVALID} );
ok( $res{RNAME_RFC822_VALID}, q{should emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,169 @@
use Test::More;
use File::Slurp;
use Data::Dumper;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Nameserver} );
use_ok( q{Zonemaster::Engine::Test::Zone} );
}
my $datafile = q{t/Test-zone.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
my ($json, $profile_test);
$json = read_file( 't/profiles/Test-zone-all.json' );
$profile_test = Zonemaster::Engine::Profile->from_json( $json );
Zonemaster::Engine::Profile->effective->merge( $profile_test );
my %res;
my $zone;
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{Zone}, q{afnic.fr} );
ok( $res{RETRY_MINIMUM_VALUE_LOWER}, q{SOA 'Retry' value is too low} );
ok( $res{REFRESH_MINIMUM_VALUE_LOWER}, q{SOA 'Refresh' value is too low} );
ok( $res{Z01_MNAME_NO_RESPONSE}, q{SOA 'mname' nameserver does not respond} );
ok( $res{MNAME_IS_NOT_CNAME}, q{SOA 'mname' value refers to a NS which is not an alias} );
ok( $res{Z01_MNAME_NOT_IN_NS_LIST}, q{SOA 'mname' nameserver is not listed in "parent" NS records for tested zone} );
ok( $res{SOA_DEFAULT_TTL_MAXIMUM_VALUE_OK}, q{SOA 'minimum' value is between the recommended ones} );
ok( $res{REFRESH_HIGHER_THAN_RETRY}, q{SOA 'refresh' value is higher than the SOA 'retry' value} );
ok( $res{EXPIRE_MINIMUM_VALUE_OK},
q{SOA 'expire' value is higher than the minimum recommended value and lower than 'refresh' value} );
ok( $res{MX_RECORD_IS_NOT_CNAME}, q{MX record for the domain is not pointing to a CNAME} );
ok( $res{ONE_SOA} , q{Unique SOA returned} );
$zone = Zonemaster::Engine->zone( q{zone01.zut-root.rd.nic.fr} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Zone}, q{zone01}, $zone );
ok( $res{Z01_MNAME_IS_DOT}, q{SOA 'mname' is dot ('.')} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{Zone}, q{zone07.zut-root.rd.nic.fr} );
ok( $res{SOA_DEFAULT_TTL_MAXIMUM_VALUE_LOWER}, q{SOA 'minimum' value is too low} );
$zone = Zonemaster::Engine->zone( q{zone05.zut-root.rd.nic.fr} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Zone}, q{zone09}, $zone );
ok( $res{Z09_MISSING_MAIL_TARGET}, q{No MX records} );
#
# zone08
#
$zone = Zonemaster::Engine->zone( q{zone08-mx-are-cname.zut-root.rd.nic.fr} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Zone}, q{zone08}, $zone );
ok( $res{MX_RECORD_IS_CNAME}, q{MX records are CNAME} );
ok( !$res{MX_RECORD_IS_NOT_CNAME}, q{MX records are CNAME (only CNAME found)} );
$zone = Zonemaster::Engine->zone( q{zone08-mx-are-not-cname.zut-root.rd.nic.fr} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Zone}, q{zone08}, $zone );
ok( $res{MX_RECORD_IS_NOT_CNAME}, q{MX records are NOT_CNAME} );
ok( !$res{MX_RECORD_IS_CNAME}, q{MX records are NOT_CNAME (no CNAME found)} );
$zone = Zonemaster::Engine->zone( q{zone08-one-mx-is-cname.zut-root.rd.nic.fr} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Zone}, q{zone08}, $zone );
ok( $res{MX_RECORD_IS_CNAME}, q{mixed MX records are partially CNAME} );
ok( $res{MX_RECORD_IS_NOT_CNAME}, q{mixed MX records are partially NOT CNAME} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{Zone}, q{zone02.zut-root.rd.nic.fr} );
ok( $res{Z01_MNAME_MISSING_SOA_RECORD}, q{SOA 'mname' nameserver is not authoritative for zone} );
ok( $res{RETRY_MINIMUM_VALUE_OK}, q{SOA 'retry' value is more than the minimum recommended value} );
ok( $res{REFRESH_MINIMUM_VALUE_OK}, q{SOA 'refresh' value is higher than the minimum recommended value} );
ok( $res{EXPIRE_LOWER_THAN_REFRESH}, q{SOA 'expire' value is lower than the SOA 'refresh' value} );
ok( $res{EXPIRE_MINIMUM_VALUE_LOWER}, q{SOA 'expire' value is less than the recommended one} );
ok( $res{SOA_DEFAULT_TTL_MAXIMUM_VALUE_OK}, q{SOA 'minimum' value is between the recommended ones} );
subtest 'user defined SOA values' => sub {
$zone = Zonemaster::Engine->zone( q{zone02.zut-root.rd.nic.fr} );
subtest 'SOA retry, refresh, expire' => sub {
my $new_refresh = 86400;
my $new_retry = 7200;
my $new_expire = 86400;
Zonemaster::Engine::Profile->effective->set( q{test_cases_vars.zone02.SOA_REFRESH_MINIMUM_VALUE}, $new_refresh );
Zonemaster::Engine::Profile->effective->set( q{test_cases_vars.zone04.SOA_RETRY_MINIMUM_VALUE}, $new_retry );
Zonemaster::Engine::Profile->effective->set( q{test_cases_vars.zone05.SOA_EXPIRE_MINIMUM_VALUE}, $new_expire );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{Zone}, $zone );
ok( $res{REFRESH_MINIMUM_VALUE_LOWER}, q{SOA 'refresh' value is lower than the minimum user defined value} );
ok( $res{RETRY_MINIMUM_VALUE_LOWER}, q{SOA 'retry' value is lower than the minimum user defined value} );
ok( $res{EXPIRE_MINIMUM_VALUE_LOWER}, q{SOA 'expire' value is lower than the minimum user defined value} );
};
subtest 'SOA minimum TTL' => sub {
my $new_ttl_min = 7200;
my $new_ttl_max = 3600;
Zonemaster::Engine::Profile->effective->set( q{test_cases_vars.zone06.SOA_DEFAULT_TTL_MINIMUM_VALUE}, $new_ttl_min );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Zone}, q{zone06}, $zone );
ok( $res{SOA_DEFAULT_TTL_MAXIMUM_VALUE_LOWER}, q{SOA 'minimum' value is too low} );
Zonemaster::Engine::Profile->effective->set( q{test_cases_vars.zone06.SOA_DEFAULT_TTL_MAXIMUM_VALUE}, $new_ttl_max );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Zone}, q{zone06}, $zone );
ok( $res{SOA_DEFAULT_TTL_MAXIMUM_VALUE_HIGHER}, q{SOA 'minimum' value is too high} );
};
# reset the profile
Zonemaster::Engine::Profile->effective->merge( Zonemaster::Engine::Profile->default );
Zonemaster::Engine::Profile->effective->merge( $profile_test );
};
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{Zone}, q{zone03.zut-root.rd.nic.fr} );
ok( $res{MNAME_IS_CNAME}, q{SOA 'mname' value refers to a NS which is an alias (CNAME)} );
ok( $res{REFRESH_LOWER_THAN_RETRY}, q{SOA 'refresh' value is lower than the SOA 'retry' value} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{Zone}, q{google.tf} );
ok( $res{SOA_DEFAULT_TTL_MAXIMUM_VALUE_HIGHER}, q{SOA 'minimum' value is too high} );
ok( $res{Z01_MNAME_IS_MASTER}, q{SOA 'mname' is authoritative master nameserver} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_module( q{Zone}, q{zone04.zut-root.rd.nic.fr} );
ok( $res{MNAME_HAS_NO_ADDRESS}, q{No IP address found for SOA 'mname' nameserver} );
ok( $res{Z01_MNAME_NOT_RESOLVE}, q{No IP address found for SOA 'mname' nameserver} );
# $zone = Zonemaster::Engine->zone( 'alcatel.se' );
# %res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Zone}, q{zone07}, $zone );
# ok( $res{NO_RESPONSE_SOA_QUERY}, q{No response from nameserver(s) on SOA queries} );
# $zone = Zonemaster::Engine->zone( 'stromstadsoptiska.se' );
# %res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Zone}, q{zone08}, $zone );
# ok( $res{NO_RESPONSE_MX_QUERY}, q{No response from nameserver(s) on MX queries} );
$zone = Zonemaster::Engine->zone( 'name.doesnotexist' );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Zone}, q{zone02}, $zone );
ok( $res{NO_RESPONSE_SOA_QUERY}, q{No response from nameserver(s) on SOA queries} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Zone}, q{zone03}, $zone );
ok( $res{NO_RESPONSE_SOA_QUERY}, q{No response from nameserver(s) on SOA queries} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Zone}, q{zone04}, $zone );
ok( $res{NO_RESPONSE_SOA_QUERY}, q{No response from nameserver(s) on SOA queries} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Zone}, q{zone05}, $zone );
ok( $res{NO_RESPONSE_SOA_QUERY}, q{No response from nameserver(s) on SOA queries} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Zone}, q{zone06}, $zone );
ok( $res{NO_RESPONSE_SOA_QUERY}, q{No response from nameserver(s) on SOA queries} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Zone}, q{zone07}, $zone );
ok( $res{NO_RESPONSE_SOA_QUERY}, q{No response from nameserver(s) on SOA queries} );
Zonemaster::Engine::Profile->effective->set( q{net.ipv4}, 1 );
Zonemaster::Engine::Profile->effective->set( q{net.ipv6}, 0 );
$zone = Zonemaster::Engine->zone( q{zonemaster.net} );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Zone}, q{zone01}, $zone );
ok( $res{Z01_MNAME_IS_MASTER}, q{SOA 'mname' is authoritative master nameserver} );
TODO: {
local $TODO = "Need to find/create zones with that error";
# zone01
ok( $tag{Z01_MNAME_HAS_LOCALHOST_ADDR}, q{Z01_MNAME_HAS_LOCALHOST_ADDR} );
ok( $tag{Z01_MNAME_IS_LOCALHOST}, q{Z01_MNAME_IS_LOCALHOST} );
ok( $tag{Z01_MNAME_NOT_AUTHORITATIVE}, q{Z01_MNAME_NOT_AUTHORITATIVE} );
ok( $tag{Z01_MNAME_NOT_MASTER}, q{Z01_MNAME_NOT_MASTER} );
ok( $tag{Z01_MNAME_UNEXPECTED_RCODE}, q{Z01_MNAME_UNEXPECTED_RCODE} );
}
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

View File

@@ -0,0 +1,32 @@
a.root-servers.net 2001:0503:ba3e:0000:0000:0000:0002:0030 {}
a.root-servers.net 198.41.0.4 {}
k.root-servers.net 193.0.14.129 {}
k.root-servers.net 2001:07fd:0000:0000:0000:0000:0000:0001 {}
f.root-servers.net 192.5.5.241 {}
f.root-servers.net 2001:0500:002f:0000:0000:0000:0000:000f {}
ibdns01.labs.prive.nic.fr 10.1.72.23 {"HBLv6qWzV1xB7f8Avq/A1g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"LfSEAAABAAMAAAAAEG1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAACAAHADAACAAEAAA4QAAYDbnMxwAzADAACAAEAAA4QAAYDbnMywAzADAACAAEAAA4QAAYDbnMzwAw=","answerfrom":"10.1.72.23","querytime":5,"timestamp":1673535164.34914}}},"hTdaAXoiOEV3SsYc6u3NDw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":4,"timestamp":1673535164.34415,"data":"rX2EAAABAAAAAAAAAm5zAnhhAAAcAAE="}}},"hfOhYkPFLBGlUfgEtSud7w":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"j5yEAAABAAEAAAAAA25zMxBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIGQ==","timestamp":1673535164.37835,"answerfrom":"10.1.72.23","querytime":4}}},"rS2FrWd9HNZlBzrxBdoCog":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":4,"timestamp":1673535164.35618,"data":"/aKEAAABAAEAAAAAA25zMRBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIFw=="}}},"cP9WhuSKQ/RaF0l8dt2+CA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"querytime":4,"answerfrom":"10.1.72.23","timestamp":1673535164.38369,"data":"tHSEAAABAAAAAAAAA25zMxBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB"}}},"5h1JfKzS9Dyxd66CecNE9Q":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"timestamp":1673535164.36804,"querytime":3,"answerfrom":"10.1.72.23","data":"tOOEAAABAAEAAAAAA25zMhBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIGA=="}}},"FraPJ7RA4O5iaLMFztqK/w":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"timestamp":1673535164.37306,"querytime":3,"answerfrom":"10.1.72.23","data":"noiEAAABAAAAAAAAA25zMhBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB"}}},"l7VttscyKGtmhADDWHDKDg":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"AoaEAAABAAAAAAAAA25zMRBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB","timestamp":1673535164.36204,"answerfrom":"10.1.72.23","querytime":4}}},"VJNyjYTEkq/zkSLzgFptdw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":3,"timestamp":1673535164.33889,"data":"EOCEAAABAAEAAAAAAm5zAnhhAAABAAHADAABAAEAAA4QAAQKAUgX"}}},"Bw5JYDf2ZQnVY/1hB4Hv0g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"xCGEAAABAAEAAAAAEG1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAAGAAHADAAGAAEAAA4QACkDbnMxwAwEcm9vdANuaWMEdGVzdAB4hyM8AAFRgAAAOEAANu6AAAAOEA==","timestamp":1673535164.32095,"querytime":5,"answerfrom":"10.1.72.23"}}},"Y/IeIwIJb12zVtYwf7MnYA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"querytime":4,"answerfrom":"10.1.72.23","timestamp":1673535164.32769,"data":"yOuEAAABAAEAAAAAAnhhAAAGAAHADAAGAAEAAA4QACQCbnPADARyb290A25pY8AMeIartQABUYAAADhAADbugAAADhA="}}}}
b.root-servers.net 199.9.14.201 {}
b.root-servers.net 2001:0500:0200:0000:0000:0000:0000:000b {}
ns2.mname-not-master.zone01.xa 10.1.72.24 {"Bw5JYDf2ZQnVY/1hB4Hv0g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"querytime":4,"answerfrom":"10.1.72.24","timestamp":1673535164.39348,"data":"9VSEAAABAAEAAAAAEG1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAAGAAHADAAGAAEAAA4QACkDbnMxwAwEcm9vdANuaWMEdGVzdAB4hyM9AAFRgAAAOEAANu6AAAAOEA=="}}},"HBLv6qWzV1xB7f8Avq/A1g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"TxSEAAABAAMAAAAAEG1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAACAAHADAACAAEAAA4QAAYDbnMxwAzADAACAAEAAA4QAAYDbnMywAzADAACAAEAAA4QAAYDbnMzwAw=","timestamp":1673535164.40454,"querytime":5,"answerfrom":"10.1.72.24"}}},"X5EINI94ZoFjRgtYt3T+tA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"tgGEAAABAAEAAAAAAnhhAAACAAHADAACAAEAAA4QAAUCbnPADA==","querytime":4,"answerfrom":"10.1.72.24","timestamp":1673535164.33332}}}}
l.root-servers.net 2001:0500:009f:0000:0000:0000:0000:0042 {}
l.root-servers.net 199.7.83.42 {}
j.root-servers.net 192.58.128.30 {}
j.root-servers.net 2001:0503:0c27:0000:0000:0000:0002:0030 {}
c.root-servers.net 192.33.4.12 {}
c.root-servers.net 2001:0500:0002:0000:0000:0000:0000:000c {}
h.root-servers.net 198.97.190.53 {}
h.root-servers.net 2001:0500:0001:0000:0000:0000:0000:0053 {}
d.root-servers.net 2001:0500:002d:0000:0000:0000:0000:000d {}
d.root-servers.net 199.7.91.13 {}
i.root-servers.net 2001:07fe:0000:0000:0000:0000:0000:0053 {}
i.root-servers.net 192.36.148.17 {}
m.root-servers.net 202.12.27.33 {"Y/IeIwIJb12zVtYwf7MnYA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"timestamp":1673535164.30251,"querytime":3,"answerfrom":"202.12.27.33","data":"C6uEAwABAAAAAQAAAnhhAAAGAAEAAAYAAQAAAAAAQAFhDHJvb3Qtc2VydmVycwNuZXQABW5zdGxkDHZlcmlzaWduLWdycwNjb20AeJSzgAAABwgAAAOEAAk6gAABUYA="}}}}
m.root-servers.net 2001:0dc3:0000:0000:0000:0000:0000:0035 {"Y/IeIwIJb12zVtYwf7MnYA":null}
g.root-servers.net 192.112.36.4 {}
g.root-servers.net 2001:0500:0012:0000:0000:0000:0000:0d0d {}
e.root-servers.net 192.203.230.10 {}
e.root-servers.net 2001:0500:00a8:0000:0000:0000:0000:000e {}
ns.xa 10.1.72.23 {"HBLv6qWzV1xB7f8Avq/A1g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"querytime":5,"answerfrom":"10.1.72.23","timestamp":1673535164.34914,"data":"LfSEAAABAAMAAAAAEG1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAACAAHADAACAAEAAA4QAAYDbnMxwAzADAACAAEAAA4QAAYDbnMywAzADAACAAEAAA4QAAYDbnMzwAw="}}},"hTdaAXoiOEV3SsYc6u3NDw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"timestamp":1673535164.34415,"answerfrom":"10.1.72.23","querytime":4,"data":"rX2EAAABAAAAAAAAAm5zAnhhAAAcAAE="}}},"hfOhYkPFLBGlUfgEtSud7w":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"timestamp":1673535164.37835,"querytime":4,"answerfrom":"10.1.72.23","data":"j5yEAAABAAEAAAAAA25zMxBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIGQ=="}}},"rS2FrWd9HNZlBzrxBdoCog":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"timestamp":1673535164.35618,"answerfrom":"10.1.72.23","querytime":4,"data":"/aKEAAABAAEAAAAAA25zMRBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIFw=="}}},"cP9WhuSKQ/RaF0l8dt2+CA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":4,"timestamp":1673535164.38369,"data":"tHSEAAABAAAAAAAAA25zMxBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB"}}},"5h1JfKzS9Dyxd66CecNE9Q":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"tOOEAAABAAEAAAAAA25zMhBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIGA==","timestamp":1673535164.36804,"answerfrom":"10.1.72.23","querytime":3}}},"FraPJ7RA4O5iaLMFztqK/w":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":3,"timestamp":1673535164.37306,"data":"noiEAAABAAAAAAAAA25zMhBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB"}}},"l7VttscyKGtmhADDWHDKDg":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"timestamp":1673535164.36204,"answerfrom":"10.1.72.23","querytime":4,"data":"AoaEAAABAAAAAAAAA25zMRBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB"}}},"VJNyjYTEkq/zkSLzgFptdw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"timestamp":1673535164.33889,"answerfrom":"10.1.72.23","querytime":3,"data":"EOCEAAABAAEAAAAAAm5zAnhhAAABAAHADAABAAEAAA4QAAQKAUgX"}}},"Bw5JYDf2ZQnVY/1hB4Hv0g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":5,"timestamp":1673535164.32095,"data":"xCGEAAABAAEAAAAAEG1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAAGAAHADAAGAAEAAA4QACkDbnMxwAwEcm9vdANuaWMEdGVzdAB4hyM8AAFRgAAAOEAANu6AAAAOEA=="}}},"Y/IeIwIJb12zVtYwf7MnYA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":4,"timestamp":1673535164.32769,"data":"yOuEAAABAAEAAAAAAnhhAAAGAAHADAAGAAEAAA4QACQCbnPADARyb290A25pY8AMeIartQABUYAAADhAADbugAAADhA="}}}}
ns1.mname-not-master.zone01.xa 10.1.72.23 {"HBLv6qWzV1xB7f8Avq/A1g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"timestamp":1673535164.34914,"querytime":5,"answerfrom":"10.1.72.23","data":"LfSEAAABAAMAAAAAEG1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAACAAHADAACAAEAAA4QAAYDbnMxwAzADAACAAEAAA4QAAYDbnMywAzADAACAAEAAA4QAAYDbnMzwAw="}}},"hTdaAXoiOEV3SsYc6u3NDw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"rX2EAAABAAAAAAAAAm5zAnhhAAAcAAE=","querytime":4,"answerfrom":"10.1.72.23","timestamp":1673535164.34415}}},"hfOhYkPFLBGlUfgEtSud7w":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"j5yEAAABAAEAAAAAA25zMxBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIGQ==","answerfrom":"10.1.72.23","querytime":4,"timestamp":1673535164.37835}}},"rS2FrWd9HNZlBzrxBdoCog":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":4,"timestamp":1673535164.35618,"data":"/aKEAAABAAEAAAAAA25zMRBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIFw=="}}},"cP9WhuSKQ/RaF0l8dt2+CA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"timestamp":1673535164.38369,"querytime":4,"answerfrom":"10.1.72.23","data":"tHSEAAABAAAAAAAAA25zMxBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB"}}},"5h1JfKzS9Dyxd66CecNE9Q":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"querytime":3,"answerfrom":"10.1.72.23","timestamp":1673535164.36804,"data":"tOOEAAABAAEAAAAAA25zMhBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIGA=="}}},"FraPJ7RA4O5iaLMFztqK/w":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":3,"timestamp":1673535164.37306,"data":"noiEAAABAAAAAAAAA25zMhBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB"}}},"l7VttscyKGtmhADDWHDKDg":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"querytime":4,"answerfrom":"10.1.72.23","timestamp":1673535164.36204,"data":"AoaEAAABAAAAAAAAA25zMRBtbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB"}}},"VJNyjYTEkq/zkSLzgFptdw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"querytime":3,"answerfrom":"10.1.72.23","timestamp":1673535164.33889,"data":"EOCEAAABAAEAAAAAAm5zAnhhAAABAAHADAABAAEAAA4QAAQKAUgX"}}},"Bw5JYDf2ZQnVY/1hB4Hv0g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"xCGEAAABAAEAAAAAEG1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAAGAAHADAAGAAEAAA4QACkDbnMxwAwEcm9vdANuaWMEdGVzdAB4hyM8AAFRgAAAOEAANu6AAAAOEA==","querytime":5,"answerfrom":"10.1.72.23","timestamp":1673535164.32095}}},"Y/IeIwIJb12zVtYwf7MnYA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"yOuEAAABAAEAAAAAAnhhAAAGAAHADAAGAAEAAA4QACQCbnPADARyb290A25pY8AMeIartQABUYAAADhAADbugAAADhA=","timestamp":1673535164.32769,"querytime":4,"answerfrom":"10.1.72.23"}}}}
ibdns01-24.labs.prive.nic.fr 10.1.72.24 {"Bw5JYDf2ZQnVY/1hB4Hv0g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"9VSEAAABAAEAAAAAEG1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAAGAAHADAAGAAEAAA4QACkDbnMxwAwEcm9vdANuaWMEdGVzdAB4hyM9AAFRgAAAOEAANu6AAAAOEA==","timestamp":1673535164.39348,"answerfrom":"10.1.72.24","querytime":4}}},"HBLv6qWzV1xB7f8Avq/A1g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"TxSEAAABAAMAAAAAEG1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAACAAHADAACAAEAAA4QAAYDbnMxwAzADAACAAEAAA4QAAYDbnMywAzADAACAAEAAA4QAAYDbnMzwAw=","answerfrom":"10.1.72.24","querytime":5,"timestamp":1673535164.40454}}},"X5EINI94ZoFjRgtYt3T+tA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"timestamp":1673535164.33332,"answerfrom":"10.1.72.24","querytime":4,"data":"tgGEAAABAAEAAAAAAnhhAAACAAHADAACAAEAAA4QAAUCbnPADA=="}}}}
ns3.mname-not-master.zone01.xa 10.1.72.25 {"HBLv6qWzV1xB7f8Avq/A1g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"5EOEAAABAAMAAAAAEG1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAACAAHADAACAAEAAA4QAAYDbnMxwAzADAACAAEAAA4QAAYDbnMywAzADAACAAEAAA4QAAYDbnMzwAw=","timestamp":1673535164.41021,"answerfrom":"10.1.72.25","querytime":4}}},"Bw5JYDf2ZQnVY/1hB4Hv0g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"1Q+EAAABAAEAAAAAEG1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAAGAAHADAAGAAEAAA4QACkDbnMxwAwEcm9vdANuaWMEdGVzdAB4hyM9AAFRgAAAOEAANu6AAAAOEA==","timestamp":1673535164.39916,"answerfrom":"10.1.72.25","querytime":4}}}}

View File

@@ -0,0 +1,45 @@
use Test::More;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Zone} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-zone01-A.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
Zonemaster::Engine->add_fake_delegation(
'xa' => {
'ibdns01.labs.prive.nic.fr' => ['10.1.72.23'],
'ibdns01-24.labs.prive.nic.fr' => ['10.1.72.24'],
},
fill_in_empty_oob_glue => 0,
);
my $zone = Zonemaster::Engine->zone( q{mname-not-master.zone01.xa} );
my %res = map { $_->tag => $_ } Zonemaster::Engine::Test::Zone->zone01( $zone );
ok( !$res{Z01_MNAME_HAS_LOCALHOST_ADDR}, q{should not emit Z01_MNAME_HAS_LOCALHOST_ADDR} );
ok( !$res{Z01_MNAME_IS_DOT}, q{should not emit Z01_MNAME_IS_DOT} );
ok( !$res{Z01_MNAME_IS_LOCALHOST}, q{should not emit Z01_MNAME_IS_LOCALHOST} );
ok( !$res{Z01_MNAME_IS_MASTER}, q{should not emit Z01_MNAME_IS_MASTER} );
ok( !$res{Z01_MNAME_MISSING_SOA_RECORD}, q{should not emit Z01_MNAME_MISSING_SOA_RECORD} );
ok( !$res{Z01_MNAME_NO_RESPONSE}, q{should not emit Z01_MNAME_NO_RESPONSE} );
ok( !$res{Z01_MNAME_NOT_AUTHORITATIVE}, q{should not emit Z01_MNAME_NOT_AUTHORITATIVE} );
ok( !$res{Z01_MNAME_NOT_IN_NS_LIST}, q{should not emit Z01_MNAME_NOT_IN_NS_LIST} );
ok( $res{Z01_MNAME_NOT_MASTER}, q{should emit Z01_MNAME_NOT_MASTER} );
ok( !$res{Z01_MNAME_NOT_RESOLVE}, q{should not emit Z01_MNAME_NOT_RESOLVE} );
ok( !$res{Z01_MNAME_UNEXPECTED_RCODE}, q{should not emit Z01_MNAME_UNEXPECTED_RCODE} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

View File

@@ -0,0 +1,32 @@
c.root-servers.net 192.33.4.12 {}
c.root-servers.net 2001:0500:0002:0000:0000:0000:0000:000c {}
ns3.multi-mname-not-master.zone01.xa 10.1.72.25 {"AlakLnUrh/ZXvFdKsIi0/g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.25","querytime":4,"timestamp":1673537145.20686,"data":"XymEAAABAAEAAAAAFm11bHRpLW1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAAGAAHADAAGAAEAAA4QACkDbnMywAwEcm9vdANuaWMEdGVzdAB4hyM9AAFRgAAAOEAANu6AAAAOEA=="}}},"tAM/Cd6kvSIRftXIpFhUOA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.25","querytime":4,"timestamp":1673537145.2179,"data":"FF+EAAABAAMAAAAAFm11bHRpLW1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAACAAHADAACAAEAAA4QAAYDbnMxwAzADAACAAEAAA4QAAYDbnMywAzADAACAAEAAA4QAAYDbnMzwAw="}}}}
ibdns01-24.labs.prive.nic.fr 10.1.72.24 {"AlakLnUrh/ZXvFdKsIi0/g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"querytime":4,"data":"wRGEAAABAAEAAAAAFm11bHRpLW1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAAGAAHADAAGAAEAAA4QACkDbnMywAwEcm9vdANuaWMEdGVzdAB4hyM9AAFRgAAAOEAANu6AAAAOEA==","timestamp":1673537145.20141,"answerfrom":"10.1.72.24"}}},"tAM/Cd6kvSIRftXIpFhUOA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.24","querytime":5,"data":"GtiEAAABAAMAAAAAFm11bHRpLW1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAACAAHADAACAAEAAA4QAAYDbnMxwAzADAACAAEAAA4QAAYDbnMywAzADAACAAEAAA4QAAYDbnMzwAw=","timestamp":1673537145.21227}}},"X5EINI94ZoFjRgtYt3T+tA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"timestamp":1673537145.13933,"data":"vwKEAAABAAEAAAAAAnhhAAACAAHADAACAAEAAA4QAAUCbnPADA==","querytime":4,"answerfrom":"10.1.72.24"}}}}
h.root-servers.net 2001:0500:0001:0000:0000:0000:0000:0053 {}
h.root-servers.net 198.97.190.53 {}
k.root-servers.net 193.0.14.129 {}
k.root-servers.net 2001:07fd:0000:0000:0000:0000:0000:0001 {}
i.root-servers.net 192.36.148.17 {}
i.root-servers.net 2001:07fe:0000:0000:0000:0000:0000:0053 {}
l.root-servers.net 2001:0500:009f:0000:0000:0000:0000:0042 {}
l.root-servers.net 199.7.83.42 {}
ns.xa 10.1.72.23 {"5tcJAMjTWT7L+9Gkt/oJpQ":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"timestamp":1673537145.17403,"data":"2SCEAAABAAEAAAAAA25zMhZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIGA==","querytime":4,"answerfrom":"10.1.72.23"}}},"AlakLnUrh/ZXvFdKsIi0/g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","timestamp":1673537145.12615,"data":"5kWEAAABAAEAAAAAFm11bHRpLW1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAAGAAHADAAGAAEAAA4QACkDbnMxwAwEcm9vdANuaWMEdGVzdAB4hyM8AAFRgAAAOEAANu6AAAAOEA==","querytime":5}}},"hTdaAXoiOEV3SsYc6u3NDw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":3,"data":"ggSEAAABAAAAAAAAAm5zAnhhAAAcAAE=","timestamp":1673537145.15105}}},"bdVi9vDiXOC8FksS0h6sig":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"querytime":3,"timestamp":1673537145.16292,"data":"4kmEAAABAAEAAAAAA25zMRZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIFw==","answerfrom":"10.1.72.23"}}},"tAM/Cd6kvSIRftXIpFhUOA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"querytime":5,"timestamp":1673537145.1561,"data":"jlmEAAABAAMAAAAAFm11bHRpLW1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAACAAHADAACAAEAAA4QAAYDbnMxwAzADAACAAEAAA4QAAYDbnMywAzADAACAAEAAA4QAAYDbnMzwAw=","answerfrom":"10.1.72.23"}}},"gB0pz+6dQrQejm7v8U2Fow":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":4,"timestamp":1673537145.18477,"data":"IkGEAAABAAEAAAAAA25zMxZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIGQ=="}}},"9f6iUXRSDYRqdxlym2wu7A":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"timestamp":1673537145.17927,"data":"jMqEAAABAAAAAAAAA25zMhZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB","querytime":4,"answerfrom":"10.1.72.23"}}},"VTs4lc27Pxo1zgxNG/k2VQ":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","data":"XkCEAAABAAAAAAAAA25zMRZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB","timestamp":1673537145.1681,"querytime":4}}},"VJNyjYTEkq/zkSLzgFptdw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","data":"DDeEAAABAAEAAAAAAm5zAnhhAAABAAHADAABAAEAAA4QAAQKAUgX","timestamp":1673537145.14536,"querytime":3}}},"Y/IeIwIJb12zVtYwf7MnYA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"timestamp":1673537145.13343,"data":"zU+EAAABAAEAAAAAAnhhAAAGAAHADAAGAAEAAA4QACQCbnPADARyb290A25pY8AMeIartQABUYAAADhAADbugAAADhA=","querytime":4,"answerfrom":"10.1.72.23"}}},"hzrMiitR1PxZG875M3+/nQ":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":4,"data":"z9aEAAABAAAAAAAAA25zMxZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB","timestamp":1673537145.19038}}}}
e.root-servers.net 192.203.230.10 {}
e.root-servers.net 2001:0500:00a8:0000:0000:0000:0000:000e {}
j.root-servers.net 192.58.128.30 {}
j.root-servers.net 2001:0503:0c27:0000:0000:0000:0002:0030 {}
m.root-servers.net 2001:0dc3:0000:0000:0000:0000:0000:0035 {"Y/IeIwIJb12zVtYwf7MnYA":null}
m.root-servers.net 202.12.27.33 {"Y/IeIwIJb12zVtYwf7MnYA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"querytime":3,"timestamp":1673537145.1179,"data":"g6OEAwABAAAAAQAAAnhhAAAGAAEAAAYAAQAAAAAAQAFhDHJvb3Qtc2VydmVycwNuZXQABW5zdGxkDHZlcmlzaWduLWdycwNjb20AeJSzgAAABwgAAAOEAAk6gAABUYA=","answerfrom":"202.12.27.33"}}}}
f.root-servers.net 2001:0500:002f:0000:0000:0000:0000:000f {}
f.root-servers.net 192.5.5.241 {}
a.root-servers.net 2001:0503:ba3e:0000:0000:0000:0002:0030 {}
a.root-servers.net 198.41.0.4 {}
g.root-servers.net 192.112.36.4 {}
g.root-servers.net 2001:0500:0012:0000:0000:0000:0000:0d0d {}
ns2.multi-mname-not-master.zone01.xa 10.1.72.24 {"AlakLnUrh/ZXvFdKsIi0/g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.24","timestamp":1673537145.20141,"data":"wRGEAAABAAEAAAAAFm11bHRpLW1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAAGAAHADAAGAAEAAA4QACkDbnMywAwEcm9vdANuaWMEdGVzdAB4hyM9AAFRgAAAOEAANu6AAAAOEA==","querytime":4}}},"tAM/Cd6kvSIRftXIpFhUOA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"querytime":5,"timestamp":1673537145.21227,"data":"GtiEAAABAAMAAAAAFm11bHRpLW1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAACAAHADAACAAEAAA4QAAYDbnMxwAzADAACAAEAAA4QAAYDbnMywAzADAACAAEAAA4QAAYDbnMzwAw=","answerfrom":"10.1.72.24"}}},"X5EINI94ZoFjRgtYt3T+tA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.24","querytime":4,"timestamp":1673537145.13933,"data":"vwKEAAABAAEAAAAAAnhhAAACAAHADAACAAEAAA4QAAUCbnPADA=="}}}}
ibdns01.labs.prive.nic.fr 10.1.72.23 {"5tcJAMjTWT7L+9Gkt/oJpQ":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"2SCEAAABAAEAAAAAA25zMhZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIGA==","timestamp":1673537145.17403,"querytime":4,"answerfrom":"10.1.72.23"}}},"AlakLnUrh/ZXvFdKsIi0/g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":5,"data":"5kWEAAABAAEAAAAAFm11bHRpLW1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAAGAAHADAAGAAEAAA4QACkDbnMxwAwEcm9vdANuaWMEdGVzdAB4hyM8AAFRgAAAOEAANu6AAAAOEA==","timestamp":1673537145.12615}}},"hTdaAXoiOEV3SsYc6u3NDw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"querytime":3,"timestamp":1673537145.15105,"data":"ggSEAAABAAAAAAAAAm5zAnhhAAAcAAE=","answerfrom":"10.1.72.23"}}},"bdVi9vDiXOC8FksS0h6sig":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"4kmEAAABAAEAAAAAA25zMRZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIFw==","timestamp":1673537145.16292,"querytime":3,"answerfrom":"10.1.72.23"}}},"tAM/Cd6kvSIRftXIpFhUOA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","data":"jlmEAAABAAMAAAAAFm11bHRpLW1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAACAAHADAACAAEAAA4QAAYDbnMxwAzADAACAAEAAA4QAAYDbnMywAzADAACAAEAAA4QAAYDbnMzwAw=","timestamp":1673537145.1561,"querytime":5}}},"gB0pz+6dQrQejm7v8U2Fow":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":4,"timestamp":1673537145.18477,"data":"IkGEAAABAAEAAAAAA25zMxZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIGQ=="}}},"9f6iUXRSDYRqdxlym2wu7A":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","data":"jMqEAAABAAAAAAAAA25zMhZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB","timestamp":1673537145.17927,"querytime":4}}},"VTs4lc27Pxo1zgxNG/k2VQ":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":4,"timestamp":1673537145.1681,"data":"XkCEAAABAAAAAAAAA25zMRZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB"}}},"VJNyjYTEkq/zkSLzgFptdw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"DDeEAAABAAEAAAAAAm5zAnhhAAABAAHADAABAAEAAA4QAAQKAUgX","timestamp":1673537145.14536,"querytime":3,"answerfrom":"10.1.72.23"}}},"Y/IeIwIJb12zVtYwf7MnYA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"querytime":4,"data":"zU+EAAABAAEAAAAAAnhhAAAGAAHADAAGAAEAAA4QACQCbnPADARyb290A25pY8AMeIartQABUYAAADhAADbugAAADhA=","timestamp":1673537145.13343,"answerfrom":"10.1.72.23"}}},"hzrMiitR1PxZG875M3+/nQ":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":4,"timestamp":1673537145.19038,"data":"z9aEAAABAAAAAAAAA25zMxZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB"}}}}
b.root-servers.net 2001:0500:0200:0000:0000:0000:0000:000b {}
b.root-servers.net 199.9.14.201 {}
ns1.multi-mname-not-master.zone01.xa 10.1.72.23 {"5tcJAMjTWT7L+9Gkt/oJpQ":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":4,"timestamp":1673537145.17403,"data":"2SCEAAABAAEAAAAAA25zMhZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIGA=="}}},"AlakLnUrh/ZXvFdKsIi0/g":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"querytime":5,"data":"5kWEAAABAAEAAAAAFm11bHRpLW1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAAGAAHADAAGAAEAAA4QACkDbnMxwAwEcm9vdANuaWMEdGVzdAB4hyM8AAFRgAAAOEAANu6AAAAOEA==","timestamp":1673537145.12615,"answerfrom":"10.1.72.23"}}},"hTdaAXoiOEV3SsYc6u3NDw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"ggSEAAABAAAAAAAAAm5zAnhhAAAcAAE=","timestamp":1673537145.15105,"querytime":3,"answerfrom":"10.1.72.23"}}},"bdVi9vDiXOC8FksS0h6sig":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":3,"data":"4kmEAAABAAEAAAAAA25zMRZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIFw==","timestamp":1673537145.16292}}},"tAM/Cd6kvSIRftXIpFhUOA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","data":"jlmEAAABAAMAAAAAFm11bHRpLW1uYW1lLW5vdC1tYXN0ZXIGem9uZTAxAnhhAAACAAHADAACAAEAAA4QAAYDbnMxwAzADAACAAEAAA4QAAYDbnMywAzADAACAAEAAA4QAAYDbnMzwAw=","timestamp":1673537145.1561,"querytime":5}}},"gB0pz+6dQrQejm7v8U2Fow":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"querytime":4,"timestamp":1673537145.18477,"data":"IkGEAAABAAEAAAAAA25zMxZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAAQABwAwAAQABAAAOEAAECgFIGQ==","answerfrom":"10.1.72.23"}}},"9f6iUXRSDYRqdxlym2wu7A":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","data":"jMqEAAABAAAAAAAAA25zMhZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB","timestamp":1673537145.17927,"querytime":4}}},"VTs4lc27Pxo1zgxNG/k2VQ":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","data":"XkCEAAABAAAAAAAAA25zMRZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB","timestamp":1673537145.1681,"querytime":4}}},"VJNyjYTEkq/zkSLzgFptdw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"data":"DDeEAAABAAEAAAAAAm5zAnhhAAABAAHADAABAAEAAA4QAAQKAUgX","timestamp":1673537145.14536,"querytime":3,"answerfrom":"10.1.72.23"}}},"Y/IeIwIJb12zVtYwf7MnYA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"10.1.72.23","querytime":4,"timestamp":1673537145.13343,"data":"zU+EAAABAAEAAAAAAnhhAAAGAAHADAAGAAEAAA4QACQCbnPADARyb290A25pY8AMeIartQABUYAAADhAADbugAAADhA="}}},"hzrMiitR1PxZG875M3+/nQ":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"querytime":4,"data":"z9aEAAABAAAAAAAAA25zMxZtdWx0aS1tbmFtZS1ub3QtbWFzdGVyBnpvbmUwMQJ4YQAAHAAB","timestamp":1673537145.19038,"answerfrom":"10.1.72.23"}}}}
d.root-servers.net 199.7.91.13 {}
d.root-servers.net 2001:0500:002d:0000:0000:0000:0000:000d {}

View File

@@ -0,0 +1,45 @@
use Test::More;
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Zone} );
use_ok( q{Zonemaster::Engine::Util} );
}
my $datafile = q{t/Test-zone01-B.data};
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
Zonemaster::Engine->add_fake_delegation(
'xa' => {
'ibdns01.labs.prive.nic.fr' => ['10.1.72.23'],
'ibdns01-24.labs.prive.nic.fr' => ['10.1.72.24'],
},
fill_in_empty_oob_glue => 0,
);
my $zone = Zonemaster::Engine->zone( q{multi-mname-not-master.zone01.xa} );
my %res = map { $_->tag => $_ } Zonemaster::Engine::Test::Zone->zone01( $zone );
ok( !$res{Z01_MNAME_HAS_LOCALHOST_ADDR}, q{should not emit Z01_MNAME_HAS_LOCALHOST_ADDR} );
ok( !$res{Z01_MNAME_IS_DOT}, q{should not emit Z01_MNAME_IS_DOT} );
ok( !$res{Z01_MNAME_IS_LOCALHOST}, q{should not emit Z01_MNAME_IS_LOCALHOST} );
ok( $res{Z01_MNAME_IS_MASTER}, q{should emit Z01_MNAME_IS_MASTER} );
ok( !$res{Z01_MNAME_MISSING_SOA_RECORD}, q{should not emit Z01_MNAME_MISSING_SOA_RECORD} );
ok( !$res{Z01_MNAME_NO_RESPONSE}, q{should not emit Z01_MNAME_NO_RESPONSE} );
ok( !$res{Z01_MNAME_NOT_AUTHORITATIVE}, q{should not emit Z01_MNAME_NOT_AUTHORITATIVE} );
ok( !$res{Z01_MNAME_NOT_IN_NS_LIST}, q{should not emit Z01_MNAME_NOT_IN_NS_LIST} );
ok( $res{Z01_MNAME_NOT_MASTER}, q{should emit Z01_MNAME_NOT_MASTER} );
ok( !$res{Z01_MNAME_NOT_RESOLVE}, q{should not emit Z01_MNAME_NOT_RESOLVE} );
ok( !$res{Z01_MNAME_UNEXPECTED_RCODE}, q{should not emit Z01_MNAME_UNEXPECTED_RCODE} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

View File

@@ -0,0 +1,4 @@
ns1 127.19.9.43 {"+QGSVG9DWhVyuNokG/4a6A":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.9.43","data":"iMKEAAABAAEAAgABAAAPAAEAAA8AAQAADhAACAAKBG1haWwAAAACAAEAAA4QAAUDbnMxAAAAAgABAAAOEAAFA25zMgDAHgABAAEAAA4QAAR/AwAZ","querytime":0,"timestamp":1746538252.32462}}},"9kfShNTLVy4wDehBPdpCXg":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.9.43","data":"zvKEAAABAAEAAgAAAAAGAAEAAAYAAQAADhAAIwNuczEABWFkbWluAnhiAHiG/CwAAFRgAAAOEAAJOoAAAVGAAAACAAEAAA4QAALAHAAAAgABAAAOEAAFA25zMgA=","querytime":0,"timestamp":1746538252.32372}}},"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.9.43","data":"cByEAAABAAIAAAAEAAACAAEAAAIAAQAADhAABQNuczEAAAACAAEAAA4QAAUDbnMyAMAcAAEAAQAADhAABH8TCSvAHAAcAAEAAA4QABD9oQCyAMMAAAEnABkACQBDwCwAAQABAAAOEAAEfxMJLMAsABwAAQAADhAAEP2hALIAwwAAAScAGQAJAEQ=","querytime":0,"timestamp":1746538252.32215}}}}
ns1 fda1:00b2:00c3:0000:0127:0019:0009:0043 {"+QGSVG9DWhVyuNokG/4a6A":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:9:43","data":"IjKEAAABAAEAAgABAAAPAAEAAA8AAQAADhAACAAKBG1haWwAAAACAAEAAA4QAAUDbnMxAAAAAgABAAAOEAAFA25zMgDAHgABAAEAAA4QAAR/AwAZ","querytime":0,"timestamp":1746538252.3266}}},"9kfShNTLVy4wDehBPdpCXg":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:9:43","data":"b4WEAAABAAEAAgAAAAAGAAEAAAYAAQAADhAAIwNuczEABWFkbWluAnhiAHiG/CwAAFRgAAAOEAAJOoAAAVGAAAACAAEAAA4QAALAHAAAAgABAAAOEAAFA25zMgA=","querytime":0,"timestamp":1746538252.32566}}}}
ns2 127.19.9.44 {"+QGSVG9DWhVyuNokG/4a6A":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.9.44","data":"HlyEAAABAAEAAgABAAAPAAEAAA8AAQAADhAACAAKBG1haWwAAAACAAEAAA4QAAUDbnMxAAAAAgABAAAOEAAFA25zMgDAHgABAAEAAA4QAAR/AwAZ","querytime":0,"timestamp":1746538252.32827}}},"9kfShNTLVy4wDehBPdpCXg":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.9.44","data":"NHaEAAABAAEAAgAAAAAGAAEAAAYAAQAADhAAIwNuczEABWFkbWluAnhiAHiG/CwAAFRgAAAOEAAJOoAAAVGAAAACAAEAAA4QAALAHAAAAgABAAAOEAAFA25zMgA=","querytime":0,"timestamp":1746538252.32758}}}}
ns2 fda1:00b2:00c3:0000:0127:0019:0009:0044 {"+QGSVG9DWhVyuNokG/4a6A":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:9:44","data":"exiEAAABAAEAAgABAAAPAAEAAA8AAQAADhAACAAKBG1haWwAAAACAAEAAA4QAAUDbnMxAAAAAgABAAAOEAAFA25zMgDAHgABAAEAAA4QAAR/AwAZ","querytime":0,"timestamp":1746538252.32995}}},"9kfShNTLVy4wDehBPdpCXg":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:9:44","data":"3geEAAABAAEAAgAAAAAGAAEAAAYAAQAADhAAIwNuczEABWFkbWluAnhiAHiG/CwAAFRgAAAOEAAJOoAAAVGAAAACAAEAAA4QAALAHAAAAgABAAAOEAAFA25zMgA=","querytime":0,"timestamp":1746538252.32913}}}}

View File

@@ -0,0 +1,84 @@
use strict;
use warnings;
use Test::More;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Nameserver} );
use_ok( q{Zonemaster::Engine::Test::Zone} );
use_ok( q{TestUtil}, qw( perform_testcase_testing ) );
}
###########
# zone09 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/Zone-TP/zone09.md
my $test_module = q{Zone};
my $test_case = 'zone09';
my @all_tags = qw(Z09_INCONSISTENT_MX
Z09_INCONSISTENT_MX_DATA
Z09_MISSING_MAIL_TARGET
Z09_MX_DATA
Z09_MX_FOUND
Z09_NON_AUTH_MX_RESPONSE
Z09_NO_MX_FOUND
Z09_NO_RESPONSE_MX_QUERY
Z09_NULL_MX_NON_ZERO_PREF
Z09_NULL_MX_WITH_OTHER_MX
Z09_ROOT_EMAIL_DOMAIN
Z09_TLD_EMAIL_DOMAIN
Z09_UNEXPECTED_RCODE_MX);
# Test case specific hints file (test-zone-data/Zone-TP/zone09/hintfile-root-email-domain)
Zonemaster::Engine::Recursor->remove_fake_addresses( '.' );
Zonemaster::Engine::Recursor->add_fake_addresses( '.',
{ 'ns1' => [ '127.19.9.43', 'fda1:b2:c3::127:19:9:43' ],
'ns2' => [ '127.19.9.44', 'fda1:b2:c3::127:19:9:44' ],
}
);
# Test zone scenarios
# - Documentation: L<TestUtil/perform_testcase_testing()>
# - Format: { SCENARIO_NAME => [
# testable,
# zone_name,
# [ MANDATORY_MESSAGE_TAGS ],
# [ FORBIDDEN_MESSAGE_TAGS ],
# [ UNDELEGATED_NS ],
# [ UNDELEGATED_DS ],
# ] }
#
# - One of MANDATORY_MESSAGE_TAGS and FORBIDDEN_MESSAGE_TAGS may be undefined.
# See documentation for the meaning of that.
my %subtests = (
'ROOT-EMAIL-DOMAIN' => [
1,
q(.),
[ qw(Z09_ROOT_EMAIL_DOMAIN) ],
undef,
[],
[]
]
);
###########
my $datafile = 't/' . basename ($0, '.t') . '.data';
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
Zonemaster::Engine::Profile->effective->merge( Zonemaster::Engine::Profile->from_json( qq({ "test_cases": [ "$test_case" ] }) ) );
perform_testcase_testing( $test_case, $test_module, \@all_tags, \%subtests, $ENV{ZONEMASTER_SELECTED_SCENARIOS}, $ENV{ZONEMASTER_DISABLED_SCENARIOS} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,180 @@
use strict;
use warnings;
use Test::More;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Nameserver} );
use_ok( q{Zonemaster::Engine::Test::Zone} );
use_ok( q{TestUtil}, qw( perform_testcase_testing ) );
}
###########
# zone09 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/Zone-TP/zone09.md
my $test_module = q{Zone};
my $test_case = 'zone09';
my @all_tags = qw(Z09_INCONSISTENT_MX
Z09_INCONSISTENT_MX_DATA
Z09_MISSING_MAIL_TARGET
Z09_MX_DATA
Z09_MX_FOUND
Z09_NON_AUTH_MX_RESPONSE
Z09_NO_MX_FOUND
Z09_NO_RESPONSE_MX_QUERY
Z09_NULL_MX_NON_ZERO_PREF
Z09_NULL_MX_WITH_OTHER_MX
Z09_ROOT_EMAIL_DOMAIN
Z09_TLD_EMAIL_DOMAIN
Z09_UNEXPECTED_RCODE_MX);
# Common hint file (test-zone-data/COMMON/hintfile)
Zonemaster::Engine::Recursor->remove_fake_addresses( '.' );
Zonemaster::Engine::Recursor->add_fake_addresses( '.',
{ 'ns1' => [ '127.1.0.1', 'fda1:b2:c3::127:1:0:1' ],
'ns2' => [ '127.1.0.2', 'fda1:b2:c3::127:1:0:2' ],
}
);
# Test zone scenarios
# - Documentation: L<TestUtil/perform_testcase_testing()>
# - Format: { SCENARIO_NAME => [
# testable,
# zone_name,
# [ MANDATORY_MESSAGE_TAGS ],
# [ FORBIDDEN_MESSAGE_TAGS ],
# [ UNDELEGATED_NS ],
# [ UNDELEGATED_DS ],
# ] }
#
# - One of MANDATORY_MESSAGE_TAGS and FORBIDDEN_MESSAGE_TAGS may be undefined.
# See documentation for the meaning of that.
my %subtests = (
'NO-RESPONSE-MX-QUERY' => [
1,
q(no-response-mx-query.zone09.xa),#
[ qw(Z09_NO_RESPONSE_MX_QUERY) ],
[],
[],
[]
],
'UNEXPECTED-RCODE-MX' => [
1,
q(unexpected-rcode-mx.zone09.xa),#
[ qw(Z09_UNEXPECTED_RCODE_MX) ],
[],
[],
[]
],
'NON-AUTH-MX-RESPONSE' => [
0,
q(non-auth-mx-response.zone09.xa),#
[ qw(Z09_NON_AUTH_MX_RESPONSE) ],
[],
[],
[]
],
'INCONSISTENT-MX' => [
1,
q(inconsistent-mx.zone09.xa),#
[ qw(Z09_INCONSISTENT_MX Z09_MX_FOUND Z09_NO_MX_FOUND Z09_MX_DATA) ],
[ qw(Z09_MISSING_MAIL_TARGET) ],
[],
[]
],
'INCONSISTENT-MX-DATA' => [
1,
q(inconsistent-mx-data.zone09.xa),
[ qw(Z09_INCONSISTENT_MX_DATA Z09_MX_DATA) ],
undef,
[],
[]
],
'NULL-MX-WITH-OTHER-MX' => [
1,
q(null-mx-with-other-mx.zone09.xa),#
[ qw(Z09_NULL_MX_WITH_OTHER_MX) ],
[ qw(Z09_INCONSISTENT_MX_DATA Z09_MX_DATA Z09_MISSING_MAIL_TARGET Z09_ROOT_EMAIL_DOMAIN Z09_TLD_EMAIL_DOMAIN) ],
[],
[]
],
'NULL-MX-NON-ZERO-PREF' => [
1,
q(null-mx-non-zero-pref.zone09.xa),#
[ qw(Z09_NULL_MX_NON_ZERO_PREF) ],
[ qw(Z09_INCONSISTENT_MX_DATA Z09_MX_DATA Z09_MISSING_MAIL_TARGET Z09_ROOT_EMAIL_DOMAIN Z09_TLD_EMAIL_DOMAIN) ],
[],
[]
],
'TLD-EMAIL-DOMAIN' => [
1,
q(tld-email-domain-zone09),
[ qw(Z09_TLD_EMAIL_DOMAIN) ],
undef,
[],
[]
],
'MX-DATA' => [
1,
q(mx-data.zone09.xa),
[ qw(Z09_MX_DATA) ],
undef,
[],
[]
],
'NULL-MX' => [
1,
q(null-mx.zone09.xa),
[],
undef,
[],
[]
],
'NO-MX-SLD' => [
1,
q(no-mx-sld.zone09.xa),
[ qw(Z09_MISSING_MAIL_TARGET) ],
undef,
[],
[]
],
'NO-MX-TLD' => [
1,
q(no-mx-tld-zone09),
[],
undef,
[],
[]
],
'NO-MX-ARPA' => [
1,
q(no-mx-arpa.zone09.arpa),
[],
undef,
[],
[]
]
);
###########
my $datafile = 't/' . basename ($0, '.t') . '.data';
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
Zonemaster::Engine::Profile->effective->merge( Zonemaster::Engine::Profile->from_json( qq({ "test_cases": [ "$test_case" ] }) ) );
perform_testcase_testing( $test_case, $test_module, \@all_tags, \%subtests, $ENV{ZONEMASTER_SELECTED_SCENARIOS}, $ENV{ZONEMASTER_DISABLED_SCENARIOS} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

View File

@@ -0,0 +1,8 @@
ns1 127.19.11.41 {"1/srhoNm4kU51g3K1bCnOw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.41","data":"GxCEAAABAAEAAgAAA25zMQZuby1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAAQABwAwAAQABAAAOEAAEfxMLKQAAAgABAAAOEAACwAwAAAIAAQAADhAABgNuczLAEA==","querytime":0,"timestamp":1763035760.0178}}},"E7qBMDDGXmejRSJUs26VXQ":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.41","data":"EgSEAAABAAEAAgAAA25zMgZuby1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAHAABwAwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEAQgAAAgABAAAOEAAGA25zMcAQAAACAAEAAA4QAALADA==","querytime":0,"timestamp":1763035760.02209}}},"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.41","data":"nmGEAAABAAIAAAAEAAACAAEAAAIAAQAADhAAIwNuczEGbm8tc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEAAAACAAEAAA4QAAYDbnMywCDAHAABAAEAAA4QAAR/EwspwBwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEAQcBKAAEAAQAADhAABH8TCyrASgAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBC","querytime":0,"timestamp":1763035760.01333}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.41","data":"RDeEAAABAAAAAQAAAAAQAAEAAAYAAQAADhAAPwNuczEGbm8tc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEABWFkbWluwDR4tEZQAABUYAAADhAACTqAAAFRgA==","querytime":0,"timestamp":1763035760.02309}}},"xSXxUB+3LKRbWwQUx0zffw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.41","data":"CoOEAAABAAEAAgAAA25zMgZuby1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAAQABwAwAAQABAAAOEAAEfxMLKgAAAgABAAAOEAAGA25zMcAQAAACAAEAAA4QAALADA==","querytime":0,"timestamp":1763035760.02131}}},"xaqMNYuKlygOUwbAxNpesQ":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.41","data":"X8OEAAABAAEAAgAAA25zMQZuby1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAHAABwAwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEAQQAAAgABAAAOEAACwAwAAAIAAQAADhAABgNuczLAEA==","querytime":0,"timestamp":1763035760.01902}}}}
ns1 fda1:b2:c3:0:127:19:11:41 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:41","data":"4VKEAAABAAIAAAAEAAACAAEAAAIAAQAADhAAIwNuczEGbm8tc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEAAAACAAEAAA4QAAYDbnMywCDAHAABAAEAAA4QAAR/EwspwBwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEAQcBKAAEAAQAADhAABH8TCyrASgAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBC","querytime":0,"timestamp":1763035760.01422}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:41","data":"9ymEAAABAAAAAQAAAAAQAAEAAAYAAQAADhAAPwNuczEGbm8tc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEABWFkbWluwDR4tEZQAABUYAAADhAACTqAAAFRgA==","querytime":0,"timestamp":1763035760.02365}}}}
ns1.no-spf.root-servers.zone11.xa 127.19.11.41 {"1/srhoNm4kU51g3K1bCnOw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.41","data":"GxCEAAABAAEAAgAAA25zMQZuby1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAAQABwAwAAQABAAAOEAAEfxMLKQAAAgABAAAOEAACwAwAAAIAAQAADhAABgNuczLAEA==","querytime":0,"timestamp":1763035760.0178}}},"E7qBMDDGXmejRSJUs26VXQ":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.41","data":"EgSEAAABAAEAAgAAA25zMgZuby1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAHAABwAwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEAQgAAAgABAAAOEAAGA25zMcAQAAACAAEAAA4QAALADA==","querytime":0,"timestamp":1763035760.02209}}},"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.41","data":"nmGEAAABAAIAAAAEAAACAAEAAAIAAQAADhAAIwNuczEGbm8tc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEAAAACAAEAAA4QAAYDbnMywCDAHAABAAEAAA4QAAR/EwspwBwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEAQcBKAAEAAQAADhAABH8TCyrASgAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBC","querytime":0,"timestamp":1763035760.01333}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.41","data":"RDeEAAABAAAAAQAAAAAQAAEAAAYAAQAADhAAPwNuczEGbm8tc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEABWFkbWluwDR4tEZQAABUYAAADhAACTqAAAFRgA==","querytime":0,"timestamp":1763035760.02309}}},"xSXxUB+3LKRbWwQUx0zffw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.41","data":"CoOEAAABAAEAAgAAA25zMgZuby1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAAQABwAwAAQABAAAOEAAEfxMLKgAAAgABAAAOEAAGA25zMcAQAAACAAEAAA4QAALADA==","querytime":0,"timestamp":1763035760.02131}}},"xaqMNYuKlygOUwbAxNpesQ":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.41","data":"X8OEAAABAAEAAgAAA25zMQZuby1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAHAABwAwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEAQQAAAgABAAAOEAACwAwAAAIAAQAADhAABgNuczLAEA==","querytime":0,"timestamp":1763035760.01902}}}}
ns1.no-spf.root-servers.zone11.xa fda1:b2:c3:0:127:19:11:41 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:41","data":"4VKEAAABAAIAAAAEAAACAAEAAAIAAQAADhAAIwNuczEGbm8tc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEAAAACAAEAAA4QAAYDbnMywCDAHAABAAEAAA4QAAR/EwspwBwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEAQcBKAAEAAQAADhAABH8TCyrASgAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBC","querytime":0,"timestamp":1763035760.01422}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:41","data":"9ymEAAABAAAAAQAAAAAQAAEAAAYAAQAADhAAPwNuczEGbm8tc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEABWFkbWluwDR4tEZQAABUYAAADhAACTqAAAFRgA==","querytime":0,"timestamp":1763035760.02365}}}}
ns2 127.19.11.42 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.42","data":"3/KEAAABAAIAAAAEAAACAAEAAAIAAQAADhAAIwNuczEGbm8tc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEAAAACAAEAAA4QAAYDbnMywCDAHAABAAEAAA4QAAR/EwspwBwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEAQcBKAAEAAQAADhAABH8TCyrASgAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBC","querytime":0,"timestamp":1763035760.01502}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.42","data":"hO+EAAABAAAAAQAAAAAQAAEAAAYAAQAADhAAPwNuczEGbm8tc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEABWFkbWluwDR4tEZQAABUYAAADhAACTqAAAFRgA==","querytime":0,"timestamp":1763035760.02424}}}}
ns2 fda1:b2:c3:0:127:19:11:42 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:42","data":"QKWEAAABAAIAAAAEAAACAAEAAAIAAQAADhAAIwNuczEGbm8tc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEAAAACAAEAAA4QAAYDbnMywCDAHAABAAEAAA4QAAR/EwspwBwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEAQcBKAAEAAQAADhAABH8TCyrASgAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBC","querytime":0,"timestamp":1763035760.01567}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:42","data":"tj+EAAABAAAAAQAAAAAQAAEAAAYAAQAADhAAPwNuczEGbm8tc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEABWFkbWluwDR4tEZQAABUYAAADhAACTqAAAFRgA==","querytime":0,"timestamp":1763035760.02472}}}}
ns2.no-spf.root-servers.zone11.xa 127.19.11.42 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.42","data":"3/KEAAABAAIAAAAEAAACAAEAAAIAAQAADhAAIwNuczEGbm8tc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEAAAACAAEAAA4QAAYDbnMywCDAHAABAAEAAA4QAAR/EwspwBwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEAQcBKAAEAAQAADhAABH8TCyrASgAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBC","querytime":0,"timestamp":1763035760.01502}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.42","data":"hO+EAAABAAAAAQAAAAAQAAEAAAYAAQAADhAAPwNuczEGbm8tc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEABWFkbWluwDR4tEZQAABUYAAADhAACTqAAAFRgA==","querytime":0,"timestamp":1763035760.02424}}}}
ns2.no-spf.root-servers.zone11.xa fda1:b2:c3:0:127:19:11:42 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:42","data":"QKWEAAABAAIAAAAEAAACAAEAAAIAAQAADhAAIwNuczEGbm8tc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEAAAACAAEAAA4QAAYDbnMywCDAHAABAAEAAA4QAAR/EwspwBwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEAQcBKAAEAAQAADhAABH8TCyrASgAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBC","querytime":0,"timestamp":1763035760.01567}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:42","data":"tj+EAAABAAAAAQAAAAAQAAEAAAYAAQAADhAAPwNuczEGbm8tc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEABWFkbWluwDR4tEZQAABUYAAADhAACTqAAAFRgA==","querytime":0,"timestamp":1763035760.02472}}}}

View File

@@ -0,0 +1,82 @@
use strict;
use warnings;
use utf8;
use Test::More;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Zone} );
use_ok( q{TestUtil}, qw( perform_testcase_testing ) );
}
###########
# Zone11 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/Zone-TP/zone11.md
my $test_module = q{Zone};
my $test_case = 'zone11';
my @all_tags = qw(Z11_DIFFERENT_SPF_POLICIES_FOUND
Z11_INCONSISTENT_SPF_POLICIES
Z11_NO_SPF_FOUND
Z11_NO_SPF_NON_MAIL_DOMAIN
Z11_NON_NULL_SPF_NON_MAIL_DOMAIN
Z11_NULL_SPF_NON_MAIL_DOMAIN
Z11_SPF_MULTIPLE_RECORDS
Z11_SPF_SYNTAX_ERROR
Z11_SPF_SYNTAX_OK
Z11_UNABLE_TO_CHECK_FOR_SPF);
# Specific hint file (test-zone-data/Zone-TP/zone11/no-spf.hintfile)
Zonemaster::Engine::Recursor->remove_fake_addresses( '.' );
Zonemaster::Engine::Recursor->add_fake_addresses( '.',
{ 'ns1' => [ '127.19.11.41', 'fda1:b2:c3::127:19:11:41' ],
'ns2' => [ '127.19.11.42', 'fda1:b2:c3::127:19:11:42' ],
}
);
# Test zone scenarios
# - Documentation: L<TestUtil/perform_testcase_testing()>
# - Format: { SCENARIO_NAME => [
# testable,
# zone_name,
# [ MANDATORY_MESSAGE_TAGS ],
# [ FORBIDDEN_MESSAGE_TAGS ],
# [ UNDELEGATED_NS ],
# [ UNDELEGATED_DS ],
# ] }
#
# - One of MANDATORY_MESSAGE_TAGS and FORBIDDEN_MESSAGE_TAGS may be undefined.
# See documentation for the meaning of that.
my %subtests = (
'NO-SPF-ROOT-ZONE' => [
1,
q(.),
[ qw( Z11_NO_SPF_NON_MAIL_DOMAIN ) ],
undef,
[],
[]
]
);
###########
my $datafile = 't/' . basename ($0, '.t') . '.data';
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
Zonemaster::Engine::Profile->effective->merge( Zonemaster::Engine::Profile->from_json( qq({ "test_cases": [ "$test_case" ] }) ) );
perform_testcase_testing( $test_case, $test_module, \@all_tags, \%subtests, $ENV{ZONEMASTER_SELECTED_SCENARIOS}, $ENV{ZONEMASTER_DISABLED_SCENARIOS} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

View File

@@ -0,0 +1,8 @@
ns1 127.19.11.43 {"+NXOpDMUoeyvbXm+gVb5mQ":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.43","data":"ggOEAAABAAEAAgAAA25zMghudWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAABAAHADAABAAEAAA4QAAR/EwssAAACAAEAAA4QAAYDbnMxwBAAAAIAAQAADhAAAsAM","querytime":0,"timestamp":1763035763.08767}}},"5i83Ud0FbaS3H3aJ/vE1+A":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.43","data":"vFaEAAABAAEAAgAAA25zMQhudWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAABAAHADAABAAEAAA4QAAR/EwsrAAACAAEAAA4QAALADAAAAgABAAAOEAAGA25zMsAQ","querytime":0,"timestamp":1763035763.08552}}},"EWAlHZjqzh/WKx1Z0QpJLQ":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.43","data":"woKEAAABAAEAAgAAA25zMQhudWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAcAAHADAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBDAAACAAEAAA4QAALADAAAAgABAAAOEAAGA25zMsAQ","querytime":0,"timestamp":1763035763.08658}}},"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.43","data":"oP2EAAABAAIAAAAEAAACAAEAAAIAAQAADhAAJQNuczEIbnVsbC1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAAAIAAQAADhAABgNuczLAIMAcAAEAAQAADhAABH8TCyvAHAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBDwEwAAQABAAAOEAAEfxMLLMBMABwAAQAADhAAEP2hALIAwwAAAScAGQARAEQ=","querytime":0,"timestamp":1763035763.08128}}},"bV4X6Jbip7CJ2yLtZjto8A":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.43","data":"tc+EAAABAAEAAgAAA25zMghudWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAcAAHADAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBEAAACAAEAAA4QAAYDbnMxwBAAAAIAAQAADhAAAsAM","querytime":0,"timestamp":1763035763.08835}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.43","data":"IQmEAAABAAEAAgAAAAAQAAEAABAAAQAADhAADAt2PXNwZjEgLWFsbAAAAgABAAAOEAAlA25zMQhudWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAAAgABAAAOEAAGA25zMsA3","querytime":0,"timestamp":1763035763.08957}}}}
ns1 fda1:b2:c3:0:127:19:11:43 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:43","data":"G8SEAAABAAIAAAAEAAACAAEAAAIAAQAADhAAJQNuczEIbnVsbC1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAAAIAAQAADhAABgNuczLAIMAcAAEAAQAADhAABH8TCyvAHAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBDwEwAAQABAAAOEAAEfxMLLMBMABwAAQAADhAAEP2hALIAwwAAAScAGQARAEQ=","querytime":0,"timestamp":1763035763.08223}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:43","data":"7T2EAAABAAEAAgAAAAAQAAEAABAAAQAADhAADAt2PXNwZjEgLWFsbAAAAgABAAAOEAAlA25zMQhudWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAAAgABAAAOEAAGA25zMsA3","querytime":0,"timestamp":1763035763.09027}}}}
ns1.null-spf.root-servers.zone11.xa 127.19.11.43 {"+NXOpDMUoeyvbXm+gVb5mQ":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.43","data":"ggOEAAABAAEAAgAAA25zMghudWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAABAAHADAABAAEAAA4QAAR/EwssAAACAAEAAA4QAAYDbnMxwBAAAAIAAQAADhAAAsAM","querytime":0,"timestamp":1763035763.08767}}},"5i83Ud0FbaS3H3aJ/vE1+A":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.43","data":"vFaEAAABAAEAAgAAA25zMQhudWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAABAAHADAABAAEAAA4QAAR/EwsrAAACAAEAAA4QAALADAAAAgABAAAOEAAGA25zMsAQ","querytime":0,"timestamp":1763035763.08552}}},"EWAlHZjqzh/WKx1Z0QpJLQ":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.43","data":"woKEAAABAAEAAgAAA25zMQhudWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAcAAHADAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBDAAACAAEAAA4QAALADAAAAgABAAAOEAAGA25zMsAQ","querytime":0,"timestamp":1763035763.08658}}},"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.43","data":"oP2EAAABAAIAAAAEAAACAAEAAAIAAQAADhAAJQNuczEIbnVsbC1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAAAIAAQAADhAABgNuczLAIMAcAAEAAQAADhAABH8TCyvAHAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBDwEwAAQABAAAOEAAEfxMLLMBMABwAAQAADhAAEP2hALIAwwAAAScAGQARAEQ=","querytime":0,"timestamp":1763035763.08128}}},"bV4X6Jbip7CJ2yLtZjto8A":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.43","data":"tc+EAAABAAEAAgAAA25zMghudWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAcAAHADAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBEAAACAAEAAA4QAAYDbnMxwBAAAAIAAQAADhAAAsAM","querytime":0,"timestamp":1763035763.08835}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.43","data":"IQmEAAABAAEAAgAAAAAQAAEAABAAAQAADhAADAt2PXNwZjEgLWFsbAAAAgABAAAOEAAlA25zMQhudWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAAAgABAAAOEAAGA25zMsA3","querytime":0,"timestamp":1763035763.08957}}}}
ns1.null-spf.root-servers.zone11.xa fda1:b2:c3:0:127:19:11:43 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:43","data":"G8SEAAABAAIAAAAEAAACAAEAAAIAAQAADhAAJQNuczEIbnVsbC1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAAAIAAQAADhAABgNuczLAIMAcAAEAAQAADhAABH8TCyvAHAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBDwEwAAQABAAAOEAAEfxMLLMBMABwAAQAADhAAEP2hALIAwwAAAScAGQARAEQ=","querytime":0,"timestamp":1763035763.08223}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:43","data":"7T2EAAABAAEAAgAAAAAQAAEAABAAAQAADhAADAt2PXNwZjEgLWFsbAAAAgABAAAOEAAlA25zMQhudWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAAAgABAAAOEAAGA25zMsA3","querytime":0,"timestamp":1763035763.09027}}}}
ns2 127.19.11.44 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.44","data":"Be+EAAABAAIAAAAEAAACAAEAAAIAAQAADhAAJQNuczEIbnVsbC1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAAAIAAQAADhAABgNuczLAIMAcAAEAAQAADhAABH8TCyvAHAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBDwEwAAQABAAAOEAAEfxMLLMBMABwAAQAADhAAEP2hALIAwwAAAScAGQARAEQ=","querytime":0,"timestamp":1763035763.08299}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.44","data":"Be2EAAABAAEAAgAAAAAQAAEAABAAAQAADhAADAt2PXNwZjEgLWFsbAAAAgABAAAOEAAlA25zMQhudWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAAAgABAAAOEAAGA25zMsA3","querytime":0,"timestamp":1763035763.09083}}}}
ns2 fda1:b2:c3:0:127:19:11:44 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:44","data":"75aEAAABAAIAAAAEAAACAAEAAAIAAQAADhAAJQNuczEIbnVsbC1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAAAIAAQAADhAABgNuczLAIMAcAAEAAQAADhAABH8TCyvAHAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBDwEwAAQABAAAOEAAEfxMLLMBMABwAAQAADhAAEP2hALIAwwAAAScAGQARAEQ=","querytime":0,"timestamp":1763035763.08369}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:44","data":"vcGEAAABAAEAAgAAAAAQAAEAABAAAQAADhAADAt2PXNwZjEgLWFsbAAAAgABAAAOEAAlA25zMQhudWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAAAgABAAAOEAAGA25zMsA3","querytime":0,"timestamp":1763035763.09137}}}}
ns2.null-spf.root-servers.zone11.xa 127.19.11.44 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.44","data":"Be+EAAABAAIAAAAEAAACAAEAAAIAAQAADhAAJQNuczEIbnVsbC1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAAAIAAQAADhAABgNuczLAIMAcAAEAAQAADhAABH8TCyvAHAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBDwEwAAQABAAAOEAAEfxMLLMBMABwAAQAADhAAEP2hALIAwwAAAScAGQARAEQ=","querytime":0,"timestamp":1763035763.08299}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.44","data":"Be2EAAABAAEAAgAAAAAQAAEAABAAAQAADhAADAt2PXNwZjEgLWFsbAAAAgABAAAOEAAlA25zMQhudWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAAAgABAAAOEAAGA25zMsA3","querytime":0,"timestamp":1763035763.09083}}}}
ns2.null-spf.root-servers.zone11.xa fda1:b2:c3:0:127:19:11:44 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:44","data":"75aEAAABAAIAAAAEAAACAAEAAAIAAQAADhAAJQNuczEIbnVsbC1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAAAIAAQAADhAABgNuczLAIMAcAAEAAQAADhAABH8TCyvAHAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBDwEwAAQABAAAOEAAEfxMLLMBMABwAAQAADhAAEP2hALIAwwAAAScAGQARAEQ=","querytime":0,"timestamp":1763035763.08369}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:44","data":"vcGEAAABAAEAAgAAAAAQAAEAABAAAQAADhAADAt2PXNwZjEgLWFsbAAAAgABAAAOEAAlA25zMQhudWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAAAgABAAAOEAAGA25zMsA3","querytime":0,"timestamp":1763035763.09137}}}}

View File

@@ -0,0 +1,82 @@
use strict;
use warnings;
use utf8;
use Test::More;
use File::Basename;
use File::Spec::Functions qw( rel2abs );
use lib dirname( rel2abs( $0 ) );
BEGIN {
use_ok( q{Zonemaster::Engine} );
use_ok( q{Zonemaster::Engine::Test::Zone} );
use_ok( q{TestUtil}, qw( perform_testcase_testing ) );
}
###########
# Zone11 - https://github.com/zonemaster/zonemaster/blob/master/docs/public/specifications/test-zones/Zone-TP/zone11.md
my $test_module = q{Zone};
my $test_case = 'zone11';
my @all_tags = qw(Z11_DIFFERENT_SPF_POLICIES_FOUND
Z11_INCONSISTENT_SPF_POLICIES
Z11_NO_SPF_FOUND
Z11_NO_SPF_NON_MAIL_DOMAIN
Z11_NON_NULL_SPF_NON_MAIL_DOMAIN
Z11_NULL_SPF_NON_MAIL_DOMAIN
Z11_SPF_MULTIPLE_RECORDS
Z11_SPF_SYNTAX_ERROR
Z11_SPF_SYNTAX_OK
Z11_UNABLE_TO_CHECK_FOR_SPF);
# Specific hint file (test-zone-data/Zone-TP/zone11/null-spf.hintfile)
Zonemaster::Engine::Recursor->remove_fake_addresses( '.' );
Zonemaster::Engine::Recursor->add_fake_addresses( '.',
{ 'ns1' => [ '127.19.11.43', 'fda1:b2:c3::127:19:11:43' ],
'ns2' => [ '127.19.11.44', 'fda1:b2:c3::127:19:11:44' ],
}
);
# Test zone scenarios
# - Documentation: L<TestUtil/perform_testcase_testing()>
# - Format: { SCENARIO_NAME => [
# testable,
# zone_name,
# [ MANDATORY_MESSAGE_TAGS ],
# [ FORBIDDEN_MESSAGE_TAGS ],
# [ UNDELEGATED_NS ],
# [ UNDELEGATED_DS ],
# ] }
#
# - One of MANDATORY_MESSAGE_TAGS and FORBIDDEN_MESSAGE_TAGS may be undefined.
# See documentation for the meaning of that.
my %subtests = (
'NULL-SPF-ROOT-ZONE' => [
1,
q(.),
[ qw( Z11_NULL_SPF_NON_MAIL_DOMAIN ) ],
undef,
[],
[]
]
);
###########
my $datafile = 't/' . basename ($0, '.t') . '.data';
if ( not $ENV{ZONEMASTER_RECORD} ) {
die q{Stored data file missing} if not -r $datafile;
Zonemaster::Engine::Nameserver->restore( $datafile );
Zonemaster::Engine::Profile->effective->set( q{no_network}, 1 );
}
Zonemaster::Engine::Profile->effective->merge( Zonemaster::Engine::Profile->from_json( qq({ "test_cases": [ "$test_case" ] }) ) );
perform_testcase_testing( $test_case, $test_module, \@all_tags, \%subtests, $ENV{ZONEMASTER_SELECTED_SCENARIOS}, $ENV{ZONEMASTER_DISABLED_SCENARIOS} );
if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
}
done_testing;

View File

@@ -0,0 +1,8 @@
ns1 127.19.11.45 {"2cR5iObPvjPB6H0gFs9GJw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.45","data":"0W6EAAABAAEAAgAAA25zMQxub24tbnVsbC1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAAQABwAwAAQABAAAOEAAEfxMLLQAAAgABAAAOEAACwAwAAAIAAQAADhAABgNuczLAEA==","querytime":0,"timestamp":1763035765.49171}}},"7pbr4vNBUbGv75dKwZisuA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.45","data":"m+yEAAABAAEAAgAAA25zMgxub24tbnVsbC1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAHAABwAwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEARgAAAgABAAAOEAAGA25zMcAQAAACAAEAAA4QAALADA==","querytime":0,"timestamp":1763035765.49467}}},"MfeuBAor8mZLuWihwyARTg":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.45","data":"FGiEAAABAAEAAgAAA25zMgxub24tbnVsbC1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAAQABwAwAAQABAAAOEAAEfxMLLgAAAgABAAAOEAAGA25zMcAQAAACAAEAAA4QAALADA==","querytime":0,"timestamp":1763035765.49393}}},"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.45","data":"ddyEAAABAAIAAAAEAAACAAEAAAIAAQAADhAAKQNuczEMbm9uLW51bGwtc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEAAAACAAEAAA4QAAYDbnMywCDAHAABAAEAAA4QAAR/EwstwBwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEARcBQAAEAAQAADhAABH8TCy7AUAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBG","querytime":0,"timestamp":1763035765.48739}}},"m6xb07AGk8b4dwOYgL48Dg":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.45","data":"lYSEAAABAAEAAgAAA25zMQxub24tbnVsbC1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAHAABwAwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEARQAAAgABAAAOEAACwAwAAAIAAQAADhAABgNuczLAEA==","querytime":0,"timestamp":1763035765.49272}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.45","data":"wXqEAAABAAEAAgAAAAAQAAEAABAAAQAADhAAIB92PXNwZjEgaXA2OmZkYTE6YjI6YzM6Oi82NCAtYWxsAAACAAEAAA4QACkDbnMxDG5vbi1udWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAAAgABAAAOEAAGA25zMsBL","querytime":0,"timestamp":1763035765.49601}}}}
ns1 fda1:b2:c3:0:127:19:11:45 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:45","data":"jq6EAAABAAIAAAAEAAACAAEAAAIAAQAADhAAKQNuczEMbm9uLW51bGwtc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEAAAACAAEAAA4QAAYDbnMywCDAHAABAAEAAA4QAAR/EwstwBwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEARcBQAAEAAQAADhAABH8TCy7AUAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBG","querytime":0,"timestamp":1763035765.48834}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:45","data":"3JWEAAABAAEAAgAAAAAQAAEAABAAAQAADhAAIB92PXNwZjEgaXA2OmZkYTE6YjI6YzM6Oi82NCAtYWxsAAACAAEAAA4QACkDbnMxDG5vbi1udWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAAAgABAAAOEAAGA25zMsBL","querytime":0,"timestamp":1763035765.49659}}}}
ns1.non-null-spf.root-servers.zone11.xa 127.19.11.45 {"2cR5iObPvjPB6H0gFs9GJw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.45","data":"0W6EAAABAAEAAgAAA25zMQxub24tbnVsbC1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAAQABwAwAAQABAAAOEAAEfxMLLQAAAgABAAAOEAACwAwAAAIAAQAADhAABgNuczLAEA==","querytime":0,"timestamp":1763035765.49171}}},"7pbr4vNBUbGv75dKwZisuA":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.45","data":"m+yEAAABAAEAAgAAA25zMgxub24tbnVsbC1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAHAABwAwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEARgAAAgABAAAOEAAGA25zMcAQAAACAAEAAA4QAALADA==","querytime":0,"timestamp":1763035765.49467}}},"MfeuBAor8mZLuWihwyARTg":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.45","data":"FGiEAAABAAEAAgAAA25zMgxub24tbnVsbC1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAAQABwAwAAQABAAAOEAAEfxMLLgAAAgABAAAOEAAGA25zMcAQAAACAAEAAA4QAALADA==","querytime":0,"timestamp":1763035765.49393}}},"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.45","data":"ddyEAAABAAIAAAAEAAACAAEAAAIAAQAADhAAKQNuczEMbm9uLW51bGwtc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEAAAACAAEAAA4QAAYDbnMywCDAHAABAAEAAA4QAAR/EwstwBwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEARcBQAAEAAQAADhAABH8TCy7AUAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBG","querytime":0,"timestamp":1763035765.48739}}},"m6xb07AGk8b4dwOYgL48Dg":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.45","data":"lYSEAAABAAEAAgAAA25zMQxub24tbnVsbC1zcGYMcm9vdC1zZXJ2ZXJzBnpvbmUxMQJ4YQAAHAABwAwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEARQAAAgABAAAOEAACwAwAAAIAAQAADhAABgNuczLAEA==","querytime":0,"timestamp":1763035765.49272}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.45","data":"wXqEAAABAAEAAgAAAAAQAAEAABAAAQAADhAAIB92PXNwZjEgaXA2OmZkYTE6YjI6YzM6Oi82NCAtYWxsAAACAAEAAA4QACkDbnMxDG5vbi1udWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAAAgABAAAOEAAGA25zMsBL","querytime":0,"timestamp":1763035765.49601}}}}
ns1.non-null-spf.root-servers.zone11.xa fda1:b2:c3:0:127:19:11:45 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:45","data":"jq6EAAABAAIAAAAEAAACAAEAAAIAAQAADhAAKQNuczEMbm9uLW51bGwtc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEAAAACAAEAAA4QAAYDbnMywCDAHAABAAEAAA4QAAR/EwstwBwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEARcBQAAEAAQAADhAABH8TCy7AUAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBG","querytime":0,"timestamp":1763035765.48834}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:45","data":"3JWEAAABAAEAAgAAAAAQAAEAABAAAQAADhAAIB92PXNwZjEgaXA2OmZkYTE6YjI6YzM6Oi82NCAtYWxsAAACAAEAAA4QACkDbnMxDG5vbi1udWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAAAgABAAAOEAAGA25zMsBL","querytime":0,"timestamp":1763035765.49659}}}}
ns2 127.19.11.46 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.46","data":"+U2EAAABAAIAAAAEAAACAAEAAAIAAQAADhAAKQNuczEMbm9uLW51bGwtc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEAAAACAAEAAA4QAAYDbnMywCDAHAABAAEAAA4QAAR/EwstwBwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEARcBQAAEAAQAADhAABH8TCy7AUAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBG","querytime":0,"timestamp":1763035765.48911}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.46","data":"09SEAAABAAEAAgAAAAAQAAEAABAAAQAADhAAIB92PXNwZjEgaXA2OmZkYTE6YjI6YzM6Oi82NCAtYWxsAAACAAEAAA4QACkDbnMxDG5vbi1udWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAAAgABAAAOEAAGA25zMsBL","querytime":0,"timestamp":1763035765.49712}}}}
ns2 fda1:b2:c3:0:127:19:11:46 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:46","data":"SwKEAAABAAIAAAAEAAACAAEAAAIAAQAADhAAKQNuczEMbm9uLW51bGwtc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEAAAACAAEAAA4QAAYDbnMywCDAHAABAAEAAA4QAAR/EwstwBwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEARcBQAAEAAQAADhAABH8TCy7AUAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBG","querytime":0,"timestamp":1763035765.48996}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:46","data":"LxaEAAABAAEAAgAAAAAQAAEAABAAAQAADhAAIB92PXNwZjEgaXA2OmZkYTE6YjI6YzM6Oi82NCAtYWxsAAACAAEAAA4QACkDbnMxDG5vbi1udWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAAAgABAAAOEAAGA25zMsBL","querytime":0,"timestamp":1763035765.49768}}}}
ns2.non-null-spf.root-servers.zone11.xa 127.19.11.46 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.46","data":"+U2EAAABAAIAAAAEAAACAAEAAAIAAQAADhAAKQNuczEMbm9uLW51bGwtc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEAAAACAAEAAA4QAAYDbnMywCDAHAABAAEAAA4QAAR/EwstwBwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEARcBQAAEAAQAADhAABH8TCy7AUAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBG","querytime":0,"timestamp":1763035765.48911}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"127.19.11.46","data":"09SEAAABAAEAAgAAAAAQAAEAABAAAQAADhAAIB92PXNwZjEgaXA2OmZkYTE6YjI6YzM6Oi82NCAtYWxsAAACAAEAAA4QACkDbnMxDG5vbi1udWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAAAgABAAAOEAAGA25zMsBL","querytime":0,"timestamp":1763035765.49712}}}}
ns2.non-null-spf.root-servers.zone11.xa fda1:b2:c3:0:127:19:11:46 {"UzfnoYKACE71u6V/QQ17nw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:46","data":"SwKEAAABAAIAAAAEAAACAAEAAAIAAQAADhAAKQNuczEMbm9uLW51bGwtc3BmDHJvb3Qtc2VydmVycwZ6b25lMTECeGEAAAACAAEAAA4QAAYDbnMywCDAHAABAAEAAA4QAAR/EwstwBwAHAABAAAOEAAQ/aEAsgDDAAABJwAZABEARcBQAAEAAQAADhAABH8TCy7AUAAcAAEAAA4QABD9oQCyAMMAAAEnABkAEQBG","querytime":0,"timestamp":1763035765.48996}}},"xP3rhAM8Paq298pCchCvcw":{"Zonemaster::Engine::Packet":{"Zonemaster::LDNS::Packet":{"answerfrom":"fda1:b2:c3:0:127:19:11:46","data":"LxaEAAABAAEAAgAAAAAQAAEAABAAAQAADhAAIB92PXNwZjEgaXA2OmZkYTE6YjI6YzM6Oi82NCAtYWxsAAACAAEAAA4QACkDbnMxDG5vbi1udWxsLXNwZgxyb290LXNlcnZlcnMGem9uZTExAnhhAAAAAgABAAAOEAAGA25zMsBL","querytime":0,"timestamp":1763035765.49768}}}}

Some files were not shown because too many files have changed in this diff Show More