maxmind-db 1.2.0 → 1.4.0

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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/Gemfile.lock +72 -0
  4. data/README.dev.md +2 -43
  5. data/README.md +2 -2
  6. data/Rakefile +2 -2
  7. data/maxmind-db.gemspec +6 -3
  8. metadata +47 -76
  9. data/test/data/LICENSE +0 -4
  10. data/test/data/MaxMind-DB-spec.md +0 -574
  11. data/test/data/README.md +0 -4
  12. data/test/data/bad-data/README.md +0 -7
  13. data/test/data/bad-data/libmaxminddb/libmaxminddb-offset-integer-overflow.mmdb +0 -0
  14. data/test/data/bad-data/maxminddb-golang/cyclic-data-structure.mmdb +0 -0
  15. data/test/data/bad-data/maxminddb-golang/invalid-bytes-length.mmdb +0 -1
  16. data/test/data/bad-data/maxminddb-golang/invalid-data-record-offset.mmdb +0 -0
  17. data/test/data/bad-data/maxminddb-golang/invalid-map-key-length.mmdb +0 -0
  18. data/test/data/bad-data/maxminddb-golang/invalid-string-length.mmdb +0 -1
  19. data/test/data/bad-data/maxminddb-golang/metadata-is-an-uint128.mmdb +0 -1
  20. data/test/data/bad-data/maxminddb-golang/unexpected-bytes.mmdb +0 -0
  21. data/test/data/bad-data/maxminddb-python/bad-unicode-in-map-key.mmdb +0 -0
  22. data/test/data/perltidyrc +0 -12
  23. data/test/data/source-data/GeoIP2-Anonymous-IP-Test.json +0 -49
  24. data/test/data/source-data/GeoIP2-City-Test.json +0 -12885
  25. data/test/data/source-data/GeoIP2-Connection-Type-Test.json +0 -122
  26. data/test/data/source-data/GeoIP2-Country-Test.json +0 -15904
  27. data/test/data/source-data/GeoIP2-DensityIncome-Test.json +0 -14
  28. data/test/data/source-data/GeoIP2-Domain-Test.json +0 -452
  29. data/test/data/source-data/GeoIP2-Enterprise-Test.json +0 -745
  30. data/test/data/source-data/GeoIP2-ISP-Test.json +0 -12605
  31. data/test/data/source-data/GeoIP2-Precision-Enterprise-Test.json +0 -2205
  32. data/test/data/source-data/GeoIP2-Static-IP-Score-Test.json +0 -2132
  33. data/test/data/source-data/GeoIP2-User-Count-Test.json +0 -2837
  34. data/test/data/source-data/GeoLite2-ASN-Test.json +0 -4120
  35. data/test/data/source-data/GeoLite2-City-Test.json +0 -12804
  36. data/test/data/source-data/GeoLite2-Country-Test.json +0 -11280
  37. data/test/data/source-data/README +0 -15
  38. data/test/data/test-data/GeoIP2-Anonymous-IP-Test.mmdb +0 -0
  39. data/test/data/test-data/GeoIP2-City-Test-Broken-Double-Format.mmdb +0 -0
  40. data/test/data/test-data/GeoIP2-City-Test-Invalid-Node-Count.mmdb +0 -0
  41. data/test/data/test-data/GeoIP2-City-Test.mmdb +0 -0
  42. data/test/data/test-data/GeoIP2-Connection-Type-Test.mmdb +0 -0
  43. data/test/data/test-data/GeoIP2-Country-Test.mmdb +0 -0
  44. data/test/data/test-data/GeoIP2-DensityIncome-Test.mmdb +0 -0
  45. data/test/data/test-data/GeoIP2-Domain-Test.mmdb +0 -0
  46. data/test/data/test-data/GeoIP2-Enterprise-Test.mmdb +0 -0
  47. data/test/data/test-data/GeoIP2-ISP-Test.mmdb +0 -0
  48. data/test/data/test-data/GeoIP2-Precision-Enterprise-Test.mmdb +0 -0
  49. data/test/data/test-data/GeoIP2-Static-IP-Score-Test.mmdb +0 -0
  50. data/test/data/test-data/GeoIP2-User-Count-Test.mmdb +0 -0
  51. data/test/data/test-data/GeoLite2-ASN-Test.mmdb +0 -0
  52. data/test/data/test-data/GeoLite2-City-Test.mmdb +0 -0
  53. data/test/data/test-data/GeoLite2-Country-Test.mmdb +0 -0
  54. data/test/data/test-data/MaxMind-DB-no-ipv4-search-tree.mmdb +0 -0
  55. data/test/data/test-data/MaxMind-DB-string-value-entries.mmdb +0 -0
  56. data/test/data/test-data/MaxMind-DB-test-broken-pointers-24.mmdb +0 -0
  57. data/test/data/test-data/MaxMind-DB-test-broken-search-tree-24.mmdb +0 -0
  58. data/test/data/test-data/MaxMind-DB-test-decoder.mmdb +0 -0
  59. data/test/data/test-data/MaxMind-DB-test-ipv4-24.mmdb +0 -0
  60. data/test/data/test-data/MaxMind-DB-test-ipv4-28.mmdb +0 -0
  61. data/test/data/test-data/MaxMind-DB-test-ipv4-32.mmdb +0 -0
  62. data/test/data/test-data/MaxMind-DB-test-ipv6-24.mmdb +0 -0
  63. data/test/data/test-data/MaxMind-DB-test-ipv6-28.mmdb +0 -0
  64. data/test/data/test-data/MaxMind-DB-test-ipv6-32.mmdb +0 -0
  65. data/test/data/test-data/MaxMind-DB-test-metadata-pointers.mmdb +0 -0
  66. data/test/data/test-data/MaxMind-DB-test-mixed-24.mmdb +0 -0
  67. data/test/data/test-data/MaxMind-DB-test-mixed-28.mmdb +0 -0
  68. data/test/data/test-data/MaxMind-DB-test-mixed-32.mmdb +0 -0
  69. data/test/data/test-data/MaxMind-DB-test-nested.mmdb +0 -0
  70. data/test/data/test-data/MaxMind-DB-test-pointer-decoder.mmdb +0 -0
  71. data/test/data/test-data/README.md +0 -26
  72. data/test/data/test-data/maps-with-pointers.raw +0 -0
  73. data/test/data/test-data/write-test-data.pl +0 -695
  74. data/test/data/tidyall.ini +0 -5
  75. data/test/mmdb_util.rb +0 -26
  76. data/test/test_decoder.rb +0 -243
  77. data/test/test_reader.rb +0 -548
data/test/test_reader.rb DELETED
@@ -1,548 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'maxmind/db'
4
- require 'minitest/autorun'
5
- require 'mmdb_util'
6
-
7
- class ReaderTest < Minitest::Test
8
- def test_reader
9
- modes = [
10
- MaxMind::DB::MODE_FILE,
11
- MaxMind::DB::MODE_MEMORY,
12
- ]
13
-
14
- modes.each do |mode|
15
- record_sizes = [24, 28, 32]
16
- record_sizes.each do |record_size|
17
- ip_versions = [4, 6]
18
- ip_versions.each do |ip_version|
19
- filename = "test/data/test-data/MaxMind-DB-test-ipv#{ip_version}-#{record_size}.mmdb"
20
- reader = MaxMind::DB.new(filename, mode: mode)
21
- check_metadata(reader, ip_version, record_size)
22
- if ip_version == 4
23
- check_ipv4(reader, filename)
24
- else
25
- check_ipv6(reader, filename)
26
- end
27
- reader.close
28
- end
29
- end
30
- end
31
- end
32
-
33
- def test_reader_inspect
34
- modes = [
35
- MaxMind::DB::MODE_FILE,
36
- MaxMind::DB::MODE_MEMORY,
37
- ]
38
-
39
- modes.each do |mode|
40
- filename = 'test/data/test-data/MaxMind-DB-test-ipv4-24.mmdb'
41
- reader = MaxMind::DB.new(filename, mode: mode)
42
- assert_instance_of(String, reader.inspect)
43
- end
44
- end
45
-
46
- def test_get_with_prefix_len
47
- decoder_record = {
48
- 'array' => [1, 2, 3],
49
- 'boolean' => true,
50
- 'bytes' => "\x00\x00\x00*",
51
- 'double' => 42.123456,
52
- 'float' => 1.100000023841858,
53
- 'int32' => -268_435_456,
54
- 'map' => {
55
- 'mapX' => {
56
- 'arrayX' => [7, 8, 9],
57
- 'utf8_stringX' => 'hello',
58
- },
59
- },
60
- 'uint128' => 1_329_227_995_784_915_872_903_807_060_280_344_576,
61
- 'uint16' => 0x64,
62
- 'uint32' => 0x10000000,
63
- 'uint64' => 0x1000000000000000,
64
- 'utf8_string' => 'unicode! ☯ - ♫',
65
- }
66
-
67
- tests = [{
68
- 'ip' => '1.1.1.1',
69
- 'file_name' => 'MaxMind-DB-test-ipv6-32.mmdb',
70
- 'expected_prefix_length' => 8,
71
- 'expected_record' => nil,
72
- }, {
73
- 'ip' => '::1:ffff:ffff',
74
- 'file_name' => 'MaxMind-DB-test-ipv6-24.mmdb',
75
- 'expected_prefix_length' => 128,
76
- 'expected_record' => {
77
- 'ip' => '::1:ffff:ffff'
78
- },
79
- }, {
80
- 'ip' => '::2:0:1',
81
- 'file_name' => 'MaxMind-DB-test-ipv6-24.mmdb',
82
- 'expected_prefix_length' => 122,
83
- 'expected_record' => {
84
- 'ip' => '::2:0:0'
85
- },
86
- }, {
87
- 'ip' => '1.1.1.1',
88
- 'file_name' => 'MaxMind-DB-test-ipv4-24.mmdb',
89
- 'expected_prefix_length' => 32,
90
- 'expected_record' => {
91
- 'ip' => '1.1.1.1'
92
- },
93
- }, {
94
- 'ip' => '1.1.1.3',
95
- 'file_name' => 'MaxMind-DB-test-ipv4-24.mmdb',
96
- 'expected_prefix_length' => 31,
97
- 'expected_record' => {
98
- 'ip' => '1.1.1.2'
99
- },
100
- }, {
101
- 'ip' => '1.1.1.3',
102
- 'file_name' => 'MaxMind-DB-test-decoder.mmdb',
103
- 'expected_prefix_length' => 24,
104
- 'expected_record' => decoder_record,
105
- }, {
106
- 'ip' => '::ffff:1.1.1.128',
107
- 'file_name' => 'MaxMind-DB-test-decoder.mmdb',
108
- 'expected_prefix_length' => 120,
109
- 'expected_record' => decoder_record,
110
- }, {
111
- 'ip' => '::1.1.1.128',
112
- 'file_name' => 'MaxMind-DB-test-decoder.mmdb',
113
- 'expected_prefix_length' => 120,
114
- 'expected_record' => decoder_record,
115
- }, {
116
- 'ip' => '200.0.2.1',
117
- 'file_name' => 'MaxMind-DB-no-ipv4-search-tree.mmdb',
118
- 'expected_prefix_length' => 0,
119
- 'expected_record' => '::0/64',
120
- }, {
121
- 'ip' => '::200.0.2.1',
122
- 'file_name' => 'MaxMind-DB-no-ipv4-search-tree.mmdb',
123
- 'expected_prefix_length' => 64,
124
- 'expected_record' => '::0/64',
125
- }, {
126
- 'ip' => '0:0:0:0:ffff:ffff:ffff:ffff',
127
- 'file_name' => 'MaxMind-DB-no-ipv4-search-tree.mmdb',
128
- 'expected_prefix_length' => 64,
129
- 'expected_record' => '::0/64',
130
- }, {
131
- 'ip' => 'ef00::',
132
- 'file_name' => 'MaxMind-DB-no-ipv4-search-tree.mmdb',
133
- 'expected_prefix_length' => 1,
134
- 'expected_record' => nil,
135
- }]
136
-
137
- tests.each do |test|
138
- reader = MaxMind::DB.new("test/data/test-data/#{test['file_name']}")
139
- record, prefix_length = reader.get_with_prefix_length(test['ip'])
140
-
141
- assert_equal(test['expected_prefix_length'], prefix_length,
142
- format('expected prefix_length of %d for %s in %s but got %p',
143
- test['expected_prefix_length'], test['ip'],
144
- test['file_name'], prefix_length))
145
-
146
- msg = format('expected_record for %s in %s', test['ip'], test['file_name'])
147
- if test['expected_record'].nil?
148
- assert_nil(record, msg)
149
- else
150
- assert_equal(test['expected_record'], record, msg)
151
- end
152
- end
153
- end
154
-
155
- def test_decoder
156
- reader = MaxMind::DB.new(
157
- 'test/data/test-data/MaxMind-DB-test-decoder.mmdb'
158
- )
159
- record = reader.get('::1.1.1.0')
160
- assert_equal([1, 2, 3], record['array'])
161
- assert_equal(true, record['boolean'])
162
- assert_equal("\x00\x00\x00*".b, record['bytes'])
163
- assert_equal(42.123456, record['double'])
164
- assert_in_delta(1.1, record['float'])
165
- assert_equal(-268_435_456, record['int32'])
166
- assert_equal(
167
- {
168
- 'mapX' => {
169
- 'arrayX' => [7, 8, 9],
170
- 'utf8_stringX' => 'hello',
171
- },
172
- },
173
- record['map'],
174
- )
175
- assert_equal(100, record['uint16'])
176
- assert_equal(268_435_456, record['uint32'])
177
- assert_equal(1_152_921_504_606_846_976, record['uint64'])
178
- assert_equal('unicode! ☯ - ♫', record['utf8_string'])
179
- assert_equal(1_329_227_995_784_915_872_903_807_060_280_344_576, record['uint128'])
180
- reader.close
181
- end
182
-
183
- def test_metadata_pointers
184
- reader = MaxMind::DB.new(
185
- 'test/data/test-data/MaxMind-DB-test-metadata-pointers.mmdb'
186
- )
187
- assert_equal('Lots of pointers in metadata', reader.metadata.database_type)
188
- reader.close
189
- end
190
-
191
- def test_no_ipv4_search_tree
192
- reader = MaxMind::DB.new(
193
- 'test/data/test-data/MaxMind-DB-no-ipv4-search-tree.mmdb'
194
- )
195
- assert_equal('::0/64', reader.get('1.1.1.1'))
196
- assert_equal('::0/64', reader.get('192.1.1.1'))
197
- reader.close
198
- end
199
-
200
- def test_ipv6_address_in_ipv4_database
201
- reader = MaxMind::DB.new(
202
- 'test/data/test-data/MaxMind-DB-test-ipv4-24.mmdb'
203
- )
204
- e = assert_raises ArgumentError do
205
- reader.get('2001::')
206
- end
207
- assert_equal(
208
- 'Error looking up 2001::. You attempted to look up an IPv6 address in an IPv4-only database.',
209
- e.message,
210
- )
211
- reader.close
212
- end
213
-
214
- def test_bad_ip_parameter
215
- reader = MaxMind::DB.new('test/data/test-data/GeoIP2-City-Test.mmdb')
216
- e = assert_raises ArgumentError do
217
- reader.get(Object.new)
218
- end
219
- assert_equal(
220
- 'address family must be specified', # Not great, but type is ok
221
- e.message,
222
- )
223
- reader.close
224
- end
225
-
226
- def test_broken_database
227
- reader = MaxMind::DB.new(
228
- 'test/data/test-data/GeoIP2-City-Test-Broken-Double-Format.mmdb'
229
- )
230
- e = assert_raises MaxMind::DB::InvalidDatabaseError do
231
- reader.get('2001:220::')
232
- end
233
- assert_equal(
234
- 'The MaxMind DB file\'s data section contains bad data (unknown data type or corrupt data)',
235
- e.message,
236
- )
237
- reader.close
238
- end
239
-
240
- def test_ip_validation
241
- reader = MaxMind::DB.new(
242
- 'test/data/test-data/MaxMind-DB-test-decoder.mmdb'
243
- )
244
- e = assert_raises ArgumentError do
245
- reader.get('not_ip')
246
- end
247
- assert(e.message.include?('invalid address'))
248
- reader.close
249
- end
250
-
251
- def test_missing_database
252
- e = assert_raises SystemCallError do
253
- MaxMind::DB.new('file-does-not-exist.mmdb')
254
- end
255
- assert(e.message.include?('No such file or directory'))
256
- end
257
-
258
- def test_nondatabase
259
- e = assert_raises MaxMind::DB::InvalidDatabaseError do
260
- MaxMind::DB.new('README.md')
261
- end
262
- assert_equal(
263
- 'Metadata section not found. Is this a valid MaxMind DB file?',
264
- e.message,
265
- )
266
- end
267
-
268
- def test_too_many_constructor_args
269
- e = assert_raises ArgumentError do
270
- MaxMind::DB.new('README.md', {}, 'blah')
271
- end
272
- assert(e.message.include?('wrong number of arguments'))
273
- end
274
-
275
- def test_no_constructor_args
276
- e = assert_raises ArgumentError do
277
- MaxMind::DB.new
278
- end
279
- assert(e.message.include?('wrong number of arguments'))
280
- end
281
-
282
- def test_too_many_get_args
283
- reader = MaxMind::DB.new(
284
- 'test/data/test-data/MaxMind-DB-test-decoder.mmdb'
285
- )
286
- e = assert_raises ArgumentError do
287
- reader.get('1.1.1.1', 'blah')
288
- end
289
- assert(e.message.include?('wrong number of arguments'))
290
- reader.close
291
- end
292
-
293
- def test_no_get_args
294
- reader = MaxMind::DB.new(
295
- 'test/data/test-data/MaxMind-DB-test-decoder.mmdb'
296
- )
297
- e = assert_raises ArgumentError do
298
- reader.get
299
- end
300
- assert(e.message.include?('wrong number of arguments'))
301
- reader.close
302
- end
303
-
304
- def test_metadata_args
305
- reader = MaxMind::DB.new(
306
- 'test/data/test-data/MaxMind-DB-test-decoder.mmdb'
307
- )
308
- e = assert_raises ArgumentError do
309
- reader.metadata('hi')
310
- end
311
- assert(e.message.include?('wrong number of arguments'))
312
- reader.close
313
- end
314
-
315
- def test_metadata_unknown_attribute
316
- reader = MaxMind::DB.new(
317
- 'test/data/test-data/MaxMind-DB-test-decoder.mmdb'
318
- )
319
- e = assert_raises NoMethodError do
320
- reader.metadata.what
321
- end
322
- assert(e.message.include?('undefined method `what\''))
323
- reader.close
324
- end
325
-
326
- def test_close
327
- reader = MaxMind::DB.new(
328
- 'test/data/test-data/MaxMind-DB-test-decoder.mmdb'
329
- )
330
- reader.close
331
- end
332
-
333
- def test_double_close
334
- reader = MaxMind::DB.new(
335
- 'test/data/test-data/MaxMind-DB-test-decoder.mmdb'
336
- )
337
- reader.close
338
- reader.close
339
- end
340
-
341
- def test_closed_get
342
- reader = MaxMind::DB.new(
343
- 'test/data/test-data/MaxMind-DB-test-decoder.mmdb'
344
- )
345
- reader.close
346
- e = assert_raises IOError do
347
- reader.get('1.1.1.1')
348
- end
349
- assert_equal('closed stream', e.message)
350
- end
351
-
352
- def test_closed_metadata
353
- reader = MaxMind::DB.new(
354
- 'test/data/test-data/MaxMind-DB-test-decoder.mmdb'
355
- )
356
- reader.close
357
- assert_equal(
358
- { 'en' => 'MaxMind DB Decoder Test database - contains every MaxMind DB data type' },
359
- reader.metadata.description,
360
- )
361
- end
362
-
363
- def test_threads
364
- reader = MaxMind::DB.new(
365
- 'test/data/test-data/GeoIP2-Domain-Test.mmdb'
366
- )
367
-
368
- num_threads = 16
369
- num_lookups = 32
370
- thread_lookups = []
371
- num_threads.times do
372
- thread_lookups << []
373
- end
374
-
375
- threads = []
376
- num_threads.times do |i|
377
- threads << Thread.new do
378
- num_lookups.times do |j|
379
- thread_lookups[i] << reader.get("65.115.240.#{j}")
380
- thread_lookups[i] << reader.get("2a02:2770:3::#{j}")
381
- end
382
- end
383
- end
384
-
385
- threads.each(&:join)
386
-
387
- thread_lookups.each do |a|
388
- assert_equal(num_lookups * 2, a.length)
389
- thread_lookups.each do |b|
390
- assert_equal(a, b)
391
- end
392
- end
393
-
394
- reader.close
395
- end
396
-
397
- # In these tests I am trying to exercise Reader#read_node directly. It is not
398
- # too easy to test its behaviour with real databases, so construct dummy ones
399
- # directly.
400
- #
401
- def test_read_node
402
- tests = [
403
- {
404
- record_size: 24,
405
- # Left record + right record
406
- node_bytes: "\xab\xcd\xef".b + "\xbc\xfe\xfa".b,
407
- left: 11_259_375,
408
- right: 12_386_042,
409
- check_left: "\x00\xab\xcd\xef".b.unpack1('N'),
410
- check_right: "\x00\xbc\xfe\xfa".b.unpack1('N'),
411
- },
412
- {
413
- record_size: 28,
414
- # Left record (part) + middle byte + right record (part)
415
- node_bytes: "\xab\xcd\xef".b + "\x12".b + "\xfd\xdc\xfa".b,
416
- left: 28_036_591,
417
- right: 50_191_610,
418
- check_left: "\x01\xab\xcd\xef".b.unpack1('N'),
419
- check_right: "\x02\xfd\xdc\xfa".b.unpack1('N'),
420
- },
421
- {
422
- record_size: 32,
423
- # Left record + right record
424
- node_bytes: "\xab\xcd\xef\x12".b + "\xfd\xdc\xfa\x15".b,
425
- left: 2_882_400_018,
426
- right: 4_259_117_589,
427
- check_left: "\xab\xcd\xef\x12".b.unpack1('N'),
428
- check_right: "\xfd\xdc\xfa\x15".b.unpack1('N'),
429
- },
430
- ]
431
-
432
- tests.each do |test|
433
- buf = ''.b
434
- buf += test[:node_bytes]
435
-
436
- buf += "\x00".b * 16
437
-
438
- buf += "\xab\xcd\xefMaxMind.com".b
439
- buf += MMDBUtil.make_metadata_map(test[:record_size])
440
-
441
- reader = MaxMind::DB.new(
442
- buf, mode: MaxMind::DB::MODE_PARAM_IS_BUFFER
443
- )
444
-
445
- assert_equal(reader.metadata.record_size, test[:record_size])
446
-
447
- assert_equal(test[:left], reader.send(:read_node, 0, 0))
448
- assert_equal(test[:right], reader.send(:read_node, 0, 1))
449
- assert_equal(test[:left], test[:check_left])
450
- assert_equal(test[:right], test[:check_right])
451
- end
452
- end
453
-
454
- def check_metadata(reader, ip_version, record_size)
455
- metadata = reader.metadata
456
-
457
- assert_equal(2, metadata.binary_format_major_version, 'major_version')
458
- assert_equal(0, metadata.binary_format_minor_version, 'minor_version')
459
- assert_operator(metadata.build_epoch, :>, 1_373_571_901, 'build_epoch')
460
- assert_equal('Test', metadata.database_type, 'database_type')
461
- assert_equal(
462
- {
463
- 'en' => 'Test Database',
464
- 'zh' => 'Test Database Chinese',
465
- },
466
- metadata.description,
467
- 'description',
468
- )
469
- assert_equal(ip_version, metadata.ip_version, 'ip_version')
470
- assert_equal(%w[en zh], metadata.languages, 'languages')
471
- assert_operator(metadata.node_count, :>, 36, 'node_count')
472
- assert_equal(record_size, metadata.record_size, 'record_size')
473
- end
474
-
475
- def check_ipv4(reader, filename)
476
- 6.times do |i|
477
- address = "1.1.1.#{2**i}"
478
- assert_equal(
479
- { 'ip' => address },
480
- reader.get(address),
481
- "found expected data record for #{address} in #{filename}",
482
- )
483
- end
484
-
485
- pairs = {
486
- '1.1.1.3' => '1.1.1.2',
487
- '1.1.1.5' => '1.1.1.4',
488
- '1.1.1.7' => '1.1.1.4',
489
- '1.1.1.9' => '1.1.1.8',
490
- '1.1.1.15' => '1.1.1.8',
491
- '1.1.1.17' => '1.1.1.16',
492
- '1.1.1.31' => '1.1.1.16',
493
- }
494
- pairs.each do |key_address, value_address|
495
- data = { 'ip' => value_address }
496
- assert_equal(
497
- data,
498
- reader.get(key_address),
499
- "found expected data record for #{key_address} in #{filename}",
500
- )
501
- end
502
-
503
- ['1.1.1.33', '255.254.253.123'].each do |ip|
504
- assert_nil(
505
- reader.get(ip),
506
- "#{ip} is not in #{filename}",
507
- )
508
- end
509
- end
510
-
511
- def check_ipv6(reader, filename)
512
- subnets = [
513
- '::1:ffff:ffff', '::2:0:0', '::2:0:40', '::2:0:50', '::2:0:58',
514
- ]
515
- subnets.each do |address|
516
- assert_equal(
517
- { 'ip' => address },
518
- reader.get(address),
519
- "found expected data record for #{address} in #{filename}",
520
- )
521
- end
522
-
523
- pairs = {
524
- '::2:0:1' => '::2:0:0',
525
- '::2:0:33' => '::2:0:0',
526
- '::2:0:39' => '::2:0:0',
527
- '::2:0:41' => '::2:0:40',
528
- '::2:0:49' => '::2:0:40',
529
- '::2:0:52' => '::2:0:50',
530
- '::2:0:57' => '::2:0:50',
531
- '::2:0:59' => '::2:0:58',
532
- }
533
- pairs.each do |key_address, value_address|
534
- assert_equal(
535
- { 'ip' => value_address },
536
- reader.get(key_address),
537
- "found expected data record for #{key_address} in #{filename}",
538
- )
539
- end
540
-
541
- ['1.1.1.33', '255.254.253.123', '89fa::'].each do |ip|
542
- assert_nil(
543
- reader.get(ip),
544
- "#{ip} is not in #{filename}",
545
- )
546
- end
547
- end
548
- end