netaddr 1.5.3 → 2.0.6

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,206 @@
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
+ # filter supernet. remove subnets of subnets. basic fwd fill.
56
+ parent = NetAddr::IPv4Net.parse("10.0.0.0/24")
57
+ nets = []
58
+ ["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|
59
+ nets.push(NetAddr::IPv4Net.parse(net))
60
+ end
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
+ parent.fill(nets).each do |net|
64
+ assert_equal(expect[i],net.to_s)
65
+ i += 1
66
+ end
67
+
68
+ # basic backfill
69
+ parent = NetAddr::IPv4Net.parse("128.0.0.0/1")
70
+ nets = []
71
+ ["192.0.0.0/2"].each do |net|
72
+ nets.push(NetAddr::IPv4Net.parse(net))
73
+ end
74
+ expect = ["128.0.0.0/2", "192.0.0.0/2"]
75
+ i = 0
76
+ parent.fill(nets).each do |net|
77
+ assert_equal(expect[i],net.to_s)
78
+ i += 1
79
+ end
80
+
81
+ # basic fwd fill with non-contiguous subnets
82
+ parent = NetAddr::IPv4Net.parse("1.0.0.0/25")
83
+ nets = []
84
+ ["1.0.0.0/30", "1.0.0.64/26"].each do |net|
85
+ nets.push(NetAddr::IPv4Net.parse(net))
86
+ end
87
+ 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"]
88
+ i = 0
89
+ parent.fill(nets).each do |net|
90
+ assert_equal(expect[i],net.to_s)
91
+ i += 1
92
+ end
93
+
94
+ # basic backfill. complex fwd fill that uses 'shrink' of the proposed 1.0.16.0/21 subnet
95
+ parent = NetAddr::IPv4Net.parse("1.0.0.0/19")
96
+ nets = []
97
+ ["1.0.8.0/21", "1.0.20.0/24"].each do |net|
98
+ nets.push(NetAddr::IPv4Net.parse(net))
99
+ end
100
+ expect = ["1.0.0.0/21","1.0.8.0/21","1.0.16.0/22","1.0.20.0/24","1.0.21.0/24","1.0.22.0/23","1.0.24.0/21"]
101
+ i = 0
102
+ parent.fill(nets).each do |net|
103
+ assert_equal(expect[i],net.to_s)
104
+ i += 1
105
+ end
106
+
107
+ # list contains the supernet
108
+ parent = NetAddr::IPv4Net.parse("1.0.0.0/19")
109
+ nets = []
110
+ ["1.0.0.0/19"].each do |net|
111
+ nets.push(NetAddr::IPv4Net.parse(net))
112
+ end
113
+ expect = []
114
+ i = 0
115
+ parent.fill(nets).each do |net|
116
+ assert_equal(expect[i],net.to_s)
117
+ i += 1
118
+ end
119
+ end
120
+
121
+ def test_len
122
+ net1 = NetAddr::IPv4Net.parse("1.1.1.0/24")
123
+ assert_equal(256, net1.len())
124
+ end
125
+
126
+ def test_next
127
+ assert_equal("1.0.0.2/31", NetAddr::IPv4Net.parse("1.0.0.0/31").next.to_s)
128
+ assert_equal("1.0.0.8/29", NetAddr::IPv4Net.parse("1.0.0.4/30").next.to_s)
129
+ assert_equal("1.0.0.16/28", NetAddr::IPv4Net.parse("1.0.0.8/29").next.to_s)
130
+ end
131
+
132
+ def test_next_sib
133
+ assert_equal("255.255.255.64/26", NetAddr::IPv4Net.parse("255.255.255.0/26").next_sib.to_s)
134
+ assert_equal("255.255.255.128/26", NetAddr::IPv4Net.parse("255.255.255.64/26").next_sib.to_s)
135
+ assert_equal("255.255.255.192/26", NetAddr::IPv4Net.parse("255.255.255.128/26").next_sib.to_s)
136
+ assert_nil(NetAddr::IPv4Net.parse("255.255.255.192/26").next_sib)
137
+ end
138
+
139
+ def test_nth
140
+ assert_equal("1.1.1.1", NetAddr::IPv4Net.parse("1.1.1.0/26").nth(1).to_s)
141
+ assert_nil(NetAddr::IPv4Net.parse("1.1.1.0/26").nth(64))
142
+ end
143
+
144
+ def test_nth_subnet
145
+ assert_equal("1.1.1.0/26", NetAddr::IPv4Net.parse("1.1.1.0/24").nth_subnet(26,0).to_s)
146
+ assert_equal("1.1.1.64/26", NetAddr::IPv4Net.parse("1.1.1.0/24").nth_subnet(26,1).to_s)
147
+ assert_nil(NetAddr::IPv4Net.parse("1.1.1.0/24").nth_subnet(26,4))
148
+ assert_nil(NetAddr::IPv4Net.parse("1.1.1.0/24").nth_subnet(26,-1))
149
+ assert_nil(NetAddr::IPv4Net.parse("1.1.1.0/24").nth_subnet(24,0))
150
+ end
151
+
152
+ def test_prev
153
+ assert_equal("1.0.0.0/29", NetAddr::IPv4Net.parse("1.0.0.8/30").prev.to_s)
154
+ assert_equal("1.0.0.128/26", NetAddr::IPv4Net.parse("1.0.0.192/26").prev.to_s)
155
+ assert_equal("1.0.0.0/25", NetAddr::IPv4Net.parse("1.0.0.128/26").prev.to_s)
156
+ end
157
+
158
+ def test_prev_sib
159
+ assert_equal("0.0.0.64/26", NetAddr::IPv4Net.parse("0.0.0.128/26").prev_sib.to_s)
160
+ assert_equal("0.0.0.0/26", NetAddr::IPv4Net.parse("0.0.0.64/26").prev_sib.to_s)
161
+ assert_nil(NetAddr::IPv4Net.parse("0.0.0.0/26").prev_sib)
162
+ end
163
+
164
+ def test_rel
165
+ net1 = NetAddr::IPv4Net.parse("1.1.1.0/24")
166
+ net2 = NetAddr::IPv4Net.parse("1.1.1.0/25")
167
+ net3 = NetAddr::IPv4Net.parse("1.1.1.128/25")
168
+ net4 = NetAddr::IPv4Net.parse("1.1.1.0/25")
169
+ assert_equal(1, net1.rel(net2)) # net eq, supernet
170
+ assert_equal(-1, net2.rel(net1)) # net eq, subnet
171
+ assert_equal(0, net2.rel(net2)) # eq
172
+ assert_equal(1, net1.rel(net3)) # net ne, supernet
173
+ assert_equal(-1, net3.rel(net1)) # net ne, subnet
174
+ assert_nil(net3.rel(net4)) # unrelated
175
+ end
176
+
177
+ def test_resize
178
+ assert_equal("1.1.1.0/24", NetAddr::IPv4Net.parse("1.1.1.0/26").resize(24).to_s)
179
+ end
180
+
181
+ def test_subnet_count
182
+ assert_equal(2, NetAddr::IPv4Net.parse("1.1.1.0/24").subnet_count(25))
183
+ assert_equal(0, NetAddr::IPv4Net.parse("1.1.1.0/24").subnet_count(24))
184
+ assert_equal(0, NetAddr::IPv4Net.parse("1.1.1.0/24").subnet_count(33))
185
+ assert_equal(0, NetAddr::IPv4Net.parse("0.0.0.0/0").subnet_count(32))
186
+ end
187
+
188
+ def test_summ
189
+ net1 = NetAddr::IPv4Net.parse("1.1.1.0/30")
190
+ net2 = NetAddr::IPv4Net.parse("1.1.1.4/30")
191
+ net3 = NetAddr::IPv4Net.parse("1.1.1.16/28")
192
+ net4 = NetAddr::IPv4Net.parse("1.1.1.0/28")
193
+ net5 = NetAddr::IPv4Net.parse("1.1.2.0/30")
194
+ net6 = NetAddr::IPv4Net.parse("1.1.1.4/30")
195
+ net7 = NetAddr::IPv4Net.parse("1.1.1.16/28")
196
+ net8 = NetAddr::IPv4Net.parse("1.1.1.32/28")
197
+ net9 = NetAddr::IPv4Net.parse("1.1.1.0/29")
198
+ net10 = NetAddr::IPv4Net.parse("1.1.1.8/30")
199
+ assert_equal("1.1.1.0/29", net1.summ(net2).to_s) # lesser to greater
200
+ assert_equal("1.1.1.0/27", net3.summ(net4).to_s) # greater to lesser
201
+ assert_nil(net5.summ(net6)) # different nets
202
+ assert_nil(net7.summ(net8)) # consecutive but not within bit boundary
203
+ assert_nil(net9.summ(net10)) # within bit boundary, but not same size
204
+ end
205
+
206
+ end
data/test/ipv6_test.rb ADDED
@@ -0,0 +1,135 @@
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
+
43
+ assert_equal(0x0064ff9b0000000000000000c0000221, NetAddr::IPv6.parse("64:ff9b::192.0.2.33").addr)
44
+ assert_equal(0x0064ff9b0000000000000000c0000221, NetAddr::IPv6.parse("64:ff9b::0:192.0.2.33").addr)
45
+ assert_equal(0x0064ff9b0000000000000000c0000221, NetAddr::IPv6.parse("64:ff9b::0:0:192.0.2.33").addr)
46
+ assert_equal(0x0064ff9b0000000000000000c0000221, NetAddr::IPv6.parse("64:ff9b::0:0:0:192.0.2.33").addr)
47
+ assert_equal(0x0064ff9b0000000000000000c0000221, NetAddr::IPv6.parse("64:ff9b::0:0:0:0:192.0.2.33").addr)
48
+ assert_equal(0x0064ff9b0000000000000000c0000221, NetAddr::IPv6.parse("64:ff9b:0:0:0:0:192.0.2.33").addr)
49
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv6.parse("64:ff9b::192.0.2") }
50
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv6.parse("64:ff9b::192.0.2.33.0") }
51
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv6.parse("64:ff9b::192.0.256.33") }
52
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv6.parse("64:ff9b:0:0:0:0:0:192.0.2.33") }
53
+ assert_raise(NetAddr::ValidationError){ NetAddr::IPv6.parse("64:ff9b::0:0:0:0:0:192.0.2.33") }
54
+ end
55
+
56
+ def test_cmp
57
+ ip = NetAddr::IPv6.parse("::1")
58
+ ip2 = NetAddr::IPv6.parse("::0")
59
+ ip3 =NetAddr::IPv6.parse("::2")
60
+ ip4 = NetAddr::IPv6.parse("::1")
61
+ assert_equal(1, ip.cmp(ip2))
62
+ assert_equal(-1, ip.cmp(ip3))
63
+ assert_equal(0, ip.cmp(ip4))
64
+ end
65
+
66
+ def test_ipv4
67
+ ipv6 = NetAddr::IPv6.parse("64:ff9b::192.0.2.33")
68
+ ipv4 = ipv6.ipv4()
69
+ assert_equal("192.0.2.33", ipv4.to_s)
70
+
71
+ ipv6 = NetAddr::IPv6.parse("2001:db8:c000:221::")
72
+ ipv4 = ipv6.ipv4(32)
73
+ assert_equal("192.0.2.33", ipv4.to_s)
74
+
75
+ ipv6 = NetAddr::IPv6.parse("2001:db8:1c0:2:21::")
76
+ ipv4 = ipv6.ipv4(40)
77
+ assert_equal("192.0.2.33", ipv4.to_s)
78
+
79
+ ipv6 = NetAddr::IPv6.parse("2001:db8:122:c000:2:2100::")
80
+ ipv4 = ipv6.ipv4(48)
81
+ assert_equal("192.0.2.33", ipv4.to_s)
82
+
83
+ ipv6 = NetAddr::IPv6.parse("2001:db8:122:3c0:0:221::")
84
+ ipv4 = ipv6.ipv4(56)
85
+ assert_equal("192.0.2.33", ipv4.to_s)
86
+
87
+ ipv6 = NetAddr::IPv6.parse("2001:db8:122:344:c0:2:2100::")
88
+ ipv4 = ipv6.ipv4(64)
89
+ assert_equal("192.0.2.33", ipv4.to_s)
90
+ end
91
+
92
+ def test_long
93
+ assert_equal("0000:0000:0000:0000:0000:0000:0000:0000", NetAddr::IPv6.parse("::").long)
94
+ assert_equal("fe80:0000:0000:0000:0000:0000:0000:0001", NetAddr::IPv6.parse("fe80::1").long)
95
+ assert_equal("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", NetAddr::IPv6.new(NetAddr::F128).long)
96
+ end
97
+
98
+ def test_next
99
+ assert_equal(1, NetAddr::IPv6.parse("::").next().addr)
100
+ assert_nil(NetAddr::IPv6.parse("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff").next())
101
+ end
102
+
103
+ def test_prev
104
+ assert_equal("::", NetAddr::IPv6.parse("::1").prev().to_s)
105
+ assert_nil(NetAddr::IPv6.parse("::").prev())
106
+ end
107
+
108
+ def test_to_net
109
+ ip = NetAddr::IPv6.parse("1::")
110
+ net = NetAddr::IPv6Net.parse("1::")
111
+ assert_equal(0, net.cmp(ip.to_net()))
112
+ end
113
+
114
+ def test_to_s
115
+ assert_equal("::", NetAddr::IPv6.parse("0:0:0:0:0:0:0:0").to_s)
116
+ assert_equal("1::", NetAddr::IPv6.parse("1:0:0:0:0:0:0:0").to_s)
117
+ assert_equal("0:1::", NetAddr::IPv6.parse("0:1:0:0:0:0:0:0").to_s)
118
+ assert_equal("0:0:1::", NetAddr::IPv6.parse("0:0:1:0:0:0:0:0").to_s)
119
+ assert_equal("0:0:0:1::", NetAddr::IPv6.parse("0:0:0:1:0:0:0:0").to_s)
120
+ assert_equal("::1:0:0:0", NetAddr::IPv6.parse("0:0:0:0:1:0:0:0").to_s)
121
+ assert_equal("::1:0:0", NetAddr::IPv6.parse("0:0:0:0:0:1:0:0").to_s)
122
+ assert_equal("::1:0", NetAddr::IPv6.parse(":0:0:0:0:0:1:0").to_s)
123
+ assert_equal("::1", NetAddr::IPv6.parse("0:0:0:0:0:0:0:1").to_s)
124
+ assert_equal("1:0:1:1:1:1:1:1", NetAddr::IPv6.parse("1:0:1:1:1:1:1:1").to_s) # see RFC 5952 section 4.2.2
125
+
126
+ assert_equal("1::1", NetAddr::IPv6.parse("1:0:0:0:0:0:0:1").to_s)
127
+ assert_equal("1:1::1", NetAddr::IPv6.parse("1:1:0:0:0:0:0:1").to_s)
128
+ assert_equal("1:0:1::1", NetAddr::IPv6.parse("1:0:1:0:0:0:0:1").to_s)
129
+ assert_equal("1:0:0:1::1", NetAddr::IPv6.parse("1:0:0:1:0:0:0:1").to_s)
130
+ assert_equal("1::1:0:0:1", NetAddr::IPv6.parse("1:0:0:0:1:0:0:1").to_s)
131
+ assert_equal("1::1:0:1", NetAddr::IPv6.parse("1:0:0:0:0:1:0:1").to_s)
132
+ assert_equal("1::1:1", NetAddr::IPv6.parse("1:0:0:0:0:0:1:1").to_s)
133
+ end
134
+
135
+ end