1 #! perl |
|
2 use 5.014; |
|
3 use strict; |
|
4 use warnings; |
|
5 use Test::More; |
|
6 use File::Temp; |
|
7 use Test::Exception; |
|
8 use Storable qw(freeze); |
|
9 |
|
10 my $tmp = File::Temp->new; |
|
11 $tmp->print(<<__); |
|
12 # kommentar |
|
13 a # more comment |
|
14 b |
|
15 c ns1 ns2 # comment |
|
16 d |
|
17 __ |
|
18 $tmp->flush; |
|
19 |
|
20 |
|
21 sub dig_serial { (split " ", `dig +short SOA @_`)[2] } |
|
22 sub dig_ns { sort map { /(\S+?)\.?$/ } `dig +short NS @_` } |
|
23 |
|
24 # we require it, it's not a normal module |
|
25 use blib; |
|
26 use_ok('Nagios::Check::DNS::delegation') |
|
27 or BAIL_OUT q{can't require the module}; |
|
28 |
|
29 |
|
30 subtest 'tools' => sub { |
|
31 is_deeply [sort +uniq(qw(a b a c))], [qw(a b c)] => 'uniq helper'; |
|
32 |
|
33 # get_domains should read a list of names, either from a file |
|
34 # or from the arguments, or from a combination of both |
|
35 is_deeply [get_domains(sources => [qw/a b c/])], [qw(a b c)] => 'domains from list'; |
|
36 is_deeply [get_domains(sources => ["$tmp"])], [qw(a b c d)] => 'domains from file'; |
|
37 is_deeply [get_domains(sources => ['a', "$tmp", 'z'])], [qw(a a b c d z)] => 'domains from args and file'; |
|
38 |
|
39 is_deeply {read_override("$tmp")}, { c => ['ns1', 'ns2'] }, 'override file'; |
|
40 |
|
41 my %google = ( nameservers => [qw/8.8.8.8 8.8.4.4/]); |
|
42 my %level3 = ( nameservers => [qw/209.244.0.3 209.244.0.4/]); |
|
43 |
|
44 my $r1a = Net::DNS::Resolver->new(%google); |
|
45 my $r1b = Net::DNS::Resolver->new(%google); |
|
46 |
|
47 my $r2a = Net::DNS::Resolver->new(%level3); |
|
48 my $r2b = Net::DNS::Resolver->new(%level3); |
|
49 |
|
50 is $r1a, $r1b => 'same google'; |
|
51 is $r2a, $r2b => 'same level3'; |
|
52 isnt $r1a, $r2a => 'not same google/level3'; |
|
53 |
|
54 my (@a, @b); |
|
55 @a = qw[8.8.8.1]; |
|
56 my $r3a = Net::DNS::Resolver->new(nameservers => \@a); |
|
57 @a = qw[8.8.4.2]; |
|
58 my $r3b = Net::DNS::Resolver->new(nameservers => \@a); |
|
59 isnt $r3a, $r3b => 'same ref, but not same object'; |
|
60 |
|
61 @b = @a; |
|
62 is freeze(\@a), freeze(\@b) => 'frozen lists'; |
|
63 my $r3c = Net::DNS::Resolver->new(nameservers => \@b); |
|
64 is $r3b, $r3c => 'same servers, but not same ref'; |
|
65 |
|
66 }; |
|
67 |
|
68 |
|
69 |
|
70 for (qw(heise.de schlittermann.de google.com debian.org example.org)) { |
|
71 |
|
72 subtest $_ => sub { |
|
73 |
|
74 throws_ok { ns($_, nameservers => [qw/8.8.8.8/], aa => 1) } |
|
75 qr/no aa/ => 'not authoritive @8.8.8.8'; |
|
76 is_deeply [ns($_)], [dig_ns($_)] => "ns \@default"; |
|
77 is_deeply [ns($_, nameservers => [qw/8.8.4.4/])], |
|
78 [dig_ns('@8.8.4.4', $_)] => "ns \@8.8.4.4"; |
|
79 is serial($_, nameservers => [qw/8.8.8.8/]), |
|
80 dig_serial('@8.8.8.8', $_) => 'serial'; |
|
81 }; |
|
82 |
|
83 } |
|
84 |
|
85 # ns for some domain we're not the master for, should be refused |
|
86 throws_ok { ns('example.org', nameservers => [qw/f.nic.de a.nic.de/]) } |
|
87 qr/^REFUSED/ => 'throws on refused query'; |
|
88 throws_ok { ns('safasdfasdfrandomadsfefvddeas') } |
|
89 qr/^NXDOMAIN/ => 'throws on nx domain'; |
|
90 |
|
91 ok ns_ok('schlittermann.de', ['212.80.235.130']) => 'ns_ok for schlittermann.de'; |
|
92 throws_ok { ns_ok('heise.de', ['212.80.235.130']) } qr/no aa|differ|REFUSED/ => 'ns_ok for heise.de'; |
|
93 throws_ok { ns_ok('heise.de', ['8.8.8.8']) } qr/no aa|differ|REFUSED/ => 'ns_ok for heise.de'; |
|
94 |
|
95 # serial |
|
96 |
|
97 done_testing(); |
|
98 |
|
99 # vim:sts=4 sw=4 ts=8: |
|