netaddr 1.5.0 → 2.0.4

Sign up to get free protection for your applications and to get access to all the features.
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