netaddr 1.5.1 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of netaddr might be problematic. Click here for more details.

data/test/examples.rb ADDED
@@ -0,0 +1,155 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require_relative "../lib/netaddr.rb"
4
+ require 'test/unit'
5
+
6
+ # Testable examples on how to use NetAddr
7
+ class NetAddrExamples < Test::Unit::TestCase
8
+
9
+ # IPv4
10
+ def test_IPv4_examples
11
+ puts "\n*** Examples using IPv4 ***\n"
12
+
13
+ puts "\nWhat size network do I need in order to hold 200 addresses?"
14
+ puts "/" + NetAddr.ipv4_prefix_len(200).to_s
15
+ assert_equal(24,NetAddr.ipv4_prefix_len(200))
16
+
17
+ puts "\nCreating IPv4Net: '10.0.0.0/24'"
18
+ net = NetAddr::IPv4Net.parse("10.0.0.0/24")
19
+ assert_not_nil(net)
20
+
21
+ puts "\nRendering as a String: " + net.to_s
22
+ assert_equal("10.0.0.0/24", net.to_s)
23
+
24
+ puts "\nIterating its /26 subnets:"
25
+ expect = ["10.0.0.0/26","10.0.0.64/26","10.0.0.128/26","10.0.0.192/26"]
26
+ 0.upto(net.subnet_count(26) - 1) do |i|
27
+ subnet = net.nth_subnet(26,i)
28
+ assert_equal(expect[i], subnet.to_s)
29
+ puts " " + subnet.to_s
30
+ end
31
+
32
+ puts "\nIts 3rd /30 subnet:"
33
+ subnet30 = net.nth_subnet(30,2)
34
+ assert_equal("10.0.0.8/30", subnet30.to_s)
35
+ puts " " + subnet30.to_s
36
+
37
+ puts "\nIterating the IPs of the /30"
38
+ expect = ["10.0.0.8","10.0.0.9","10.0.0.10","10.0.0.11"]
39
+ 0.upto(subnet30.len - 1) do |i|
40
+ ip = subnet30.nth(i)
41
+ assert_equal(expect[i], ip.to_s)
42
+ puts " " + ip.to_s
43
+ end
44
+
45
+ puts "\nDoes 10.0.0.7 belong to the 10.0.0.8/29 subnet?"
46
+ subnet29 = NetAddr::IPv4Net.parse("10.0.0.8/29")
47
+ if subnet29.contains(NetAddr::IPv4.parse("10.0.0.7"))
48
+ puts " yes"
49
+ else
50
+ puts " no"
51
+ end
52
+
53
+ puts "\nDoes 10.0.0.10 belong to the 10.0.0.8/29 subnet?"
54
+ if subnet29.contains(NetAddr::IPv4.parse("10.0.0.10"))
55
+ puts " yes"
56
+ else
57
+ puts " no"
58
+ end
59
+
60
+ puts "\nGiven the 3rd /30 of 10.0.0.0/24, fill in the holes:"
61
+ expect = ["10.0.0.0/29","10.0.0.8/30","10.0.0.12/30","10.0.0.16/28","10.0.0.32/27","10.0.0.64/26","10.0.0.128/25"]
62
+ i = 0
63
+ net.fill([subnet30]).each do |subnet|
64
+ puts " " + subnet.to_s
65
+ assert_equal(expect[i], subnet.to_s)
66
+ i+=1
67
+ end
68
+
69
+ list = ["10.0.1.0/24", "10.0.0.0/25", "10.0.0.128/26","10.0.2.0/24", "10.0.0.192/26",]
70
+ puts "\nSummarizing this list of networks: " + list.to_s
71
+ nets = []
72
+ list.each do |net|
73
+ nets.push(NetAddr::IPv4Net.parse(net))
74
+ end
75
+ expect = ["10.0.0.0/23", "10.0.2.0/24",]
76
+ i = 0
77
+ NetAddr.summ_IPv4Net(nets).each do |net|
78
+ puts " " + net.to_s
79
+ assert_equal(expect[i],net.to_s)
80
+ i += 1
81
+ end
82
+
83
+ puts "\nThe multicast mac-address for 235.147.18.23 is:"
84
+ mac = NetAddr::IPv4.parse("235.147.18.23").multicast_mac.to_s
85
+ assert_equal("01-00-5e-13-12-17", mac)
86
+ puts " " + mac
87
+ end
88
+
89
+ # IPv6
90
+ def test_IPv6_examples
91
+ puts "\n\n*** Examples using IPv6 ***\n"
92
+
93
+ puts "\nCreating IPv6Net: 'fec0::/62'"
94
+ net = NetAddr::IPv6Net.parse("fec0::/62")
95
+ assert_not_nil(net)
96
+
97
+ puts "\nRendering as a String: " + net.to_s
98
+ assert_equal("fec0::/62", net.to_s)
99
+
100
+ puts "\nRendering as a String (long format): " + net.long
101
+ assert_equal("fec0:0000:0000:0000:0000:0000:0000:0000/62", net.long)
102
+
103
+ puts "\nIterating its /64 subnets:"
104
+ expect = ["fec0::/64","fec0:0:0:1::/64","fec0:0:0:2::/64","fec0:0:0:3::/64"]
105
+ 0.upto(net.subnet_count(64) - 1) do |i|
106
+ subnet = net.nth_subnet(64,i)
107
+ assert_equal(expect[i], subnet.to_s)
108
+ puts " " + subnet.to_s
109
+ end
110
+
111
+ puts "\nIts 3rd /64 subnet:"
112
+ subnet64 = net.nth_subnet(64,2)
113
+ assert_equal("fec0:0:0:2::/64", subnet64.to_s)
114
+ puts " " + subnet64.to_s
115
+
116
+ puts "\nIterating the first 4 IPs of the /64"
117
+ expect = ["fec0:0:0:2::","fec0:0:0:2::1","fec0:0:0:2::2","fec0:0:0:2::3"]
118
+ 0.upto(3) do |i|
119
+ ip = subnet64.nth(i)
120
+ assert_equal(expect[i], ip.to_s)
121
+ puts " " + ip.to_s
122
+ end
123
+
124
+ puts "\nGiven the 3rd /64 of fec0::/62, fill in the holes:"
125
+ expect = ["fec0::/63", "fec0:0:0:2::/64","fec0:0:0:3::/64"]
126
+ i = 0
127
+ net.fill([subnet64]).each do |subnet|
128
+ puts " " + subnet.to_s
129
+ assert_equal(expect[i], subnet.to_s)
130
+ i+=1
131
+ end
132
+
133
+ list = ["fec0::/63", "fec0:0:0:3::/64", "fec0:0:0:2::/64", "fe80::/17", "fe80:8000::/17"]
134
+ puts "\nSummarizing this list of networks: " + list.to_s
135
+ nets = []
136
+ list.each do |net|
137
+ nets.push(NetAddr::IPv6Net.parse(net))
138
+ end
139
+ expect = ["fe80::/16", "fec0::/62"]
140
+ i = 0
141
+ NetAddr.summ_IPv6Net(nets).each do |net|
142
+ puts " " + net.to_s
143
+ assert_equal(expect[i],net.to_s)
144
+ i += 1
145
+ end
146
+
147
+ puts "\nThe IPv6 address for mac-address aa-bb-cc-dd-ee-ff within network fe80::/64 is:"
148
+ net = NetAddr::IPv6Net.parse("fe80::/64")
149
+ eui = NetAddr::EUI48.parse("aa-bb-cc-dd-ee-ff").to_eui64
150
+ ip = eui.to_ipv6(net)
151
+ assert_equal("fe80::a8bb:ccff:fedd:eeff",ip.to_s)
152
+ puts " " + ip.to_s
153
+ end
154
+
155
+ end
data/test/ipv4_test.rb ADDED
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require_relative "../lib/netaddr.rb"
4
+ require 'test/unit'
5
+
6
+ class TestIPv4 < Test::Unit::TestCase
7
+ def test_new
8
+ ip = NetAddr::IPv4.new(0x80000001)
9
+ assert_equal("128.0.0.1", ip.to_s)
10
+
11
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv4.new(0x8000000001) }
12
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv4.new(-1) }
13
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv4.new("128.0.0.1") } # string
14
+ end
15
+
16
+ def test_parse
17
+ assert_equal("128.0.0.1", NetAddr::IPv4.parse("128.0.0.1").to_s)
18
+ assert_equal("0.0.0.0", NetAddr::IPv4.parse("0.0.0.0").to_s)
19
+
20
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv4.parse("128.0.0.1a") }
21
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv4.parse("256.0.0.1") }
22
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv4.parse("128.0.0.1.1") }
23
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv4.parse("128") }
24
+ end
25
+
26
+ def test_cmp
27
+ ip = NetAddr::IPv4.parse("128.0.0.1")
28
+ ip2 = NetAddr::IPv4.parse("128.0.0.0")
29
+ ip3 = NetAddr::IPv4.parse("128.0.0.2")
30
+ ip4 = NetAddr::IPv4.parse("128.0.0.1")
31
+ assert_equal(1, ip.cmp(ip2))
32
+ assert_equal(-1, ip.cmp(ip3))
33
+ assert_equal(0, ip.cmp(ip4))
34
+ end
35
+
36
+ def test_multicast_mac
37
+ assert_equal(0, NetAddr::IPv4.parse("223.255.255.255").multicast_mac.addr)
38
+ assert_equal("01-00-5e-00-00-00", NetAddr::IPv4.parse("224.0.0.0").multicast_mac.to_s)
39
+ assert_equal("01-00-5e-02-03-05", NetAddr::IPv4.parse("230.2.3.5").multicast_mac.to_s)
40
+ assert_equal("01-00-5e-13-12-17", NetAddr::IPv4.parse("235.147.18.23").multicast_mac.to_s)
41
+ assert_equal("01-00-5e-7f-ff-ff", NetAddr::IPv4.parse("239.255.255.255").multicast_mac.to_s)
42
+ assert_equal(0, NetAddr::IPv4.parse("240.0.0.0").multicast_mac.addr)
43
+ end
44
+
45
+ def test_next
46
+ assert_equal("255.255.255.255", NetAddr::IPv4.parse("255.255.255.254").next().to_s)
47
+ assert_nil(NetAddr::IPv4.parse("255.255.255.255").next())
48
+ end
49
+
50
+ def test_prev
51
+ assert_equal("0.0.0.0", NetAddr::IPv4.parse("0.0.0.1").prev().to_s)
52
+ assert_nil(NetAddr::IPv4.parse("0.0.0.0").prev())
53
+ end
54
+
55
+ def test_to_net
56
+ ip = NetAddr::IPv4.parse("192.168.1.1")
57
+ net = NetAddr::IPv4Net.parse("192.168.1.1")
58
+ assert_equal(0, net.cmp(ip.to_net()))
59
+ end
60
+ end
@@ -0,0 +1,177 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require_relative "../lib/netaddr.rb"
4
+ require 'test/unit'
5
+
6
+ class TestIPv4Net < Test::Unit::TestCase
7
+ def test_new
8
+ ip = NetAddr::IPv4.parse("128.0.0.1")
9
+ m32 = NetAddr::Mask32.new(24)
10
+ net = NetAddr::IPv4Net.new(ip,m32)
11
+ assert_equal("128.0.0.0/24", net.to_s)
12
+
13
+ net = NetAddr::IPv4Net.new(ip,nil)
14
+ assert_equal("128.0.0.1/32", net.to_s)
15
+ end
16
+
17
+ def test_parse
18
+ assert_equal("128.0.0.0/24", NetAddr::IPv4Net.parse("128.0.0.1/24").to_s)
19
+ assert_equal("128.0.0.0/24", NetAddr::IPv4Net.parse("128.0.0.1 255.255.255.0").to_s)
20
+ assert_equal("0.0.0.0/0", NetAddr::IPv4Net.parse("0.0.0.0/0").to_s)
21
+ assert_equal("128.0.0.1/32", NetAddr::IPv4Net.parse("128.0.0.1").to_s) # default /32
22
+ end
23
+
24
+ def test_cmp
25
+ net1 = NetAddr::IPv4Net.parse("1.1.1.0/24")
26
+ net2 = NetAddr::IPv4Net.parse("1.1.0.0/24")
27
+ net3 =NetAddr::IPv4Net.parse("1.1.2.0/24")
28
+ net4 = NetAddr::IPv4Net.parse("1.1.1.0/25")
29
+ net5 = NetAddr::IPv4Net.parse("1.1.1.0/24")
30
+
31
+ assert_equal(1, net1.cmp(net2)) # ip less
32
+ assert_equal(-1, net1.cmp(net3))# ip greater
33
+ assert_equal(-1, net4.cmp(net1)) # ip eq, mask less
34
+ assert_equal(1, net1.cmp(net4)) # ip eq, mask greater
35
+ assert_equal(0, net1.cmp(net5)) # eq
36
+ end
37
+
38
+ def test_contains
39
+ net = NetAddr::IPv4Net.parse("1.0.0.8/29")
40
+ ip1 = NetAddr::IPv4.parse("1.0.0.15")
41
+ ip2 = NetAddr::IPv4.parse("1.0.0.16")
42
+ ip3 = NetAddr::IPv4.parse("1.0.0.7")
43
+
44
+ assert_equal(true, net.contains(ip1))
45
+ assert_equal(false, net.contains(ip2))
46
+ assert_equal(false, net.contains(ip3))
47
+ end
48
+
49
+ def test_extended
50
+ net = NetAddr::IPv4Net.parse("128.0.0.1/24")
51
+ assert_equal("128.0.0.0 255.255.255.0", net.extended)
52
+ end
53
+
54
+ def test_fill
55
+ parent = NetAddr::IPv4Net.parse("10.0.0.0/24")
56
+ nets = []
57
+ ["10.0.0.0/24", "10.0.0.0/8", "10.0.0.8/30", "10.0.0.16/30", "10.0.0.16/28"].each do |net|
58
+ nets.push(NetAddr::IPv4Net.parse(net))
59
+ end
60
+ expect = ["10.0.0.0/29", "10.0.0.8/30", "10.0.0.12/30", "10.0.0.16/28", "10.0.0.32/27", "10.0.0.64/26", "10.0.0.128/25"]
61
+ i = 0
62
+ parent.fill(nets).each do |net|
63
+ assert_equal(expect[i],net.to_s)
64
+ i += 1
65
+ end
66
+
67
+ parent = NetAddr::IPv4Net.parse("128.0.0.0/1")
68
+ nets = []
69
+ ["192.0.0.0/2"].each do |net|
70
+ nets.push(NetAddr::IPv4Net.parse(net))
71
+ end
72
+ expect = ["128.0.0.0/2", "192.0.0.0/2"]
73
+ i = 0
74
+ parent.fill(nets).each do |net|
75
+ assert_equal(expect[i],net.to_s)
76
+ i += 1
77
+ end
78
+
79
+ parent = NetAddr::IPv4Net.parse("1.0.0.0/25")
80
+ nets = []
81
+ ["1.0.0.0/30", "1.0.0.64/26"].each do |net|
82
+ nets.push(NetAddr::IPv4Net.parse(net))
83
+ end
84
+ expect = ["1.0.0.0/30", "1.0.0.4/30", "1.0.0.8/29", "1.0.0.16/28", "1.0.0.32/27", "1.0.0.64/26"]
85
+ i = 0
86
+ parent.fill(nets).each do |net|
87
+ assert_equal(expect[i],net.to_s)
88
+ i += 1
89
+ end
90
+ end
91
+
92
+ def test_len
93
+ net1 = NetAddr::IPv4Net.parse("1.1.1.0/24")
94
+ assert_equal(256, net1.len())
95
+ end
96
+
97
+ def test_next
98
+ assert_equal("1.0.0.2/31", NetAddr::IPv4Net.parse("1.0.0.0/31").next.to_s)
99
+ assert_equal("1.0.0.8/29", NetAddr::IPv4Net.parse("1.0.0.4/30").next.to_s)
100
+ assert_equal("1.0.0.16/28", NetAddr::IPv4Net.parse("1.0.0.8/29").next.to_s)
101
+ end
102
+
103
+ def test_next_sib
104
+ assert_equal("255.255.255.64/26", NetAddr::IPv4Net.parse("255.255.255.0/26").next_sib.to_s)
105
+ assert_equal("255.255.255.128/26", NetAddr::IPv4Net.parse("255.255.255.64/26").next_sib.to_s)
106
+ assert_equal("255.255.255.192/26", NetAddr::IPv4Net.parse("255.255.255.128/26").next_sib.to_s)
107
+ assert_nil(NetAddr::IPv4Net.parse("255.255.255.192/26").next_sib)
108
+ end
109
+
110
+ def test_nth
111
+ assert_equal("1.1.1.1", NetAddr::IPv4Net.parse("1.1.1.0/26").nth(1).to_s)
112
+ assert_nil(NetAddr::IPv4Net.parse("1.1.1.0/26").nth(64))
113
+ end
114
+
115
+ def test_nth_subnet
116
+ assert_equal("1.1.1.0/26", NetAddr::IPv4Net.parse("1.1.1.0/24").nth_subnet(26,0).to_s)
117
+ assert_equal("1.1.1.64/26", NetAddr::IPv4Net.parse("1.1.1.0/24").nth_subnet(26,1).to_s)
118
+ assert_nil(NetAddr::IPv4Net.parse("1.1.1.0/24").nth_subnet(26,4))
119
+ assert_nil(NetAddr::IPv4Net.parse("1.1.1.0/24").nth_subnet(26,-1))
120
+ assert_nil(NetAddr::IPv4Net.parse("1.1.1.0/24").nth_subnet(24,0))
121
+ end
122
+
123
+ def test_prev
124
+ assert_equal("1.0.0.0/29", NetAddr::IPv4Net.parse("1.0.0.8/30").prev.to_s)
125
+ assert_equal("1.0.0.128/26", NetAddr::IPv4Net.parse("1.0.0.192/26").prev.to_s)
126
+ assert_equal("1.0.0.0/25", NetAddr::IPv4Net.parse("1.0.0.128/26").prev.to_s)
127
+ end
128
+
129
+ def test_prev_sib
130
+ assert_equal("0.0.0.64/26", NetAddr::IPv4Net.parse("0.0.0.128/26").prev_sib.to_s)
131
+ assert_equal("0.0.0.0/26", NetAddr::IPv4Net.parse("0.0.0.64/26").prev_sib.to_s)
132
+ assert_nil(NetAddr::IPv4Net.parse("0.0.0.0/26").prev_sib)
133
+ end
134
+
135
+ def test_rel
136
+ net1 = NetAddr::IPv4Net.parse("1.1.1.0/24")
137
+ net2 = NetAddr::IPv4Net.parse("1.1.1.0/25")
138
+ net3 = NetAddr::IPv4Net.parse("1.1.1.128/25")
139
+ net4 = NetAddr::IPv4Net.parse("1.1.1.0/25")
140
+ assert_equal(1, net1.rel(net2)) # net eq, supernet
141
+ assert_equal(-1, net2.rel(net1)) # net eq, subnet
142
+ assert_equal(0, net2.rel(net2)) # eq
143
+ assert_equal(1, net1.rel(net3)) # net ne, supernet
144
+ assert_equal(-1, net3.rel(net1)) # net ne, subnet
145
+ assert_nil(net3.rel(net4)) # unrelated
146
+ end
147
+
148
+ def test_resize
149
+ assert_equal("1.1.1.0/24", NetAddr::IPv4Net.parse("1.1.1.0/26").resize(24).to_s)
150
+ end
151
+
152
+ def test_subnet_count
153
+ assert_equal(2, NetAddr::IPv4Net.parse("1.1.1.0/24").subnet_count(25))
154
+ assert_equal(0, NetAddr::IPv4Net.parse("1.1.1.0/24").subnet_count(24))
155
+ assert_equal(0, NetAddr::IPv4Net.parse("1.1.1.0/24").subnet_count(33))
156
+ assert_equal(0, NetAddr::IPv4Net.parse("0.0.0.0/0").subnet_count(32))
157
+ end
158
+
159
+ def test_summ
160
+ net1 = NetAddr::IPv4Net.parse("1.1.1.0/30")
161
+ net2 = NetAddr::IPv4Net.parse("1.1.1.4/30")
162
+ net3 = NetAddr::IPv4Net.parse("1.1.1.16/28")
163
+ net4 = NetAddr::IPv4Net.parse("1.1.1.0/28")
164
+ net5 = NetAddr::IPv4Net.parse("1.1.2.0/30")
165
+ net6 = NetAddr::IPv4Net.parse("1.1.1.4/30")
166
+ net7 = NetAddr::IPv4Net.parse("1.1.1.16/28")
167
+ net8 = NetAddr::IPv4Net.parse("1.1.1.32/28")
168
+ net9 = NetAddr::IPv4Net.parse("1.1.1.0/29")
169
+ net10 = NetAddr::IPv4Net.parse("1.1.1.8/30")
170
+ assert_equal("1.1.1.0/29", net1.summ(net2).to_s) # lesser to greater
171
+ assert_equal("1.1.1.0/27", net3.summ(net4).to_s) # greater to lesser
172
+ assert_nil(net5.summ(net6)) # different nets
173
+ assert_nil(net7.summ(net8)) # consecutive but not within bit boundary
174
+ assert_nil(net9.summ(net10)) # within bit boundary, but not same size
175
+ end
176
+
177
+ end
data/test/ipv6_test.rb ADDED
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require_relative "../lib/netaddr.rb"
4
+ require 'test/unit'
5
+
6
+ class TestIPv6 < Test::Unit::TestCase
7
+ def test_new
8
+ ip = NetAddr::IPv6.new(1)
9
+ assert_equal(1, ip.addr)
10
+
11
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv6.new(2**128) }
12
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv6.new(-1) }
13
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv6.new("::") } # string
14
+ end
15
+
16
+ def test_parse
17
+ assert_equal(0, NetAddr::IPv6.parse("::").addr)
18
+ assert_equal(1, NetAddr::IPv6.parse("::1").addr)
19
+ assert_equal(0xfe800000000000000000000000000000, NetAddr::IPv6.parse("fe80::").addr)
20
+
21
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv6.parse("fe80::1::") }
22
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv6.parse("::fe80::") }
23
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv6.parse("0:0:0:0:0:0:0:0:1") }
24
+ assert_equal(1, NetAddr::IPv6.parse("::0:0:0:0:0:0:1").addr)
25
+ assert_equal(0x00010002000300040005000600070008, NetAddr::IPv6.parse("1:2:3:4:5:6:7:8").addr)
26
+ assert_equal(0x00010002000300040005000600070000, NetAddr::IPv6.parse("1:2:3:4:5:6:7::").addr)
27
+ assert_equal(0x00010002000300040005000600000000, NetAddr::IPv6.parse("1:2:3:4:5:6::").addr)
28
+ assert_equal(0x00010002000300040005000000000000, NetAddr::IPv6.parse("1:2:3:4:5::").addr)
29
+ assert_equal(0x00010002000300040000000000000000, NetAddr::IPv6.parse("1:2:3:4::").addr)
30
+ assert_equal(0x00010002000300000000000000000000, NetAddr::IPv6.parse("1:2:3::").addr)
31
+ assert_equal(0x00010002000000000000000000000000, NetAddr::IPv6.parse("1:2::").addr)
32
+ assert_equal(0x00010000000000000000000000000000, NetAddr::IPv6.parse("1::").addr)
33
+ assert_equal(0x00000000000000000000000000000001, NetAddr::IPv6.parse("::1").addr)
34
+ assert_equal(0x00000000000000000000000000010002, NetAddr::IPv6.parse("::1:2").addr)
35
+ assert_equal(0x00000000000000000000000100020003, NetAddr::IPv6.parse("::1:2:3").addr)
36
+ assert_equal(0x00000000000000000001000200030004, NetAddr::IPv6.parse("::1:2:3:4").addr)
37
+ assert_equal(0x00000000000000010002000300040005, NetAddr::IPv6.parse("::1:2:3:4:5").addr)
38
+ assert_equal(0x00000000000100020003000400050006, NetAddr::IPv6.parse("::1:2:3:4:5:6").addr)
39
+ assert_equal(0x00000001000200030004000500060007, NetAddr::IPv6.parse("::1:2:3:4:5:6:7").addr)
40
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv6.parse("fec0") }
41
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv6.parse("fec0:::1") }
42
+ end
43
+
44
+ def test_cmp
45
+ ip = NetAddr::IPv6.parse("::1")
46
+ ip2 = NetAddr::IPv6.parse("::0")
47
+ ip3 =NetAddr::IPv6.parse("::2")
48
+ ip4 = NetAddr::IPv6.parse("::1")
49
+ assert_equal(1, ip.cmp(ip2))
50
+ assert_equal(-1, ip.cmp(ip3))
51
+ assert_equal(0, ip.cmp(ip4))
52
+ end
53
+
54
+ def test_long
55
+ assert_equal("0000:0000:0000:0000:0000:0000:0000:0000", NetAddr::IPv6.parse("::").long)
56
+ assert_equal("fe80:0000:0000:0000:0000:0000:0000:0001", NetAddr::IPv6.parse("fe80::1").long)
57
+ assert_equal("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", NetAddr::IPv6.new(NetAddr::F128).long)
58
+ end
59
+
60
+ def test_next
61
+ assert_equal(1, NetAddr::IPv6.parse("::").next().addr)
62
+ assert_nil(NetAddr::IPv6.parse("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff").next())
63
+ end
64
+
65
+ def test_prev
66
+ assert_equal("::", NetAddr::IPv6.parse("::1").prev().to_s)
67
+ assert_nil(NetAddr::IPv6.parse("::").prev())
68
+ end
69
+
70
+ def test_to_net
71
+ ip = NetAddr::IPv6.parse("1::")
72
+ net = NetAddr::IPv6Net.parse("1::")
73
+ assert_equal(0, net.cmp(ip.to_net()))
74
+ end
75
+
76
+ def test_to_s
77
+ assert_equal("::", NetAddr::IPv6.parse("0:0:0:0:0:0:0:0").to_s)
78
+ assert_equal("1::", NetAddr::IPv6.parse("1:0:0:0:0:0:0:0").to_s)
79
+ assert_equal("0:1::", NetAddr::IPv6.parse("0:1:0:0:0:0:0:0").to_s)
80
+ assert_equal("0:0:1::", NetAddr::IPv6.parse("0:0:1:0:0:0:0:0").to_s)
81
+ assert_equal("0:0:0:1::", NetAddr::IPv6.parse("0:0:0:1:0:0:0:0").to_s)
82
+ assert_equal("::1:0:0:0", NetAddr::IPv6.parse("0:0:0:0:1:0:0:0").to_s)
83
+ assert_equal("::1:0:0", NetAddr::IPv6.parse("0:0:0:0:0:1:0:0").to_s)
84
+ assert_equal("::1:0", NetAddr::IPv6.parse(":0:0:0:0:0:1:0").to_s)
85
+ assert_equal("::1", NetAddr::IPv6.parse("0:0:0:0:0:0:0:1").to_s)
86
+
87
+ assert_equal("1::1", NetAddr::IPv6.parse("1:0:0:0:0:0:0:1").to_s)
88
+ assert_equal("1:1::1", NetAddr::IPv6.parse("1:1:0:0:0:0:0:1").to_s)
89
+ assert_equal("1:0:1::1", NetAddr::IPv6.parse("1:0:1:0:0:0:0:1").to_s)
90
+ assert_equal("1:0:0:1::1", NetAddr::IPv6.parse("1:0:0:1:0:0:0:1").to_s)
91
+ assert_equal("1::1:0:0:1", NetAddr::IPv6.parse("1:0:0:0:1:0:0:1").to_s)
92
+ assert_equal("1::1:0:1", NetAddr::IPv6.parse("1:0:0:0:0:1:0:1").to_s)
93
+ assert_equal("1::1:1", NetAddr::IPv6.parse("1:0:0:0:0:0:1:1").to_s)
94
+ end
95
+
96
+ end
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require_relative "../lib/netaddr.rb"
4
+ require 'test/unit'
5
+
6
+ class TestIPv6Net < Test::Unit::TestCase
7
+ def test_new
8
+ ip = NetAddr::IPv6.parse("1::")
9
+ m128 = NetAddr::Mask128.new(24)
10
+ net = NetAddr::IPv6Net.new(ip,m128)
11
+ assert_equal("1::/24", net.to_s)
12
+
13
+ assert_equal("1::/64", NetAddr::IPv6Net.new(ip,nil).to_s)
14
+
15
+ ip = NetAddr::IPv6.parse("::")
16
+ assert_equal("::/128", NetAddr::IPv6Net.new(ip,nil).to_s)
17
+ end
18
+
19
+ def test_parse
20
+ assert_equal("1::/24", NetAddr::IPv6Net.parse("1::1/24").to_s)
21
+ assert_equal("::/128", NetAddr::IPv6Net.parse("::").to_s) # default /128
22
+ assert_equal("1::/64", NetAddr::IPv6Net.parse("1::1").to_s) # default /64
23
+ end
24
+
25
+ def test_cmp
26
+ net1 = NetAddr::IPv6Net.parse("1:1::/32")
27
+ net2 = NetAddr::IPv6Net.parse("1::/32")
28
+ net3 =NetAddr::IPv6Net.parse("1:2::/32")
29
+ net4 = NetAddr::IPv6Net.parse("1:1::/33")
30
+ net5 = NetAddr::IPv6Net.parse("1:1::/32")
31
+
32
+ assert_equal(1, net1.cmp(net2)) # ip less
33
+ assert_equal(-1, net1.cmp(net3))# ip greater
34
+ assert_equal(-1, net4.cmp(net1)) # ip eq, mask less
35
+ assert_equal(1, net1.cmp(net4)) # ip eq, mask greater
36
+ assert_equal(0, net1.cmp(net5)) # eq
37
+ end
38
+
39
+ def test_contains
40
+ net = NetAddr::IPv6Net.parse("1:8::/29")
41
+ ip1 = NetAddr::IPv6.parse("1:f::")
42
+ ip2 = NetAddr::IPv6.parse("1:10::")
43
+ ip3 = NetAddr::IPv6.parse("1:7::")
44
+
45
+ assert_equal(true, net.contains(ip1))
46
+ assert_equal(false, net.contains(ip2))
47
+ assert_equal(false, net.contains(ip3))
48
+ end
49
+
50
+ def test_fill
51
+ parent = NetAddr::IPv6Net.parse("ff00::/8")
52
+ nets = []
53
+ ["ff08::/14", "fe00::/7", "ff20::/11", "ff20::/12"].each do |net|
54
+ nets.push(NetAddr::IPv6Net.parse(net))
55
+ end
56
+ expect = ["ff00::/13", "ff08::/14", "ff0c::/14", "ff10::/12", "ff20::/11", "ff40::/10", "ff80::/9"]
57
+ i = 0
58
+ parent.fill(nets).each do |net|
59
+ assert_equal(expect[i],net.to_s)
60
+ i += 1
61
+ end
62
+
63
+ parent = NetAddr::IPv6Net.parse("ff00::/121")
64
+ nets = []
65
+ ["ff00::/126", "ff00::/120"].each do |net|
66
+ nets.push(NetAddr::IPv6Net.parse(net))
67
+ end
68
+ expect = ["ff00::/126", "ff00::4/126", "ff00::8/125", "ff00::10/124", "ff00::20/123", "ff00::40/122"]
69
+ i = 0
70
+ parent.fill(nets).each do |net|
71
+ assert_equal(expect[i],net.to_s)
72
+ i += 1
73
+ end
74
+ end
75
+
76
+ def test_next
77
+ assert_equal("::2/127", NetAddr::IPv6Net.parse("::/127").next.to_s)
78
+ assert_equal("::8/125", NetAddr::IPv6Net.parse("::4/126").next.to_s)
79
+ assert_equal("0:0:0:2::/63", NetAddr::IPv6Net.parse("::1:8000:0:0:0/65").next.to_s)
80
+ assert_equal("0:0:0:3::/64", NetAddr::IPv6Net.parse("::2:8000:0:0:0/65").next.to_s)
81
+ assert_nil(NetAddr::IPv6Net.parse("ffff::/16").next)
82
+ end
83
+
84
+ def test_next_sib
85
+ assert_equal("0:0:0:2::/65", NetAddr::IPv6Net.parse("::1:8000:0:0:0/65",).next_sib.to_s)
86
+ assert_equal("0:0:0:2::/64", NetAddr::IPv6Net.parse("0:0:0:1::/64",).next_sib.to_s)
87
+ assert_equal("2::/16", NetAddr::IPv6Net.parse("1::/16").next_sib.to_s)
88
+ assert_nil(NetAddr::IPv6Net.parse("ffff::/16").next_sib)
89
+ end
90
+
91
+ def test_nth
92
+ assert_equal("1::", NetAddr::IPv6Net.parse("1::0/64").nth(0).to_s)
93
+ assert_equal("::", NetAddr::IPv6Net.parse("::/127").nth(0).to_s)
94
+ assert_equal("::1", NetAddr::IPv6Net.parse("::/127").nth(1).to_s)
95
+ assert_nil(NetAddr::IPv6Net.parse("::/127").nth(2))
96
+ end
97
+
98
+ def test_nth_subnet
99
+ assert_equal("1::/30", NetAddr::IPv6Net.parse("1::/24").nth_subnet(30,0).to_s)
100
+ assert_nil(NetAddr::IPv6Net.parse("1::").nth_subnet(26,4))
101
+ end
102
+
103
+ def test_prev
104
+ assert_equal("1::/125", NetAddr::IPv6Net.parse("1::8/126").prev.to_s)
105
+ assert_equal("f::/63", NetAddr::IPv6Net.parse("f:0:0:2::/63").prev.to_s)
106
+ assert_equal("e::/16", NetAddr::IPv6Net.parse("f::/63").prev.to_s)
107
+ assert_nil(NetAddr::IPv6Net.parse("::").prev)
108
+ end
109
+
110
+ def test_prev_sib
111
+ assert_equal("0:0:0:1::/64", NetAddr::IPv6Net.parse("0:0:0:2::/64").prev_sib.to_s)
112
+ assert_equal("1::/16", NetAddr::IPv6Net.parse("2::/16").prev_sib.to_s)
113
+ assert_nil(NetAddr::IPv6Net.parse("::/64").prev_sib)
114
+ end
115
+
116
+ def test_rel
117
+ net1 = NetAddr::IPv6Net.parse("1::/63")
118
+ net2 = NetAddr::IPv6Net.parse("1::/64")
119
+ net3 = NetAddr::IPv6Net.parse("1::/60")
120
+ net4 = NetAddr::IPv6Net.parse("1:0:0:1::/64")
121
+ net5 = NetAddr::IPv6Net.parse("2::/64")
122
+ assert_equal(1, net1.rel(net2)) # net eq, supernet
123
+ assert_equal(-1, net2.rel(net1)) # net eq, subnet
124
+ assert_equal(0, net2.rel(net2)) # eq
125
+ assert_equal(1, net3.rel(net4)) # net ne, supernet
126
+ assert_equal(-1, net4.rel(net3)) # net ne, subnet
127
+ assert_nil(net2.rel(net5)) # unrelated
128
+ end
129
+
130
+ def test_resize
131
+ assert_equal("1::/64", NetAddr::IPv6Net.parse("1::/63").resize(64).to_s)
132
+ end
133
+
134
+ def test_subnet_count
135
+ assert_equal(2, NetAddr::IPv6Net.parse("ff::/8").subnet_count(9))
136
+ assert_equal(4, NetAddr::IPv6Net.parse("ff::/8").subnet_count(10))
137
+ assert_equal(0, NetAddr::IPv6Net.parse("ff::/8").subnet_count(8))
138
+ assert_equal(0, NetAddr::IPv6Net.parse("::/0").subnet_count(128))
139
+ end
140
+
141
+ def test_summ
142
+ net1 = NetAddr::IPv6Net.parse("1::/128")
143
+ net2 = NetAddr::IPv6Net.parse("1::1/128")
144
+ net3 = NetAddr::IPv6Net.parse("1::0/128")
145
+ net4 = NetAddr::IPv6Net.parse("1::/16")
146
+ net5 = NetAddr::IPv6Net.parse("2::/16")
147
+ net6 = NetAddr::IPv6Net.parse("10::/12")
148
+ net7 = NetAddr::IPv6Net.parse("20::/12")
149
+ net8 = NetAddr::IPv6Net.parse("8::/17")
150
+ assert_equal("1::/127", net1.summ(net2).to_s) # lesser to greater
151
+ assert_equal("1::/127", net2.summ(net3).to_s) # greater to lesser
152
+ assert_nil(net4.summ(net5)) # different nets
153
+ assert_nil(net6.summ(net7)) # consecutive but not within bit boundary
154
+ assert_nil(net4.summ(net8)) # within bit boundary, but not same size
155
+ end
156
+
157
+ end
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require_relative "../lib/netaddr.rb"
4
+ require 'test/unit'
5
+
6
+ class TestMask128 < Test::Unit::TestCase
7
+ def test_new
8
+ m128 = NetAddr::Mask128.new(24)
9
+ assert_equal("/24", m128.to_s)
10
+ assert_equal(0xffffff00000000000000000000000000, m128.mask)
11
+
12
+ assert_raise(NetAddr::ValidationError){ NetAddr::Mask128.new(-1) }
13
+ assert_raise(NetAddr::ValidationError){ NetAddr::Mask128.new(129) }
14
+ assert_raise(NetAddr::ValidationError){ NetAddr::Mask128.new("/24") }
15
+ end
16
+
17
+ def test_parse
18
+ m128 = NetAddr::Mask128.parse("/24")
19
+ assert_equal("/24", m128.to_s)
20
+
21
+ m128 = NetAddr::Mask128.parse("24")
22
+ assert_equal("/24", m128.to_s)
23
+
24
+ assert_raise(NetAddr::ValidationError){ NetAddr::Mask128.parse("/129") }
25
+ end
26
+
27
+ def test_cmp
28
+ m = NetAddr::Mask128.new(24)
29
+ m2 = NetAddr::Mask128.new(25)
30
+ m3 = NetAddr::Mask128.new(23)
31
+ m4 = NetAddr::Mask128.new(24)
32
+ assert_equal(1, m.cmp(m2))
33
+ assert_equal(-1, m.cmp(m3))
34
+ assert_equal(0, m.cmp(m4))
35
+ end
36
+
37
+ def test_len
38
+ m = NetAddr::Mask128.new(65)
39
+ assert_equal(2**(128-65), m.len())
40
+
41
+ m = NetAddr::Mask128.new(64)
42
+ assert_equal(0, m.len())
43
+ end
44
+
45
+ end