ipaddress_link_local 0.8.3

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,625 @@
1
+ require 'test_helper'
2
+
3
+ class IPv4Test < Minitest::Test
4
+
5
+ def setup
6
+ @klass = IPAddress::IPv4
7
+
8
+ @valid_ipv4 = {
9
+ "0.0.0.0/0" => ["0.0.0.0", 0],
10
+ "10.0.0.0" => ["10.0.0.0", 32],
11
+ "10.0.0.1" => ["10.0.0.1", 32],
12
+ "10.0.0.1/24" => ["10.0.0.1", 24],
13
+ "10.0.0.1/255.255.255.0" => ["10.0.0.1", 24]}
14
+
15
+ @invalid_ipv4 = ["10.0.0.256",
16
+ "10.0.0.0.0",
17
+ "10.0.0",
18
+ "10.0"]
19
+
20
+ @valid_ipv4_range = ["10.0.0.1-254",
21
+ "10.0.1-254.0",
22
+ "10.1-254.0.0"]
23
+
24
+ @netmask_values = {
25
+ "0.0.0.0/0" => "0.0.0.0",
26
+ "10.0.0.0/8" => "255.0.0.0",
27
+ "172.16.0.0/16" => "255.255.0.0",
28
+ "192.168.0.0/24" => "255.255.255.0",
29
+ "192.168.100.4/30" => "255.255.255.252",
30
+ "192.168.12.4/32" => "255.255.255.255"}
31
+
32
+ @decimal_values ={
33
+ "0.0.0.0/0" => 0,
34
+ "10.0.0.0/8" => 167772160,
35
+ "172.16.0.0/16" => 2886729728,
36
+ "192.168.0.0/24" => 3232235520,
37
+ "192.168.100.4/30" => 3232261124}
38
+
39
+ @hex_values = {
40
+ "10.0.0.0" => "0a000000",
41
+ "172.16.5.4" => "ac100504",
42
+ "192.168.100.4" => "c0a86404",
43
+ }
44
+
45
+ @ip = @klass.new("172.16.10.1/24")
46
+ @network = @klass.new("172.16.10.0/24")
47
+
48
+ @broadcast = {
49
+ "10.0.0.0/8" => "10.255.255.255/8",
50
+ "172.16.0.0/16" => "172.16.255.255/16",
51
+ "192.168.0.0/24" => "192.168.0.255/24",
52
+ "192.168.100.4/30" => "192.168.100.7/30",
53
+ "192.168.12.3/31" => "255.255.255.255/31",
54
+ "10.0.0.1/32" => "10.0.0.1/32"}
55
+
56
+ @networks = {
57
+ "10.5.4.3/8" => "10.0.0.0/8",
58
+ "172.16.5.4/16" => "172.16.0.0/16",
59
+ "192.168.4.3/24" => "192.168.4.0/24",
60
+ "192.168.100.5/30" => "192.168.100.4/30",
61
+ "192.168.1.3/31" => "192.168.1.2/31",
62
+ "192.168.2.5/32" => "192.168.2.5/32"}
63
+
64
+ @class_a = @klass.new("10.0.0.1/8")
65
+ @class_b = @klass.new("172.16.0.1/16")
66
+ @class_c = @klass.new("192.168.0.1/24")
67
+
68
+ @classful = {
69
+ "10.1.1.1" => 8,
70
+ "150.1.1.1" => 16,
71
+ "200.1.1.1" => 24 }
72
+
73
+ @in_range = {
74
+ "10.32.0.1" => ["10.32.0.253", 253],
75
+ "192.0.0.0" => ["192.1.255.255", 131072]
76
+ }
77
+
78
+ @link_local = [
79
+ "169.254.0.0",
80
+ "169.254.255.255",
81
+ "169.254.12.34",
82
+ "169.254.0.0/16",
83
+ "169.254.0.0/17"]
84
+
85
+ @not_link_local = [
86
+ "127.0.0.1",
87
+ "127.0.1.1",
88
+ "192.168.0.100",
89
+ "169.255.0.0",
90
+ "169.254.0.0/15",
91
+ "0.0.0.0",
92
+ "255.255.255.255"]
93
+
94
+ end
95
+
96
+ def test_initialize
97
+ @valid_ipv4.keys.each do |i|
98
+ ip = @klass.new(i)
99
+ assert_instance_of @klass, ip
100
+ end
101
+ assert_instance_of IPAddress::Prefix32, @ip.prefix
102
+ assert_raises (ArgumentError) do
103
+ @klass.new
104
+ end
105
+ end
106
+
107
+ def test_initialize_format_error
108
+ @invalid_ipv4.each do |i|
109
+ assert_raises(ArgumentError) {@klass.new(i)}
110
+ end
111
+ assert_raises (ArgumentError) {@klass.new("10.0.0.0/asd")}
112
+ end
113
+
114
+ def test_initialize_without_prefix
115
+ ip = @klass.new("10.10.0.0")
116
+ assert_instance_of IPAddress::Prefix32, ip.prefix
117
+ assert_equal 32, ip.prefix.to_i
118
+ end
119
+
120
+ def test_attributes
121
+ @valid_ipv4.each do |arg,attr|
122
+ ip = @klass.new(arg)
123
+ assert_equal attr.first, ip.address
124
+ assert_equal attr.last, ip.prefix.to_i
125
+ end
126
+ end
127
+
128
+ def test_octets
129
+ ip = @klass.new("10.1.2.3/8")
130
+ assert_equal ip.octets, [10,1,2,3]
131
+ end
132
+
133
+ def test_initialize_should_require_ip
134
+ assert_raises(ArgumentError) { @klass.new }
135
+ end
136
+
137
+ def test_method_data
138
+ if RUBY_VERSION < "2.0"
139
+ assert_equal "\254\020\n\001", @ip.data
140
+ else
141
+ assert_equal "\xAC\x10\n\x01".b, @ip.data
142
+ end
143
+ end
144
+
145
+ def test_method_to_string
146
+ @valid_ipv4.each do |arg,attr|
147
+ ip = @klass.new(arg)
148
+ assert_equal attr.join("/"), ip.to_string
149
+ end
150
+ end
151
+
152
+ def test_method_to_s
153
+ @valid_ipv4.each do |arg,attr|
154
+ ip = @klass.new(arg)
155
+ assert_equal attr.first, ip.to_s
156
+ end
157
+ end
158
+
159
+ def test_netmask
160
+ @netmask_values.each do |addr,mask|
161
+ ip = @klass.new(addr)
162
+ assert_equal mask, ip.netmask
163
+ end
164
+ end
165
+
166
+ def test_method_to_u32
167
+ @decimal_values.each do |addr,int|
168
+ ip = @klass.new(addr)
169
+ assert_equal int, ip.to_u32
170
+ end
171
+ end
172
+
173
+ def test_method_to_hex
174
+ @hex_values.each do |addr,hex|
175
+ ip = @klass.new(addr)
176
+ assert_equal hex, ip.to_hex
177
+ end
178
+ end
179
+
180
+ def test_method_network?
181
+ assert_equal true, @network.network?
182
+ assert_equal false, @ip.network?
183
+ end
184
+
185
+ def test_one_address_network
186
+ network = @klass.new("172.16.10.1/32")
187
+ assert_equal false, network.network?
188
+ end
189
+
190
+ def test_method_broadcast
191
+ @broadcast.each do |addr,bcast|
192
+ ip = @klass.new(addr)
193
+ assert_instance_of @klass, ip.broadcast
194
+ assert_equal bcast, ip.broadcast.to_string
195
+ end
196
+ end
197
+
198
+ def test_method_network
199
+ @networks.each do |addr,net|
200
+ ip = @klass.new addr
201
+ assert_instance_of @klass, ip.network
202
+ assert_equal net, ip.network.to_string
203
+ end
204
+ end
205
+
206
+ def test_method_bits
207
+ ip = @klass.new("127.0.0.1")
208
+ assert_equal "01111111000000000000000000000001", ip.bits
209
+ end
210
+
211
+ def test_method_first
212
+ ip = @klass.new("192.168.100.0/24")
213
+ assert_instance_of @klass, ip.first
214
+ assert_equal "192.168.100.1", ip.first.to_s
215
+ ip = @klass.new("192.168.100.50/24")
216
+ assert_instance_of @klass, ip.first
217
+ assert_equal "192.168.100.1", ip.first.to_s
218
+ ip = @klass.new("192.168.100.50/32")
219
+ assert_instance_of @klass, ip.first
220
+ assert_equal "192.168.100.50", ip.first.to_s
221
+ ip = @klass.new("192.168.100.50/31")
222
+ assert_instance_of @klass, ip.first
223
+ assert_equal "192.168.100.50", ip.first.to_s
224
+ end
225
+
226
+ def test_method_last
227
+ ip = @klass.new("192.168.100.0/24")
228
+ assert_instance_of @klass, ip.last
229
+ assert_equal "192.168.100.254", ip.last.to_s
230
+ ip = @klass.new("192.168.100.50/24")
231
+ assert_instance_of @klass, ip.last
232
+ assert_equal "192.168.100.254", ip.last.to_s
233
+ ip = @klass.new("192.168.100.50/32")
234
+ assert_instance_of @klass, ip.last
235
+ assert_equal "192.168.100.50", ip.last.to_s
236
+ ip = @klass.new("192.168.100.50/31")
237
+ assert_instance_of @klass, ip.last
238
+ assert_equal "192.168.100.51", ip.last.to_s
239
+ end
240
+
241
+ def test_method_each_host
242
+ ip = @klass.new("10.0.0.1/29")
243
+ arr = []
244
+ ip.each_host {|i| arr << i.to_s}
245
+ expected = ["10.0.0.1","10.0.0.2","10.0.0.3",
246
+ "10.0.0.4","10.0.0.5","10.0.0.6"]
247
+ assert_equal expected, arr
248
+ end
249
+
250
+ def test_method_each
251
+ ip = @klass.new("10.0.0.1/29")
252
+ arr = []
253
+ ip.each {|i| arr << i.to_s}
254
+ expected = ["10.0.0.0","10.0.0.1","10.0.0.2",
255
+ "10.0.0.3","10.0.0.4","10.0.0.5",
256
+ "10.0.0.6","10.0.0.7"]
257
+ assert_equal expected, arr
258
+ end
259
+
260
+ def test_method_size
261
+ ip = @klass.new("10.0.0.1/29")
262
+ assert_equal 8, ip.size
263
+ end
264
+
265
+ def test_method_hosts
266
+ ip = @klass.new("10.0.0.1/29")
267
+ expected = ["10.0.0.1","10.0.0.2","10.0.0.3",
268
+ "10.0.0.4","10.0.0.5","10.0.0.6"]
269
+ assert_equal expected, ip.hosts.map {|i| i.to_s}
270
+ end
271
+
272
+ def test_method_network_u32
273
+ assert_equal 2886732288, @ip.network_u32
274
+ end
275
+
276
+ def test_method_broadcast_u32
277
+ assert_equal 2886732543, @ip.broadcast_u32
278
+ end
279
+
280
+ def test_method_include?
281
+ ip = @klass.new("192.168.10.100/24")
282
+ addr = @klass.new("192.168.10.102/24")
283
+ assert_equal true, ip.include?(addr)
284
+ assert_equal false, ip.include?(@klass.new("172.16.0.48"))
285
+ ip = @klass.new("10.0.0.0/8")
286
+ assert_equal true, ip.include?(@klass.new("10.0.0.0/9"))
287
+ assert_equal true, ip.include?(@klass.new("10.1.1.1/32"))
288
+ assert_equal true, ip.include?(@klass.new("10.1.1.1/9"))
289
+ assert_equal false, ip.include?(@klass.new("172.16.0.0/16"))
290
+ assert_equal false, ip.include?(@klass.new("10.0.0.0/7"))
291
+ assert_equal false, ip.include?(@klass.new("5.5.5.5/32"))
292
+ assert_equal false, ip.include?(@klass.new("11.0.0.0/8"))
293
+ ip = @klass.new("13.13.0.0/13")
294
+ assert_equal false, ip.include?(@klass.new("13.16.0.0/32"))
295
+ end
296
+
297
+ def test_method_include_all?
298
+ ip = @klass.new("192.168.10.100/24")
299
+ addr1 = @klass.new("192.168.10.102/24")
300
+ addr2 = @klass.new("192.168.10.103/24")
301
+ assert_equal true, ip.include_all?(addr1,addr2)
302
+ assert_equal false, ip.include_all?(addr1, @klass.new("13.16.0.0/32"))
303
+ end
304
+
305
+ def test_method_ipv4?
306
+ assert_equal true, @ip.ipv4?
307
+ end
308
+
309
+ def test_method_ipv6?
310
+ assert_equal false, @ip.ipv6?
311
+ end
312
+
313
+ def test_method_private?
314
+ assert_equal true, @klass.new("192.168.10.50/24").private?
315
+ assert_equal true, @klass.new("192.168.10.50/16").private?
316
+ assert_equal true, @klass.new("172.16.77.40/24").private?
317
+ assert_equal true, @klass.new("172.16.10.50/14").private?
318
+ assert_equal true, @klass.new("10.10.10.10/10").private?
319
+ assert_equal true, @klass.new("10.0.0.0/8").private?
320
+ assert_equal false, @klass.new("192.168.10.50/12").private?
321
+ assert_equal false, @klass.new("3.3.3.3").private?
322
+ assert_equal false, @klass.new("10.0.0.0/7").private?
323
+ assert_equal false, @klass.new("172.32.0.0/12").private?
324
+ assert_equal false, @klass.new("172.16.0.0/11").private?
325
+ assert_equal false, @klass.new("192.0.0.2/24").private?
326
+ end
327
+
328
+ def test_method_link_local?
329
+ @link_local.each do |addr|
330
+ assert_equal true, @klass.new(addr).link_local?
331
+ end
332
+ @not_link_local.each do |addr|
333
+ assert_equal false, @klass.new(addr).link_local?
334
+ end
335
+ end
336
+
337
+ def test_method_octet
338
+ assert_equal 172, @ip[0]
339
+ assert_equal 16, @ip[1]
340
+ assert_equal 10, @ip[2]
341
+ assert_equal 1, @ip[3]
342
+ end
343
+
344
+ def test_method_a?
345
+ assert_equal true, @class_a.a?
346
+ assert_equal false, @class_b.a?
347
+ assert_equal false, @class_c.a?
348
+ end
349
+
350
+ def test_method_b?
351
+ assert_equal true, @class_b.b?
352
+ assert_equal false, @class_a.b?
353
+ assert_equal false, @class_c.b?
354
+ end
355
+
356
+ def test_method_c?
357
+ assert_equal true, @class_c.c?
358
+ assert_equal false, @class_a.c?
359
+ assert_equal false, @class_b.c?
360
+ end
361
+
362
+ def test_method_to_ipv6
363
+ assert_equal "ac10:0a01", @ip.to_ipv6
364
+ end
365
+
366
+ def test_method_reverse
367
+ assert_equal "1.10.16.172.in-addr.arpa", @ip.reverse
368
+ end
369
+
370
+ def test_method_compare
371
+ ip1 = @klass.new("10.1.1.1/8")
372
+ ip2 = @klass.new("10.1.1.1/16")
373
+ ip3 = @klass.new("172.16.1.1/14")
374
+ ip4 = @klass.new("10.1.1.1/8")
375
+
376
+ # ip2 should be greater than ip1
377
+ assert_equal true, ip1 < ip2
378
+ assert_equal false, ip1 > ip2
379
+ assert_equal false, ip2 < ip1
380
+ # ip2 should be less than ip3
381
+ assert_equal true, ip2 < ip3
382
+ assert_equal false, ip2 > ip3
383
+ # ip1 should be less than ip3
384
+ assert_equal true, ip1 < ip3
385
+ assert_equal false, ip1 > ip3
386
+ assert_equal false, ip3 < ip1
387
+ # ip1 should be equal to itself
388
+ assert_equal true, ip1 == ip1
389
+ # ip1 should be equal to ip4
390
+ assert_equal true, ip1 == ip4
391
+ # test sorting
392
+ arr = ["10.1.1.1/8","10.1.1.1/16","172.16.1.1/14"]
393
+ assert_equal arr, [ip1,ip2,ip3].sort.map{|s| s.to_string}
394
+ # test same prefix
395
+ ip1 = @klass.new("10.0.0.0/24")
396
+ ip2 = @klass.new("10.0.0.0/16")
397
+ ip3 = @klass.new("10.0.0.0/8")
398
+ arr = ["10.0.0.0/8","10.0.0.0/16","10.0.0.0/24"]
399
+ assert_equal arr, [ip1,ip2,ip3].sort.map{|s| s.to_string}
400
+ end
401
+
402
+ def test_method_minus
403
+ ip1 = @klass.new("10.1.1.1/8")
404
+ ip2 = @klass.new("10.1.1.10/8")
405
+ assert_equal 9, ip2 - ip1
406
+ assert_equal 9, ip1 - ip2
407
+ end
408
+
409
+ def test_method_plus
410
+ ip1 = @klass.new("172.16.10.1/24")
411
+ ip2 = @klass.new("172.16.11.2/24")
412
+ assert_equal ["172.16.10.0/23"], (ip1+ip2).map{|i| i.to_string}
413
+
414
+ ip2 = @klass.new("172.16.12.2/24")
415
+ assert_equal [ip1.network.to_string, ip2.network.to_string],
416
+ (ip1 + ip2).map{|i| i.to_string}
417
+
418
+ ip1 = @klass.new("10.0.0.0/23")
419
+ ip2 = @klass.new("10.0.2.0/24")
420
+ assert_equal ["10.0.0.0/23","10.0.2.0/24"], (ip1+ip2).map{|i| i.to_string}
421
+
422
+ ip1 = @klass.new("10.0.0.0/23")
423
+ ip2 = @klass.new("10.0.2.0/24")
424
+ assert_equal ["10.0.0.0/23","10.0.2.0/24"], (ip2+ip1).map{|i| i.to_string}
425
+
426
+ ip1 = @klass.new("10.0.0.0/16")
427
+ ip2 = @klass.new("10.0.2.0/24")
428
+ assert_equal ["10.0.0.0/16"], (ip1+ip2).map{|i| i.to_string}
429
+
430
+ ip1 = @klass.new("10.0.0.0/23")
431
+ ip2 = @klass.new("10.1.0.0/24")
432
+ assert_equal ["10.0.0.0/23","10.1.0.0/24"], (ip1+ip2).map{|i| i.to_string}
433
+
434
+ end
435
+
436
+ def test_method_netmask_equal
437
+ ip = @klass.new("10.1.1.1/16")
438
+ assert_equal 16, ip.prefix.to_i
439
+ ip.netmask = "255.255.255.0"
440
+ assert_equal 24, ip.prefix.to_i
441
+ end
442
+
443
+ def test_method_split
444
+ assert_raises(ArgumentError) {@ip.split(0)}
445
+ assert_raises(ArgumentError) {@ip.split(257)}
446
+
447
+ assert_equal @ip.network, @ip.split(1).first
448
+
449
+ arr = ["172.16.10.0/27", "172.16.10.32/27", "172.16.10.64/27",
450
+ "172.16.10.96/27", "172.16.10.128/27", "172.16.10.160/27",
451
+ "172.16.10.192/27", "172.16.10.224/27"]
452
+ assert_equal arr, @network.split(8).map {|s| s.to_string}
453
+ arr = ["172.16.10.0/27", "172.16.10.32/27", "172.16.10.64/27",
454
+ "172.16.10.96/27", "172.16.10.128/27", "172.16.10.160/27",
455
+ "172.16.10.192/26"]
456
+ assert_equal arr, @network.split(7).map {|s| s.to_string}
457
+ arr = ["172.16.10.0/27", "172.16.10.32/27", "172.16.10.64/27",
458
+ "172.16.10.96/27", "172.16.10.128/26", "172.16.10.192/26"]
459
+ assert_equal arr, @network.split(6).map {|s| s.to_string}
460
+ arr = ["172.16.10.0/27", "172.16.10.32/27", "172.16.10.64/27",
461
+ "172.16.10.96/27", "172.16.10.128/25"]
462
+ assert_equal arr, @network.split(5).map {|s| s.to_string}
463
+ arr = ["172.16.10.0/26", "172.16.10.64/26", "172.16.10.128/26",
464
+ "172.16.10.192/26"]
465
+ assert_equal arr, @network.split(4).map {|s| s.to_string}
466
+ arr = ["172.16.10.0/26", "172.16.10.64/26", "172.16.10.128/25"]
467
+ assert_equal arr, @network.split(3).map {|s| s.to_string}
468
+ arr = ["172.16.10.0/25", "172.16.10.128/25"]
469
+ assert_equal arr, @network.split(2).map {|s| s.to_string}
470
+ arr = ["172.16.10.0/24"]
471
+ assert_equal arr, @network.split(1).map {|s| s.to_string}
472
+ end
473
+
474
+ def test_method_subnet
475
+ assert_raises(ArgumentError) {@network.subnet(23)}
476
+ assert_raises(ArgumentError) {@network.subnet(33)}
477
+ arr = ["172.16.10.0/26", "172.16.10.64/26", "172.16.10.128/26",
478
+ "172.16.10.192/26"]
479
+ assert_equal arr, @network.subnet(26).map {|s| s.to_string}
480
+ arr = ["172.16.10.0/25", "172.16.10.128/25"]
481
+ assert_equal arr, @network.subnet(25).map {|s| s.to_string}
482
+ arr = ["172.16.10.0/24"]
483
+ assert_equal arr, @network.subnet(24).map {|s| s.to_string}
484
+ end
485
+
486
+ def test_method_supernet
487
+ assert_raises(ArgumentError) {@ip.supernet(24)}
488
+ assert_equal "0.0.0.0/0", @ip.supernet(0).to_string
489
+ assert_equal "0.0.0.0/0", @ip.supernet(-2).to_string
490
+ assert_equal "172.16.10.0/23", @ip.supernet(23).to_string
491
+ assert_equal "172.16.8.0/22", @ip.supernet(22).to_string
492
+ end
493
+
494
+ def test_classmethod_parse_u32
495
+ @decimal_values.each do |addr,int|
496
+ ip = @klass.parse_u32(int)
497
+ ip.prefix = addr.split("/").last.to_i
498
+ assert_equal ip.to_string, addr
499
+ end
500
+ end
501
+
502
+ def test_classhmethod_extract
503
+ str = "foobar172.16.10.1barbaz"
504
+ assert_equal "172.16.10.1", @klass.extract(str).to_s
505
+ end
506
+
507
+ def test_classmethod_summarize
508
+
509
+ # Should return self if only one network given
510
+ assert_equal [@ip.network], @klass.summarize(@ip)
511
+
512
+ # Summarize homogeneous networks
513
+ ip1 = @klass.new("172.16.10.1/24")
514
+ ip2 = @klass.new("172.16.11.2/24")
515
+ assert_equal ["172.16.10.0/23"], @klass.summarize(ip1,ip2).map{|i| i.to_string}
516
+
517
+ ip1 = @klass.new("10.0.0.1/24")
518
+ ip2 = @klass.new("10.0.1.1/24")
519
+ ip3 = @klass.new("10.0.2.1/24")
520
+ ip4 = @klass.new("10.0.3.1/24")
521
+ assert_equal ["10.0.0.0/22"], @klass.summarize(ip1,ip2,ip3,ip4).map{|i| i.to_string}
522
+ assert_equal ["10.0.0.0/22"], @klass.summarize(ip4,ip3,ip2,ip1).map{|i| i.to_string}
523
+
524
+ # Summarize non homogeneous networks
525
+ ip1 = @klass.new("10.0.0.0/23")
526
+ ip2 = @klass.new("10.0.2.0/24")
527
+ assert_equal ["10.0.0.0/23","10.0.2.0/24"], @klass.summarize(ip1,ip2).map{|i| i.to_string}
528
+
529
+ ip1 = @klass.new("10.0.0.0/16")
530
+ ip2 = @klass.new("10.0.2.0/24")
531
+ assert_equal ["10.0.0.0/16"], @klass.summarize(ip1,ip2).map{|i| i.to_string}
532
+
533
+ ip1 = @klass.new("10.0.0.0/23")
534
+ ip2 = @klass.new("10.1.0.0/24")
535
+ assert_equal ["10.0.0.0/23","10.1.0.0/24"], @klass.summarize(ip1,ip2).map{|i| i.to_string}
536
+
537
+ ip1 = @klass.new("10.0.0.0/23")
538
+ ip2 = @klass.new("10.0.2.0/23")
539
+ ip3 = @klass.new("10.0.4.0/24")
540
+ ip4 = @klass.new("10.0.6.0/24")
541
+ assert_equal ["10.0.0.0/22","10.0.4.0/24","10.0.6.0/24"],
542
+ @klass.summarize(ip1,ip2,ip3,ip4).map{|i| i.to_string}
543
+
544
+ ip1 = @klass.new("10.0.1.1/24")
545
+ ip2 = @klass.new("10.0.2.1/24")
546
+ ip3 = @klass.new("10.0.3.1/24")
547
+ ip4 = @klass.new("10.0.4.1/24")
548
+ result = ["10.0.1.0/24","10.0.2.0/23","10.0.4.0/24"]
549
+ assert_equal result, @klass.summarize(ip1,ip2,ip3,ip4).map{|i| i.to_string}
550
+ assert_equal result, @klass.summarize(ip4,ip3,ip2,ip1).map{|i| i.to_string}
551
+
552
+ ip1 = @klass.new("10.0.1.1/24")
553
+ ip2 = @klass.new("10.10.2.1/24")
554
+ ip3 = @klass.new("172.16.0.1/24")
555
+ ip4 = @klass.new("172.16.1.1/24")
556
+ result = ["10.0.1.0/24","10.10.2.0/24","172.16.0.0/23"]
557
+ assert_equal result, @klass.summarize(ip1,ip2,ip3,ip4).map{|i| i.to_string}
558
+
559
+ ips = [@klass.new("10.0.0.12/30"),
560
+ @klass.new("10.0.100.0/24")]
561
+ result = ["10.0.0.12/30", "10.0.100.0/24"]
562
+ assert_equal result, @klass.summarize(*ips).map{|i| i.to_string}
563
+
564
+ ips = [@klass.new("172.16.0.0/31"),
565
+ @klass.new("10.10.2.1/32")]
566
+ result = ["10.10.2.1/32", "172.16.0.0/31"]
567
+ assert_equal result, @klass.summarize(*ips).map{|i| i.to_string}
568
+
569
+ ips = [@klass.new("172.16.0.0/32"),
570
+ @klass.new("10.10.2.1/32")]
571
+ result = ["10.10.2.1/32", "172.16.0.0/32"]
572
+ assert_equal result, @klass.summarize(*ips).map{|i| i.to_string}
573
+
574
+ end
575
+
576
+ def test_classmethod_parse_data
577
+ ip = @klass.parse_data "\254\020\n\001"
578
+ assert_instance_of @klass, ip
579
+ assert_equal "172.16.10.1", ip.address
580
+ assert_equal "172.16.10.1/32", ip.to_string
581
+ end
582
+
583
+ def test_classmethod_parse_classful
584
+ @classful.each do |ip,prefix|
585
+ res = @klass.parse_classful(ip)
586
+ assert_equal prefix, res.prefix
587
+ assert_equal "#{ip}/#{prefix}", res.to_string
588
+ end
589
+ assert_raises(ArgumentError){ @klass.parse_classful("192.168.256.257") }
590
+ end
591
+
592
+ def test_network_split
593
+ @classful.each do |ip,net|
594
+ x = @klass.new("#{ip}/#{net}")
595
+ assert_equal x.split(1).length, 1
596
+ assert_equal x.split(2).length, 2
597
+ assert_equal x.split(32).length, 32
598
+ assert_equal x.split(256).length, 256
599
+ end
600
+ end
601
+
602
+ def test_in_range
603
+ @in_range.each do |s,d|
604
+ ip = @klass.new(s)
605
+ assert_equal ip.to(d[0]).length, d[1]
606
+ end
607
+ end
608
+
609
+ def test_octect_updates
610
+ ip = @klass.new("10.0.1.15/32")
611
+ ip[1] = 15
612
+ assert_equal "10.15.1.15/32", ip.to_string
613
+
614
+ ip = @klass.new("172.16.100.1")
615
+ ip[3] = 200
616
+ assert_equal "172.16.100.200/32", ip.to_string
617
+
618
+ ip = @klass.new("192.168.199.0/24")
619
+ ip[2] = 200
620
+ assert_equal "192.168.200.0/24", ip.to_string
621
+ end
622
+
623
+ end # class IPv4Test
624
+
625
+