maxmind-db 1.3.2 → 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 (76) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/Gemfile.lock +31 -17
  4. data/README.md +2 -2
  5. data/Rakefile +1 -2
  6. data/maxmind-db.gemspec +6 -3
  7. metadata +46 -73
  8. data/test/data/LICENSE +0 -4
  9. data/test/data/MaxMind-DB-spec.md +0 -574
  10. data/test/data/README.md +0 -4
  11. data/test/data/bad-data/README.md +0 -7
  12. data/test/data/bad-data/libmaxminddb/libmaxminddb-offset-integer-overflow.mmdb +0 -0
  13. data/test/data/bad-data/maxminddb-golang/cyclic-data-structure.mmdb +0 -0
  14. data/test/data/bad-data/maxminddb-golang/invalid-bytes-length.mmdb +0 -1
  15. data/test/data/bad-data/maxminddb-golang/invalid-data-record-offset.mmdb +0 -0
  16. data/test/data/bad-data/maxminddb-golang/invalid-map-key-length.mmdb +0 -0
  17. data/test/data/bad-data/maxminddb-golang/invalid-string-length.mmdb +0 -1
  18. data/test/data/bad-data/maxminddb-golang/metadata-is-an-uint128.mmdb +0 -1
  19. data/test/data/bad-data/maxminddb-golang/unexpected-bytes.mmdb +0 -0
  20. data/test/data/bad-data/maxminddb-python/bad-unicode-in-map-key.mmdb +0 -0
  21. data/test/data/perltidyrc +0 -12
  22. data/test/data/source-data/GeoIP2-Anonymous-IP-Test.json +0 -49
  23. data/test/data/source-data/GeoIP2-City-Test.json +0 -12885
  24. data/test/data/source-data/GeoIP2-Connection-Type-Test.json +0 -122
  25. data/test/data/source-data/GeoIP2-Country-Test.json +0 -15904
  26. data/test/data/source-data/GeoIP2-DensityIncome-Test.json +0 -14
  27. data/test/data/source-data/GeoIP2-Domain-Test.json +0 -452
  28. data/test/data/source-data/GeoIP2-Enterprise-Test.json +0 -745
  29. data/test/data/source-data/GeoIP2-ISP-Test.json +0 -12605
  30. data/test/data/source-data/GeoIP2-Precision-Enterprise-Test.json +0 -2205
  31. data/test/data/source-data/GeoIP2-Static-IP-Score-Test.json +0 -2132
  32. data/test/data/source-data/GeoIP2-User-Count-Test.json +0 -2837
  33. data/test/data/source-data/GeoLite2-ASN-Test.json +0 -4120
  34. data/test/data/source-data/GeoLite2-City-Test.json +0 -12804
  35. data/test/data/source-data/GeoLite2-Country-Test.json +0 -11280
  36. data/test/data/source-data/README +0 -15
  37. data/test/data/test-data/GeoIP2-Anonymous-IP-Test.mmdb +0 -0
  38. data/test/data/test-data/GeoIP2-City-Test-Broken-Double-Format.mmdb +0 -0
  39. data/test/data/test-data/GeoIP2-City-Test-Invalid-Node-Count.mmdb +0 -0
  40. data/test/data/test-data/GeoIP2-City-Test.mmdb +0 -0
  41. data/test/data/test-data/GeoIP2-Connection-Type-Test.mmdb +0 -0
  42. data/test/data/test-data/GeoIP2-Country-Test.mmdb +0 -0
  43. data/test/data/test-data/GeoIP2-DensityIncome-Test.mmdb +0 -0
  44. data/test/data/test-data/GeoIP2-Domain-Test.mmdb +0 -0
  45. data/test/data/test-data/GeoIP2-Enterprise-Test.mmdb +0 -0
  46. data/test/data/test-data/GeoIP2-ISP-Test.mmdb +0 -0
  47. data/test/data/test-data/GeoIP2-Precision-Enterprise-Test.mmdb +0 -0
  48. data/test/data/test-data/GeoIP2-Static-IP-Score-Test.mmdb +0 -0
  49. data/test/data/test-data/GeoIP2-User-Count-Test.mmdb +0 -0
  50. data/test/data/test-data/GeoLite2-ASN-Test.mmdb +0 -0
  51. data/test/data/test-data/GeoLite2-City-Test.mmdb +0 -0
  52. data/test/data/test-data/GeoLite2-Country-Test.mmdb +0 -0
  53. data/test/data/test-data/MaxMind-DB-no-ipv4-search-tree.mmdb +0 -0
  54. data/test/data/test-data/MaxMind-DB-string-value-entries.mmdb +0 -0
  55. data/test/data/test-data/MaxMind-DB-test-broken-pointers-24.mmdb +0 -0
  56. data/test/data/test-data/MaxMind-DB-test-broken-search-tree-24.mmdb +0 -0
  57. data/test/data/test-data/MaxMind-DB-test-decoder.mmdb +0 -0
  58. data/test/data/test-data/MaxMind-DB-test-ipv4-24.mmdb +0 -0
  59. data/test/data/test-data/MaxMind-DB-test-ipv4-28.mmdb +0 -0
  60. data/test/data/test-data/MaxMind-DB-test-ipv4-32.mmdb +0 -0
  61. data/test/data/test-data/MaxMind-DB-test-ipv6-24.mmdb +0 -0
  62. data/test/data/test-data/MaxMind-DB-test-ipv6-28.mmdb +0 -0
  63. data/test/data/test-data/MaxMind-DB-test-ipv6-32.mmdb +0 -0
  64. data/test/data/test-data/MaxMind-DB-test-metadata-pointers.mmdb +0 -0
  65. data/test/data/test-data/MaxMind-DB-test-mixed-24.mmdb +0 -0
  66. data/test/data/test-data/MaxMind-DB-test-mixed-28.mmdb +0 -0
  67. data/test/data/test-data/MaxMind-DB-test-mixed-32.mmdb +0 -0
  68. data/test/data/test-data/MaxMind-DB-test-nested.mmdb +0 -0
  69. data/test/data/test-data/MaxMind-DB-test-pointer-decoder.mmdb +0 -0
  70. data/test/data/test-data/README.md +0 -26
  71. data/test/data/test-data/maps-with-pointers.raw +0 -0
  72. data/test/data/test-data/write-test-data.pl +0 -695
  73. data/test/data/tidyall.ini +0 -5
  74. data/test/mmdb_util.rb +0 -26
  75. data/test/test_decoder.rb +0 -241
  76. data/test/test_reader.rb +0 -547
data/test/test_reader.rb DELETED
@@ -1,547 +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
- assert_raises NoMethodError do
320
- reader.metadata.what
321
- end
322
- reader.close
323
- end
324
-
325
- def test_close
326
- reader = MaxMind::DB.new(
327
- 'test/data/test-data/MaxMind-DB-test-decoder.mmdb'
328
- )
329
- reader.close
330
- end
331
-
332
- def test_double_close
333
- reader = MaxMind::DB.new(
334
- 'test/data/test-data/MaxMind-DB-test-decoder.mmdb'
335
- )
336
- reader.close
337
- reader.close
338
- end
339
-
340
- def test_closed_get
341
- reader = MaxMind::DB.new(
342
- 'test/data/test-data/MaxMind-DB-test-decoder.mmdb'
343
- )
344
- reader.close
345
- e = assert_raises IOError do
346
- reader.get('1.1.1.1')
347
- end
348
- assert_equal('closed stream', e.message)
349
- end
350
-
351
- def test_closed_metadata
352
- reader = MaxMind::DB.new(
353
- 'test/data/test-data/MaxMind-DB-test-decoder.mmdb'
354
- )
355
- reader.close
356
- assert_equal(
357
- { 'en' => 'MaxMind DB Decoder Test database - contains every MaxMind DB data type' },
358
- reader.metadata.description,
359
- )
360
- end
361
-
362
- def test_threads
363
- reader = MaxMind::DB.new(
364
- 'test/data/test-data/GeoIP2-Domain-Test.mmdb'
365
- )
366
-
367
- num_threads = 16
368
- num_lookups = 32
369
- thread_lookups = []
370
- num_threads.times do
371
- thread_lookups << []
372
- end
373
-
374
- threads = []
375
- num_threads.times do |i|
376
- threads << Thread.new do
377
- num_lookups.times do |j|
378
- thread_lookups[i] << reader.get("65.115.240.#{j}")
379
- thread_lookups[i] << reader.get("2a02:2770:3::#{j}")
380
- end
381
- end
382
- end
383
-
384
- threads.each(&:join)
385
-
386
- thread_lookups.each do |a|
387
- assert_equal(num_lookups * 2, a.length)
388
- thread_lookups.each do |b|
389
- assert_equal(a, b)
390
- end
391
- end
392
-
393
- reader.close
394
- end
395
-
396
- # In these tests I am trying to exercise Reader#read_node directly. It is not
397
- # too easy to test its behaviour with real databases, so construct dummy ones
398
- # directly.
399
- #
400
- def test_read_node
401
- tests = [
402
- {
403
- record_size: 24,
404
- # Left record + right record
405
- node_bytes: "\xab\xcd\xef".b + "\xbc\xfe\xfa".b,
406
- left: 11_259_375,
407
- right: 12_386_042,
408
- check_left: "\x00\xab\xcd\xef".b.unpack1('N'),
409
- check_right: "\x00\xbc\xfe\xfa".b.unpack1('N'),
410
- },
411
- {
412
- record_size: 28,
413
- # Left record (part) + middle byte + right record (part)
414
- node_bytes: "\xab\xcd\xef".b + "\x12".b + "\xfd\xdc\xfa".b,
415
- left: 28_036_591,
416
- right: 50_191_610,
417
- check_left: "\x01\xab\xcd\xef".b.unpack1('N'),
418
- check_right: "\x02\xfd\xdc\xfa".b.unpack1('N'),
419
- },
420
- {
421
- record_size: 32,
422
- # Left record + right record
423
- node_bytes: "\xab\xcd\xef\x12".b + "\xfd\xdc\xfa\x15".b,
424
- left: 2_882_400_018,
425
- right: 4_259_117_589,
426
- check_left: "\xab\xcd\xef\x12".b.unpack1('N'),
427
- check_right: "\xfd\xdc\xfa\x15".b.unpack1('N'),
428
- },
429
- ]
430
-
431
- tests.each do |test|
432
- buf = ''.b
433
- buf += test[:node_bytes]
434
-
435
- buf += "\x00".b * 16
436
-
437
- buf += "\xab\xcd\xefMaxMind.com".b
438
- buf += MMDBUtil.make_metadata_map(test[:record_size])
439
-
440
- reader = MaxMind::DB.new(
441
- buf, mode: MaxMind::DB::MODE_PARAM_IS_BUFFER
442
- )
443
-
444
- assert_equal(reader.metadata.record_size, test[:record_size])
445
-
446
- assert_equal(test[:left], reader.send(:read_node, 0, 0))
447
- assert_equal(test[:right], reader.send(:read_node, 0, 1))
448
- assert_equal(test[:left], test[:check_left])
449
- assert_equal(test[:right], test[:check_right])
450
- end
451
- end
452
-
453
- def check_metadata(reader, ip_version, record_size)
454
- metadata = reader.metadata
455
-
456
- assert_equal(2, metadata.binary_format_major_version, 'major_version')
457
- assert_equal(0, metadata.binary_format_minor_version, 'minor_version')
458
- assert_operator(metadata.build_epoch, :>, 1_373_571_901, 'build_epoch')
459
- assert_equal('Test', metadata.database_type, 'database_type')
460
- assert_equal(
461
- {
462
- 'en' => 'Test Database',
463
- 'zh' => 'Test Database Chinese',
464
- },
465
- metadata.description,
466
- 'description',
467
- )
468
- assert_equal(ip_version, metadata.ip_version, 'ip_version')
469
- assert_equal(%w[en zh], metadata.languages, 'languages')
470
- assert_operator(metadata.node_count, :>, 36, 'node_count')
471
- assert_equal(record_size, metadata.record_size, 'record_size')
472
- end
473
-
474
- def check_ipv4(reader, filename)
475
- 6.times do |i|
476
- address = "1.1.1.#{2**i}"
477
- assert_equal(
478
- { 'ip' => address },
479
- reader.get(address),
480
- "found expected data record for #{address} in #{filename}",
481
- )
482
- end
483
-
484
- pairs = {
485
- '1.1.1.3' => '1.1.1.2',
486
- '1.1.1.5' => '1.1.1.4',
487
- '1.1.1.7' => '1.1.1.4',
488
- '1.1.1.9' => '1.1.1.8',
489
- '1.1.1.15' => '1.1.1.8',
490
- '1.1.1.17' => '1.1.1.16',
491
- '1.1.1.31' => '1.1.1.16',
492
- }
493
- pairs.each do |key_address, value_address|
494
- data = { 'ip' => value_address }
495
- assert_equal(
496
- data,
497
- reader.get(key_address),
498
- "found expected data record for #{key_address} in #{filename}",
499
- )
500
- end
501
-
502
- ['1.1.1.33', '255.254.253.123'].each do |ip|
503
- assert_nil(
504
- reader.get(ip),
505
- "#{ip} is not in #{filename}",
506
- )
507
- end
508
- end
509
-
510
- def check_ipv6(reader, filename)
511
- subnets = [
512
- '::1:ffff:ffff', '::2:0:0', '::2:0:40', '::2:0:50', '::2:0:58',
513
- ]
514
- subnets.each do |address|
515
- assert_equal(
516
- { 'ip' => address },
517
- reader.get(address),
518
- "found expected data record for #{address} in #{filename}",
519
- )
520
- end
521
-
522
- pairs = {
523
- '::2:0:1' => '::2:0:0',
524
- '::2:0:33' => '::2:0:0',
525
- '::2:0:39' => '::2:0:0',
526
- '::2:0:41' => '::2:0:40',
527
- '::2:0:49' => '::2:0:40',
528
- '::2:0:52' => '::2:0:50',
529
- '::2:0:57' => '::2:0:50',
530
- '::2:0:59' => '::2:0:58',
531
- }
532
- pairs.each do |key_address, value_address|
533
- assert_equal(
534
- { 'ip' => value_address },
535
- reader.get(key_address),
536
- "found expected data record for #{key_address} in #{filename}",
537
- )
538
- end
539
-
540
- ['1.1.1.33', '255.254.253.123', '89fa::'].each do |ip|
541
- assert_nil(
542
- reader.get(ip),
543
- "#{ip} is not in #{filename}",
544
- )
545
- end
546
- end
547
- end