Newer
Older
NetAddr-IP / Lite / t / bigint.t
@Michael Robinton Michael Robinton on 21 Oct 2014 7 KB Import of MIKER/NetAddr-IP-4.054 from CPAN.

use strict;
#use diagnostics;
use Test::More;

use NetAddr::IP::Lite;
use NetAddr::IP::Util qw(
	bcd2bin
	bin2bcd
	addconst
	shiftleft
);

use Data::Dumper;

sub badd {	# function to add a small int to bignum string
  my($n,$i) = @_;
  my $v = bcd2bin($n);
  (undef,$v) = addconst($v,$i);
  bin2bcd($v);
}

sub xpo2 {	# function to do a n^2 multiplication
  my($n,$x) = @_;
  my $v = bcd2bin($n);
  my $c = 0;
  while ($x >>= 1) {$c++}
  $v = shiftleft($v,$c);
  bin2bcd($v);
}

my $no_mbi_emu = 1;	# set this to "1" for normal, "0" for development

unless (eval{ $no_mbi_emu && require Math::BigInt }) {
  if ($no_mbi_emu) {
    print "1..1\nok 1	# skipped all, Math::BigInt not found\n";
    exit;
  }

  &NetAddr::IP::Lite::_force_bi_emu;

  package Math::BigInt;
  my $badd = \&main::badd;
  require overload;
  import overload 
	'""'	=> sub {
	${$_[0]} =~ /(\d+)/;
	return $1;
 	},
	'+'	=> sub {
	${$_[0]} =~ /(\d+)/;
	$b = '+'. main::badd($1,$_[1]);
	bless \$b;
	};
  *new = \&NetAddr::IP::Lite::_bi_fake;
}

my @exp = (qw(
	255.255.255.253/32				4294967293				4294967295
	255.255.255.254/32				4294967294				4294967295
	255.255.255.255/32				4294967295				4294967295
	0:0:0:0:0:1:0:0/128				4294967296				4294967295
	0:0:0:0:0:1:0:1/128				4294967297				4294967295
	0:0:0:0:0:1:0:2/128				4294967298				4294967295
	FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFD/128	340282366920938463463374607431768211453	340282366920938463463374607431768211455
	FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFE/128	340282366920938463463374607431768211454	340282366920938463463374607431768211455
	FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF/128	340282366920938463463374607431768211455	340282366920938463463374607431768211455
	0.0.0.0/32					0					4294967295
	0.0.0.1/32					1					4294967295
	0.0.0.2/32					2					4294967295
	123.45.67.89/32					2066563929				4294967295
	123.45.67.89/28					2066563929				4294967280
	123.45.67.89/24					2066563929				4294967040
	123.45.67.89/20					2066563929				4294963200
	123.45.67.89/16					2066563929				4294901760
	123.45.67.89/12					2066563929				4293918720
	123.45.67.89/8					2066563929				4278190080
	123.45.67.89/4					2066563929				4026531840
	123.45.67.89/0					2066563929				0
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/128		170145699920964442595609400891477785294	340282366920938463463374607431768211455
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/124		170145699920964442595609400891477785294	340282366920938463463374607431768211440
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/120		170145699920964442595609400891477785294	340282366920938463463374607431768211200
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/116		170145699920964442595609400891477785294	340282366920938463463374607431768207360
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/112		170145699920964442595609400891477785294	340282366920938463463374607431768145920
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/108		170145699920964442595609400891477785294	340282366920938463463374607431767162880
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/104		170145699920964442595609400891477785294	340282366920938463463374607431751434240
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/100		170145699920964442595609400891477785294	340282366920938463463374607431499776000
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/96		170145699920964442595609400891477785294	340282366920938463463374607427473244160
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/92		170145699920964442595609400891477785294	340282366920938463463374607363048734720
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/88		170145699920964442595609400891477785294	340282366920938463463374606332256583680
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/84		170145699920964442595609400891477785294	340282366920938463463374589839582167040
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/80		170145699920964442595609400891477785294	340282366920938463463374325956791500800
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/76		170145699920964442595609400891477785294	340282366920938463463370103832140840960
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/72		170145699920964442595609400891477785294	340282366920938463463302549837730283520
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/68		170145699920964442595609400891477785294	340282366920938463462221685927161364480
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/64		170145699920964442595609400891477785294	340282366920938463444927863358058659840
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/60		170145699920964442595609400891477785294	340282366920938463168226702252415385600
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/56		170145699920964442595609400891477785294	340282366920938458741008124562122997760
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/52		170145699920964442595609400891477785294	340282366920938387905510881517444792320
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/48		170145699920964442595609400891477785294	340282366920937254537554992802593505280
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/44		170145699920964442595609400891477785294	340282366920919120650260773364972912640
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/40		170145699920964442595609400891477785294	340282366920628978453553262363043430400
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/36		170145699920964442595609400891477785294	340282366915986703306233086332171714560
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/32		170145699920964442595609400891477785294	340282366841710300949110269838224261120
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/28		170145699920964442595609400891477785294	340282365653287863235145205935065006080
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/24		170145699920964442595609400891477785294	340282346638528859811704183484516925440
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/20		170145699920964442595609400891477785294	340282042402384805036647824275747635200
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/16		170145699920964442595609400891477785294	340277174624079928635746076935438991360
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/12		170145699920964442595609400891477785294	340199290171201906221318119490500689920
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/8		170145699920964442595609400891477785294	338953138925153547590470800371487866880
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/4		170145699920964442595609400891477785294	319014718988379809496913694467282698240
	8000:DEAD:BEEF:4:CAFE:BAD:2:FACE/0		170145699920964442595609400891477785294	0
));

my $ptr = 0;
my $max = @exp -11;
plan tests => $max || 1;

sub run {
  foreach(1..5) {
    my $ip = new NetAddr::IP::Lite($exp[$ptr]);
    my $mbi = $ip->bigint();
    $mbi = $mbi + 1;
#print $ip,"\n";
#print Dumper $mbi;
#print $exp[$ptr+1],"\n";
    like($mbi, qr/(?:0|$exp[$ptr+4])/);
    $ip = new NetAddr::IP::Lite($mbi);
    is($ip, $exp[$ptr+3]);
    pass();				# ignore mask for these tests
    $ptr += 3;
  }
}

run();
$ptr += 3;
run();

$ptr += 3;

sub mrun {
  my $n = shift;
  foreach(1..$n) {
    my $ip = new NetAddr::IP::Lite($exp[$ptr]);
    my ($mbia,$mbim) = $ip->bigint();
    my($ary,$msk,$eip) = @exp[$ptr+1,$ptr+2,$ptr+3];
    $ptr += 3;
#print $msk,"\n";
#print Dumper $mbia;
#print Dumper $mbim;
    like($mbia, qr/$ary/);
    like($mbim, qr/$msk/);
    my $len = $ip->masklen();
    last unless $len;
    last if $ptr > $max + 200;		# loop stop, just in case
#print Dumper $mbim;
    $mbim = new Math::BigInt($exp[$ptr+2]);
#print Dumper $mbim;
#print Dumper $mbia;
    $ip = new NetAddr::IP::Lite($mbia,$mbim);
    is($ip, $eip);
#print '|',$ip,"|\n";
  }
}

mrun(9);

$ptr += 3;

mrun(32);