File: bigint.t

package info (click to toggle)
libnetaddr-ip-perl 4.079%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, buster, stretch
  • size: 1,580 kB
  • ctags: 251
  • sloc: perl: 1,417; cpp: 67; sh: 51; makefile: 9
file content (170 lines) | stat: -rw-r--r-- 7,181 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170

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);