1#!perl 2 3use strict; 4use warnings; 5use Test::More tests => 150; 6use Net::CIDR::Set; 7use Net::CIDR::Set::IPv4; 8use Net::CIDR::Set::IPv6; 9 10{ 11 # _inc 12 for my $b ( 0 .. 31 ) { 13 my $n = 1 << $b; 14 my $p = $n - 1; 15 my $q = $n + 1; 16 is unpack( 'N', Net::CIDR::Set::_inc( pack 'N', $p ) ), $n, 17 "_inc($p) == $n"; 18 is unpack( 'N', Net::CIDR::Set::_inc( pack 'N', $n ) ), $q, 19 "_inc($n) == $q"; 20 is unpack( 'N', Net::CIDR::Set::_dec( pack 'N', $n ) ), $p, 21 "_dec($n) == $p"; 22 is unpack( 'N', Net::CIDR::Set::_dec( pack 'N', $q ) ), $n, 23 "_dec($q) == $n"; 24 } 25 my @big = ( 26 { 27 name => '0 to 1', 28 before => [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], 29 after => [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ] 30 }, 31 { 32 name => 'wrap some', 33 before => 34 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255 ], 35 after => [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ] 36 }, 37 { 38 name => 'wrap all', 39 before => [ 40 255, 255, 255, 255, 255, 255, 255, 255, 41 255, 255, 255, 255, 255, 255, 255, 255 42 ], 43 after => [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] 44 }, 45 ); 46 for my $b ( @big ) { 47 my $name = $b->{name}; 48 my @inc = unpack 'C*', 49 Net::CIDR::Set::_inc( pack 'C*', @{ $b->{before} } ); 50 is_deeply [@inc], $b->{after}, "$name: _inc"; 51 my @dec = unpack 'C*', Net::CIDR::Set::_dec( pack 'C*', @inc ); 52 is_deeply [@dec], $b->{before}, "$name: _dec"; 53 } 54} 55 56{ 57 my @case = ( 58 { 59 ip => '127.0.0.1', 60 expect => [ [ 0, 127, 0, 0, 1 ], [ 0, 127, 0, 0, 2 ] ] 61 }, 62 { 63 ip => '192.168.0.0/16', 64 expect => [ [ 0, 192, 168, 0, 0 ], [ 0, 192, 169, 0, 0 ] ] 65 }, 66 { 67 ip => '192.168.0.0/255.255.0.0', 68 expect => [ [ 0, 192, 168, 0, 0 ], [ 0, 192, 169, 0, 0 ] ] 69 }, 70 { 71 ip => '192.168.0.0/0.0.255.255', 72 error => qr{Can't decode} 73 }, 74 { 75 ip => '0.0.0.0/0', 76 expect => [ [ 0, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0 ] ] 77 }, 78 { 79 ip => '192.168.0.12-192.168.1.13', 80 expect => [ [ 0, 192, 168, 0, 12 ], [ 0, 192, 168, 1, 14 ] ] 81 }, 82 { 83 ip => '0.0.0.0-255.255.255.255', 84 expect => [ [ 0, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0 ] ] 85 }, 86 ); 87 for my $case ( @case ) { 88 my @enc = eval { Net::CIDR::Set::IPv4->encode( $case->{ip} ) }; 89 if ( my $error = $case->{error} ) { 90 like $@, $error, 'error'; 91 } 92 else { 93 my @got = map { [ unpack 'C*', $_ ] } @enc; 94 is_deeply [@got], $case->{expect}, "encode $case->{ip}"; 95 } 96 } 97} 98 99{ 100 my @case = ( 101 { 102 range => [ [ 0, 127, 0, 0, 1 ], [ 0, 127, 0, 0, 2 ] ], 103 generic => 0, 104 expect => '127.0.0.1', 105 }, 106 { 107 range => [ [ 0, 127, 0, 0, 1 ], [ 0, 127, 0, 0, 2 ] ], 108 generic => 1, 109 expect => '127.0.0.1/32', 110 }, 111 { 112 range => [ [ 0, 127, 0, 0, 1 ], [ 0, 127, 0, 0, 2 ] ], 113 generic => 2, 114 expect => '127.0.0.1-127.0.0.1', 115 }, 116 { 117 range => [ [ 0, 192, 168, 0, 12 ], [ 0, 192, 168, 1, 14 ] ], 118 generic => 0, 119 expect => '192.168.0.12-192.168.1.13', 120 }, 121 { 122 range => [ [ 0, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0 ] ], 123 generic => 0, 124 expect => '0.0.0.0/0', 125 }, 126 { 127 range => [ [ 0, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0 ] ], 128 generic => 1, 129 expect => '0.0.0.0/0', 130 }, 131 { 132 range => [ [ 0, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0 ] ], 133 generic => 2, 134 expect => '0.0.0.0-255.255.255.255', 135 }, 136 ); 137 for my $case ( @case ) { 138 my $got 139 = Net::CIDR::Set::IPv4->decode( 140 ( map { pack 'C*', @$_ } @{ $case->{range} } ), 141 $case->{generic} ); 142 is $got, $case->{expect}, "$got"; 143 } 144} 145 146{ 147 is Net::CIDR::Set::_conjunction( or => 1, 2, 3 ), '1, 2 or 3', 148 '_conjunction'; 149 is Net::CIDR::Set::_and( 1, 2, 3 ), '1, 2 and 3', '_and'; 150} 151 152# vim:ts=2:sw=2:et:ft=perl 153 154