1 #! perl |
|
2 |
|
3 use 5.010; |
|
4 use Test::More; |
|
5 use strict; |
|
6 use warnings; |
|
7 use File::Basename; |
|
8 |
|
9 use_ok 'DNS::Vi' or BAIL_OUT 'DNS::Vi not found!'; |
|
10 can_ok 'DNS::Vi', qw(ttl2h h2ttl parse nice delta edit update show); |
|
11 |
|
12 # TODO: more tests! |
|
13 is ttl2h(86400), '1d', '-> 1d'; |
|
14 is h2ttl('1d'), 86400, '<- 1d'; |
|
15 |
|
16 sub slurp { |
|
17 local $/ = undef; |
|
18 open(my $x, '<', shift); |
|
19 return <$x>; |
|
20 } |
|
21 |
|
22 # the expect must match the t/samples/? files |
|
23 my %expect = ( |
|
24 axfr => { |
|
25 RRSETS => 64, |
|
26 SOA => 1, |
|
27 NS => 2, |
|
28 A => 6, |
|
29 TXT => 3, |
|
30 AAAA => 1, |
|
31 MX => 5, |
|
32 }, |
|
33 a => { |
|
34 RRSETS => 32, |
|
35 SOA => 1, |
|
36 NS => 16, |
|
37 A => 9, |
|
38 TXT => 4, |
|
39 AAAA => 0, |
|
40 MX => 0, |
|
41 SOA => { |
|
42 'km21.de.' => ['pu.km21.de. hostmaster.schlittermann.de. 1397766411 86400 7200 604800 300'], |
|
43 }, |
|
44 }, |
|
45 b => { |
|
46 RRSETS => 11, |
|
47 SOA => { |
|
48 'km21.de.' => ['pu.schlittermann.de. hostmaster.schlittermann.de. 1397766411 86400 7200 604800 300'], |
|
49 }, |
|
50 NS => 2, |
|
51 A => 1, |
|
52 TXT => 3, |
|
53 AAAA => 0, |
|
54 MX => 0, |
|
55 CNAME => { |
|
56 'foo.km21.de.' => [qw/tte.km21.de./], |
|
57 'bar.km21.de.' => [qw/tte.km21.de./], |
|
58 'baz.km21.de.' => [qw/tte.km21.de./], |
|
59 'faz.km21.de.' => [qw/a.b.c./], |
|
60 }, |
|
61 }, |
|
62 c => { |
|
63 RRSETS => 12, |
|
64 SOA => 1, |
|
65 NS => 2, |
|
66 A => 2, |
|
67 TXT => 5, |
|
68 AAAA => 0, |
|
69 MX => 2, |
|
70 }, |
|
71 d => { |
|
72 RRSETS => 15, |
|
73 SOA => 1, |
|
74 NS => 2, |
|
75 A => [qw/ |
|
76 abc.de.km21.de. |
|
77 foo.km21.de. |
|
78 tte.km21.de. |
|
79 tte.km21.de. |
|
80 bar.km21.de. |
|
81 /], |
|
82 TXT => { |
|
83 'km21.de.' => [ map { "\"$_\"" } |
|
84 'invoice: self', |
|
85 'utf8: km21.de', |
|
86 'start: 1396981300 2014-04-08T20:21:40', |
|
87 ], |
|
88 'tte.km21.de.' => [ map { "\"$_\"" } 'tte', 'tte2' ], |
|
89 }, |
|
90 AAAA => 0, |
|
91 MX => 2, |
|
92 }, |
|
93 'frey-1' => { |
|
94 RRSETS => 6, |
|
95 SOA => { 'example.com.' => ['p.example.com. hostmaster.example.com. 47 3600 900 604800 300'] }, |
|
96 A => { 'p.example.com.' => ['1.1.1.1', '2.2.2.2'] }, |
|
97 NS => { 'example.com.' => ['p.example.com.'] }, |
|
98 CNAME => { |
|
99 'proxy.mm.frey.example.com.' => ['uxa.frey.example.com.'], |
|
100 'portal.mm.frey.example.com.'=> ['uxb.frey.example.com.'], |
|
101 }, |
|
102 }, |
|
103 dkim => { |
|
104 RRSETS => 2, |
|
105 TXT => { 'k1._domainkey.km21.de.' => ['"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AM"'] }, |
|
106 SOA => 1, |
|
107 } |
|
108 ); |
|
109 |
|
110 # uniq list of rrtypes we want to test |
|
111 my @sets = do { |
|
112 my %h; |
|
113 @h{ map { keys %{$_} } values %expect } = (); |
|
114 grep { $_ ne 'RRSETS' } sort keys %h; |
|
115 }; |
|
116 |
|
117 foreach my $sample (sort keys %expect) { |
|
118 my $file = "t/samples/$sample"; |
|
119 |
|
120 subtest "sample $file" => sub { |
|
121 my %expect = %{ $expect{$sample} }; |
|
122 my @zone = parse(slurp $file); |
|
123 is @zone, $expect{RRSETS} => "$sample: $expect{RRSETS} RRSETS"; |
|
124 foreach my $type (@sets) { |
|
125 if (ref $expect{$type} eq ref[]) { |
|
126 my @entries = sort map { $_->{label} } grep { $_->{rrtype} eq $type } map { $_->{rrset} } @zone; |
|
127 is_deeply \@entries, [sort @{$expect{$type}} ] => 'list of labels'; |
|
128 } |
|
129 elsif (ref $expect{$type} eq ref{}) { |
|
130 foreach my $label (keys %{ $expect{$type} }) { |
|
131 my @entries = sort map { $_->{data} } grep { $_->{label} eq $label and $_->{rrtype} eq $type } map { $_->{rrset} } @zone; |
|
132 is_deeply \@entries, [sort @{ $expect{$type}{$label} }] => 'complete rrsets', |
|
133 } |
|
134 } |
|
135 else { |
|
136 is grep({ $_->{rrset}{rrtype} eq $type } @zone), |
|
137 $expect{$type}//0 => "number of $type rrsets"; |
|
138 } |
|
139 } |
|
140 |
|
141 my %delta = delta(\@zone, \@zone); |
|
142 is @{$delta{add}}, 0 => 'nothing added'; |
|
143 is @{$delta{del}}, 0 => 'nothing deleted'; |
|
144 } |
|
145 } |
|
146 |
|
147 done_testing(); |
|