netaddr 1.5.1 → 2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require_relative "../lib/netaddr.rb"
4
+ require 'test/unit'
5
+
6
+ class TestEUI48 < Test::Unit::TestCase
7
+ def test_new
8
+ eui = NetAddr::EUI48.new(0)
9
+ assert_equal("00-00-00-00-00-00", eui.to_s)
10
+
11
+ assert_raise(NetAddr::ValidationError){ NetAddr::EUI48.new(2**48) }
12
+ assert_raise(NetAddr::ValidationError){ NetAddr::EUI48.new(-1) }
13
+ assert_raise(NetAddr::ValidationError){ NetAddr::EUI48.new("00-00-00-00-00-00") } # string
14
+ end
15
+
16
+ def test_parse
17
+ assert_equal("aa-bb-cc-dd-ee-ff", NetAddr::EUI48.parse("aa-bb-cc-dd-ee-ff").to_s)
18
+ assert_equal("aa-bb-cc-dd-ee-ff", NetAddr::EUI48.parse("aa:bb:cc:dd:ee:ff").to_s)
19
+ assert_equal("aa-bb-cc-dd-ee-ff", NetAddr::EUI48.parse("aabb.ccdd.eeff").to_s)
20
+ assert_equal("aa-bb-cc-dd-ee-ff", NetAddr::EUI48.parse("aabbccddeeff").to_s)
21
+
22
+ assert_raise(NetAddr::ValidationError){ NetAddr::EUI48.parse("aa-bb-cc-dd-ee-ff-00-11") }
23
+ assert_raise(NetAddr::ValidationError){ NetAddr::EUI48.parse("aa-bb-cc-dd-ee-gg") }
24
+ assert_raise(NetAddr::ValidationError){ NetAddr::EUI48.parse("aa;bb;cc;dd;ee;ff") }
25
+ end
26
+
27
+ def test_to_eui64
28
+ assert_equal("aa-bb-cc-ff-fe-dd-ee-ff", NetAddr::EUI48.parse("aa-bb-cc-dd-ee-ff").to_eui64.to_s)
29
+ end
30
+ end
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require_relative "../lib/netaddr.rb"
4
+ require 'test/unit'
5
+
6
+ class TestEUI64 < Test::Unit::TestCase
7
+ def test_new
8
+ eui = NetAddr::EUI64.new(0)
9
+ assert_equal("00-00-00-00-00-00-00-00", eui.to_s)
10
+
11
+ assert_raise(NetAddr::ValidationError){ NetAddr::EUI64.new(2**64) }
12
+ assert_raise(NetAddr::ValidationError){ NetAddr::EUI64.new(-1) }
13
+ assert_raise(NetAddr::ValidationError){ NetAddr::EUI64.new("00-00-00-00-00-00-00-00") } # string
14
+ end
15
+
16
+ def test_parse
17
+ assert_equal("aa-bb-cc-dd-ee-ff-00-11", NetAddr::EUI64.parse("aa-bb-cc-dd-ee-ff-00-11").to_s)
18
+ assert_equal("aa-bb-cc-dd-ee-ff-00-11", NetAddr::EUI64.parse("aa:bb:cc:dd:ee:ff:00:11").to_s)
19
+ assert_equal("aa-bb-cc-dd-ee-ff-00-11", NetAddr::EUI64.parse("aabb.ccdd.eeff.0011").to_s)
20
+ assert_equal("aa-bb-cc-dd-ee-ff-00-11", NetAddr::EUI64.parse("aabbccddeeff0011").to_s)
21
+
22
+ assert_raise(NetAddr::ValidationError){ NetAddr::EUI64.parse("aa-bb-cc-dd-ee-ff-00-11-22") }
23
+ assert_raise(NetAddr::ValidationError){ NetAddr::EUI64.parse("aa-bb-cc-dd-ee-ff-gg") }
24
+ assert_raise(NetAddr::ValidationError){ NetAddr::EUI64.parse("aa;bb;cc;dd;ee;ff;00;11") }
25
+ end
26
+
27
+ def test_to_ipv6
28
+ net = NetAddr::IPv6Net.parse("fe80::/64")
29
+ eui = NetAddr::EUI64.parse("aa-bb-cc-dd-ee-ff-00-11")
30
+ assert_equal("fe80::a8bb:ccdd:eeff:11", eui.to_ipv6(net).to_s)
31
+ end
32
+ end
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