t/10-dnsvi.t
changeset 106 140d7537105e
parent 105 9069ce49fd83
equal deleted inserted replaced
105:9069ce49fd83 106:140d7537105e
     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();