netaddr 1.5.3 → 2.0.1

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,137 @@
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 "\nGiven the 3rd /30 of 10.0.0.0/24, fill in the holes:"
46
+ 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"]
47
+ i = 0
48
+ net.fill([subnet30]).each do |subnet|
49
+ puts " " + subnet.to_s
50
+ assert_equal(expect[i], subnet.to_s)
51
+ i+=1
52
+ end
53
+
54
+ 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",]
55
+ puts "\nSummarizing this list of networks: " + list.to_s
56
+ nets = []
57
+ list.each do |net|
58
+ nets.push(NetAddr::IPv4Net.parse(net))
59
+ end
60
+ expect = ["10.0.0.0/23", "10.0.2.0/24",]
61
+ i = 0
62
+ NetAddr.summ_IPv4Net(nets).each do |net|
63
+ puts " " + net.to_s
64
+ assert_equal(expect[i],net.to_s)
65
+ i += 1
66
+ end
67
+
68
+ puts "\nThe multicast mac-address for 235.147.18.23 is:"
69
+ mac = NetAddr::IPv4.parse("235.147.18.23").multicast_mac.to_s
70
+ assert_equal("01-00-5e-13-12-17", mac)
71
+ puts " " + mac
72
+ end
73
+
74
+ # IPv6
75
+ def test_IPv6_examples
76
+ puts "\n\n*** Examples using IPv6 ***\n"
77
+
78
+ puts "\nCreating IPv6Net: 'fec0::/62'"
79
+ net = NetAddr::IPv6Net.parse("fec0::/62")
80
+ assert_not_nil(net)
81
+
82
+ puts "\nRendering as a String: " + net.to_s
83
+ assert_equal("fec0::/62", net.to_s)
84
+
85
+ puts "\nIterating its /64 subnets:"
86
+ expect = ["fec0::/64","fec0:0:0:1::/64","fec0:0:0:2::/64","fec0:0:0:3::/64"]
87
+ 0.upto(net.subnet_count(64) - 1) do |i|
88
+ subnet = net.nth_subnet(64,i)
89
+ assert_equal(expect[i], subnet.to_s)
90
+ puts " " + subnet.to_s
91
+ end
92
+
93
+ puts "\nIts 3rd /64 subnet:"
94
+ subnet64 = net.nth_subnet(64,2)
95
+ assert_equal("fec0:0:0:2::/64", subnet64.to_s)
96
+ puts " " + subnet64.to_s
97
+
98
+ puts "\nIterating the first 4 IPs of the /64"
99
+ expect = ["fec0:0:0:2::","fec0:0:0:2::1","fec0:0:0:2::2","fec0:0:0:2::3"]
100
+ 0.upto(3) do |i|
101
+ ip = subnet64.nth(i)
102
+ assert_equal(expect[i], ip.to_s)
103
+ puts " " + ip.to_s
104
+ end
105
+
106
+ puts "\nGiven the 3rd /64 of fec0::/62, fill in the holes:"
107
+ expect = ["fec0::/63", "fec0:0:0:2::/64","fec0:0:0:3::/64"]
108
+ i = 0
109
+ net.fill([subnet64]).each do |subnet|
110
+ puts " " + subnet.to_s
111
+ assert_equal(expect[i], subnet.to_s)
112
+ i+=1
113
+ end
114
+
115
+ list = ["fec0::/63", "fec0:0:0:3::/64", "fec0:0:0:2::/64", "fe80::/17", "fe80:8000::/17"]
116
+ puts "\nSummarizing this list of networks: " + list.to_s
117
+ nets = []
118
+ list.each do |net|
119
+ nets.push(NetAddr::IPv6Net.parse(net))
120
+ end
121
+ expect = ["fe80::/16", "fec0::/62"]
122
+ i = 0
123
+ NetAddr.summ_IPv6Net(nets).each do |net|
124
+ puts " " + net.to_s
125
+ assert_equal(expect[i],net.to_s)
126
+ i += 1
127
+ end
128
+
129
+ puts "\nThe IPv6 address for mac-address aa-bb-cc-dd-ee-ff within network fe80::/64 is:"
130
+ net = NetAddr::IPv6Net.parse("fe80::/64")
131
+ eui = NetAddr::EUI48.parse("aa-bb-cc-dd-ee-ff").to_eui64
132
+ ip = eui.to_ipv6(net)
133
+ assert_equal("fe80::a8bb:ccff:fedd:eeff",ip.to_s)
134
+ puts " " + ip.to_s
135
+ end
136
+
137
+ end
data/test/ipv4_test.rb ADDED
@@ -0,0 +1,54 @@
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
+ end
@@ -0,0 +1,166 @@
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_extended
39
+ net = NetAddr::IPv4Net.parse("128.0.0.1/24")
40
+ assert_equal("128.0.0.0 255.255.255.0", net.extended)
41
+ end
42
+
43
+ def test_fill
44
+ parent = NetAddr::IPv4Net.parse("10.0.0.0/24")
45
+ nets = []
46
+ ["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|
47
+ nets.push(NetAddr::IPv4Net.parse(net))
48
+ end
49
+ 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"]
50
+ i = 0
51
+ parent.fill(nets).each do |net|
52
+ assert_equal(expect[i],net.to_s)
53
+ i += 1
54
+ end
55
+
56
+ parent = NetAddr::IPv4Net.parse("128.0.0.0/1")
57
+ nets = []
58
+ ["192.0.0.0/2"].each do |net|
59
+ nets.push(NetAddr::IPv4Net.parse(net))
60
+ end
61
+ expect = ["128.0.0.0/2", "192.0.0.0/2"]
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
+ parent = NetAddr::IPv4Net.parse("1.0.0.0/25")
69
+ nets = []
70
+ ["1.0.0.0/30", "1.0.0.64/26"].each do |net|
71
+ nets.push(NetAddr::IPv4Net.parse(net))
72
+ end
73
+ 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"]
74
+ i = 0
75
+ parent.fill(nets).each do |net|
76
+ assert_equal(expect[i],net.to_s)
77
+ i += 1
78
+ end
79
+ end
80
+
81
+ def test_len
82
+ net1 = NetAddr::IPv4Net.parse("1.1.1.0/24")
83
+ assert_equal(256, net1.len())
84
+ end
85
+
86
+ def test_next
87
+ assert_equal("1.0.0.2/31", NetAddr::IPv4Net.parse("1.0.0.0/31").next.to_s)
88
+ assert_equal("1.0.0.8/29", NetAddr::IPv4Net.parse("1.0.0.4/30").next.to_s)
89
+ assert_equal("1.0.0.16/28", NetAddr::IPv4Net.parse("1.0.0.8/29").next.to_s)
90
+ end
91
+
92
+ def test_next_sib
93
+ assert_equal("255.255.255.64/26", NetAddr::IPv4Net.parse("255.255.255.0/26").next_sib.to_s)
94
+ assert_equal("255.255.255.128/26", NetAddr::IPv4Net.parse("255.255.255.64/26").next_sib.to_s)
95
+ assert_equal("255.255.255.192/26", NetAddr::IPv4Net.parse("255.255.255.128/26").next_sib.to_s)
96
+ assert_nil(NetAddr::IPv4Net.parse("255.255.255.192/26").next_sib)
97
+ end
98
+
99
+ def test_nth
100
+ assert_equal("1.1.1.1", NetAddr::IPv4Net.parse("1.1.1.0/26").nth(1).to_s)
101
+ assert_nil(NetAddr::IPv4Net.parse("1.1.1.0/26").nth(64))
102
+ end
103
+
104
+ def test_nth_subnet
105
+ assert_equal("1.1.1.0/26", NetAddr::IPv4Net.parse("1.1.1.0/24").nth_subnet(26,0).to_s)
106
+ assert_equal("1.1.1.64/26", NetAddr::IPv4Net.parse("1.1.1.0/24").nth_subnet(26,1).to_s)
107
+ assert_nil(NetAddr::IPv4Net.parse("1.1.1.0/24").nth_subnet(26,4))
108
+ assert_nil(NetAddr::IPv4Net.parse("1.1.1.0/24").nth_subnet(26,-1))
109
+ assert_nil(NetAddr::IPv4Net.parse("1.1.1.0/24").nth_subnet(24,0))
110
+ end
111
+
112
+ def test_prev
113
+ assert_equal("1.0.0.0/29", NetAddr::IPv4Net.parse("1.0.0.8/30").prev.to_s)
114
+ assert_equal("1.0.0.128/26", NetAddr::IPv4Net.parse("1.0.0.192/26").prev.to_s)
115
+ assert_equal("1.0.0.0/25", NetAddr::IPv4Net.parse("1.0.0.128/26").prev.to_s)
116
+ end
117
+
118
+ def test_prev_sib
119
+ assert_equal("0.0.0.64/26", NetAddr::IPv4Net.parse("0.0.0.128/26").prev_sib.to_s)
120
+ assert_equal("0.0.0.0/26", NetAddr::IPv4Net.parse("0.0.0.64/26").prev_sib.to_s)
121
+ assert_nil(NetAddr::IPv4Net.parse("0.0.0.0/26").prev_sib)
122
+ end
123
+
124
+ def test_rel
125
+ net1 = NetAddr::IPv4Net.parse("1.1.1.0/24")
126
+ net2 = NetAddr::IPv4Net.parse("1.1.1.0/25")
127
+ net3 = NetAddr::IPv4Net.parse("1.1.1.128/25")
128
+ net4 = NetAddr::IPv4Net.parse("1.1.1.0/25")
129
+ assert_equal(1, net1.rel(net2)) # net eq, supernet
130
+ assert_equal(-1, net2.rel(net1)) # net eq, subnet
131
+ assert_equal(0, net2.rel(net2)) # eq
132
+ assert_equal(1, net1.rel(net3)) # net ne, supernet
133
+ assert_equal(-1, net3.rel(net1)) # net ne, subnet
134
+ assert_nil(net3.rel(net4)) # unrelated
135
+ end
136
+
137
+ def test_resize
138
+ assert_equal("1.1.1.0/24", NetAddr::IPv4Net.parse("1.1.1.0/26").resize(24).to_s)
139
+ end
140
+
141
+ def test_subnet_count
142
+ assert_equal(2, NetAddr::IPv4Net.parse("1.1.1.0/24").subnet_count(25))
143
+ assert_equal(0, NetAddr::IPv4Net.parse("1.1.1.0/24").subnet_count(24))
144
+ assert_equal(0, NetAddr::IPv4Net.parse("1.1.1.0/24").subnet_count(33))
145
+ assert_equal(0, NetAddr::IPv4Net.parse("0.0.0.0/0").subnet_count(32))
146
+ end
147
+
148
+ def test_summ
149
+ net1 = NetAddr::IPv4Net.parse("1.1.1.0/30")
150
+ net2 = NetAddr::IPv4Net.parse("1.1.1.4/30")
151
+ net3 = NetAddr::IPv4Net.parse("1.1.1.16/28")
152
+ net4 = NetAddr::IPv4Net.parse("1.1.1.0/28")
153
+ net5 = NetAddr::IPv4Net.parse("1.1.2.0/30")
154
+ net6 = NetAddr::IPv4Net.parse("1.1.1.4/30")
155
+ net7 = NetAddr::IPv4Net.parse("1.1.1.16/28")
156
+ net8 = NetAddr::IPv4Net.parse("1.1.1.32/28")
157
+ net9 = NetAddr::IPv4Net.parse("1.1.1.0/29")
158
+ net10 = NetAddr::IPv4Net.parse("1.1.1.8/30")
159
+ assert_equal("1.1.1.0/29", net1.summ(net2).to_s) # lesser to greater
160
+ assert_equal("1.1.1.0/27", net3.summ(net4).to_s) # greater to lesser
161
+ assert_nil(net5.summ(net6)) # different nets
162
+ assert_nil(net7.summ(net8)) # consecutive but not within bit boundary
163
+ assert_nil(net9.summ(net10)) # within bit boundary, but not same size
164
+ end
165
+
166
+ end
data/test/ipv6_test.rb ADDED
@@ -0,0 +1,90 @@
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_s
71
+ assert_equal("::", NetAddr::IPv6.parse("0:0:0:0:0:0:0:0").to_s)
72
+ assert_equal("1::", NetAddr::IPv6.parse("1:0:0:0:0:0:0:0").to_s)
73
+ assert_equal("0:1::", NetAddr::IPv6.parse("0:1:0:0:0:0:0:0").to_s)
74
+ assert_equal("0:0:1::", NetAddr::IPv6.parse("0:0:1:0:0:0:0:0").to_s)
75
+ assert_equal("0:0:0:1::", NetAddr::IPv6.parse("0:0:0:1:0:0:0:0").to_s)
76
+ assert_equal("::1:0:0:0", NetAddr::IPv6.parse("0:0:0:0:1:0:0:0").to_s)
77
+ assert_equal("::1:0:0", NetAddr::IPv6.parse("0:0:0:0:0:1:0:0").to_s)
78
+ assert_equal("::1:0", NetAddr::IPv6.parse(":0:0:0:0:0:1:0").to_s)
79
+ assert_equal("::1", NetAddr::IPv6.parse("0:0:0:0:0:0:0:1").to_s)
80
+
81
+ assert_equal("1::1", NetAddr::IPv6.parse("1:0:0:0:0:0:0:1").to_s)
82
+ assert_equal("1:1::1", NetAddr::IPv6.parse("1:1:0:0:0:0:0:1").to_s)
83
+ assert_equal("1:0:1::1", NetAddr::IPv6.parse("1:0:1:0:0:0:0:1").to_s)
84
+ assert_equal("1:0:0:1::1", NetAddr::IPv6.parse("1:0:0:1:0:0:0:1").to_s)
85
+ assert_equal("1::1:0:0:1", NetAddr::IPv6.parse("1:0:0:0:1:0:0:1").to_s)
86
+ assert_equal("1::1:0:1", NetAddr::IPv6.parse("1:0:0:0:0:1:0:1").to_s)
87
+ assert_equal("1::1:1", NetAddr::IPv6.parse("1:0:0:0:0:0:1:1").to_s)
88
+ end
89
+
90
+ end
@@ -0,0 +1,146 @@
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_fill
40
+ parent = NetAddr::IPv6Net.parse("ff00::/8")
41
+ nets = []
42
+ ["ff08::/14", "fe00::/7", "ff20::/11", "ff20::/12"].each do |net|
43
+ nets.push(NetAddr::IPv6Net.parse(net))
44
+ end
45
+ expect = ["ff00::/13", "ff08::/14", "ff0c::/14", "ff10::/12", "ff20::/11", "ff40::/10", "ff80::/9"]
46
+ i = 0
47
+ parent.fill(nets).each do |net|
48
+ assert_equal(expect[i],net.to_s)
49
+ i += 1
50
+ end
51
+
52
+ parent = NetAddr::IPv6Net.parse("ff00::/121")
53
+ nets = []
54
+ ["ff00::/126", "ff00::/120"].each do |net|
55
+ nets.push(NetAddr::IPv6Net.parse(net))
56
+ end
57
+ expect = ["ff00::/126", "ff00::4/126", "ff00::8/125", "ff00::10/124", "ff00::20/123", "ff00::40/122"]
58
+ i = 0
59
+ parent.fill(nets).each do |net|
60
+ assert_equal(expect[i],net.to_s)
61
+ i += 1
62
+ end
63
+ end
64
+
65
+ def test_next
66
+ assert_equal("::2/127", NetAddr::IPv6Net.parse("::/127").next.to_s)
67
+ assert_equal("::8/125", NetAddr::IPv6Net.parse("::4/126").next.to_s)
68
+ assert_equal("0:0:0:2::/63", NetAddr::IPv6Net.parse("::1:8000:0:0:0/65").next.to_s)
69
+ assert_equal("0:0:0:3::/64", NetAddr::IPv6Net.parse("::2:8000:0:0:0/65").next.to_s)
70
+ assert_nil(NetAddr::IPv6Net.parse("ffff::/16").next)
71
+ end
72
+
73
+ def test_next_sib
74
+ assert_equal("0:0:0:2::/65", NetAddr::IPv6Net.parse("::1:8000:0:0:0/65",).next_sib.to_s)
75
+ assert_equal("0:0:0:2::/64", NetAddr::IPv6Net.parse("0:0:0:1::/64",).next_sib.to_s)
76
+ assert_equal("2::/16", NetAddr::IPv6Net.parse("1::/16").next_sib.to_s)
77
+ assert_nil(NetAddr::IPv6Net.parse("ffff::/16").next_sib)
78
+ end
79
+
80
+ def test_nth
81
+ assert_equal("1::", NetAddr::IPv6Net.parse("1::0/64").nth(0).to_s)
82
+ assert_equal("::", NetAddr::IPv6Net.parse("::/127").nth(0).to_s)
83
+ assert_equal("::1", NetAddr::IPv6Net.parse("::/127").nth(1).to_s)
84
+ assert_nil(NetAddr::IPv6Net.parse("::/127").nth(2))
85
+ end
86
+
87
+ def test_nth_subnet
88
+ assert_equal("1::/30", NetAddr::IPv6Net.parse("1::/24").nth_subnet(30,0).to_s)
89
+ assert_nil(NetAddr::IPv6Net.parse("1::").nth_subnet(26,4))
90
+ end
91
+
92
+ def test_prev
93
+ assert_equal("1::/125", NetAddr::IPv6Net.parse("1::8/126").prev.to_s)
94
+ assert_equal("f::/63", NetAddr::IPv6Net.parse("f:0:0:2::/63").prev.to_s)
95
+ assert_equal("e::/16", NetAddr::IPv6Net.parse("f::/63").prev.to_s)
96
+ assert_nil(NetAddr::IPv6Net.parse("::").prev)
97
+ end
98
+
99
+ def test_prev_sib
100
+ assert_equal("0:0:0:1::/64", NetAddr::IPv6Net.parse("0:0:0:2::/64").prev_sib.to_s)
101
+ assert_equal("1::/16", NetAddr::IPv6Net.parse("2::/16").prev_sib.to_s)
102
+ assert_nil(NetAddr::IPv6Net.parse("::/64").prev_sib)
103
+ end
104
+
105
+ def test_rel
106
+ net1 = NetAddr::IPv6Net.parse("1::/63")
107
+ net2 = NetAddr::IPv6Net.parse("1::/64")
108
+ net3 = NetAddr::IPv6Net.parse("1::/60")
109
+ net4 = NetAddr::IPv6Net.parse("1:0:0:1::/64")
110
+ net5 = NetAddr::IPv6Net.parse("2::/64")
111
+ assert_equal(1, net1.rel(net2)) # net eq, supernet
112
+ assert_equal(-1, net2.rel(net1)) # net eq, subnet
113
+ assert_equal(0, net2.rel(net2)) # eq
114
+ assert_equal(1, net3.rel(net4)) # net ne, supernet
115
+ assert_equal(-1, net4.rel(net3)) # net ne, subnet
116
+ assert_nil(net2.rel(net5)) # unrelated
117
+ end
118
+
119
+ def test_resize
120
+ assert_equal("1::/64", NetAddr::IPv6Net.parse("1::/63").resize(64).to_s)
121
+ end
122
+
123
+ def test_subnet_count
124
+ assert_equal(2, NetAddr::IPv6Net.parse("ff::/8").subnet_count(9))
125
+ assert_equal(4, NetAddr::IPv6Net.parse("ff::/8").subnet_count(10))
126
+ assert_equal(0, NetAddr::IPv6Net.parse("ff::/8").subnet_count(8))
127
+ assert_equal(0, NetAddr::IPv6Net.parse("::/0").subnet_count(128))
128
+ end
129
+
130
+ def test_summ
131
+ net1 = NetAddr::IPv6Net.parse("1::/128")
132
+ net2 = NetAddr::IPv6Net.parse("1::1/128")
133
+ net3 = NetAddr::IPv6Net.parse("1::0/128")
134
+ net4 = NetAddr::IPv6Net.parse("1::/16")
135
+ net5 = NetAddr::IPv6Net.parse("2::/16")
136
+ net6 = NetAddr::IPv6Net.parse("10::/12")
137
+ net7 = NetAddr::IPv6Net.parse("20::/12")
138
+ net8 = NetAddr::IPv6Net.parse("8::/17")
139
+ assert_equal("1::/127", net1.summ(net2).to_s) # lesser to greater
140
+ assert_equal("1::/127", net2.summ(net3).to_s) # greater to lesser
141
+ assert_nil(net4.summ(net5)) # different nets
142
+ assert_nil(net6.summ(net7)) # consecutive but not within bit boundary
143
+ assert_nil(net4.summ(net8)) # within bit boundary, but not same size
144
+ end
145
+
146
+ 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