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/mmdb_util.rb DELETED
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class MMDBUtil
4
- def self.make_metadata_map(record_size)
5
- # Map
6
- "\xe9".b +
7
- # node_count => 0
8
- "\x4anode_count\xc0".b +
9
- # record_size => 28 would be \xa1\x1c
10
- "\x4brecord_size\xa1".b + record_size.chr.b +
11
- # ip_version => 4
12
- "\x4aip_version\xa1\x04".b +
13
- # database_type => 'test'
14
- "\x4ddatabase_type\x44test".b +
15
- # languages => ['en']
16
- "\x49languages\x01\x04\x42en".b +
17
- # binary_format_major_version => 2
18
- "\x5bbinary_format_major_version\xa1\x02".b +
19
- # binary_format_minor_version => 0
20
- "\x5bbinary_format_minor_version\xa0".b +
21
- # build_epoch => 0
22
- "\x4bbuild_epoch\x00\x02".b +
23
- # description => 'hi'
24
- "\x4bdescription\x42hi".b
25
- end
26
- end
data/test/test_decoder.rb DELETED
@@ -1,241 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'maxmind/db'
4
- require 'minitest/autorun'
5
- require 'mmdb_util'
6
-
7
- class DecoderTest < Minitest::Test
8
- def test_arrays
9
- arrays = {
10
- "\x00\x04".b => [],
11
- "\x01\x04\x43\x46\x6f\x6f".b => ['Foo'],
12
- "\x02\x04\x43\x46\x6f\x6f\x43\xe4\xba\xba".b => %w[Foo 人],
13
- }
14
- validate_type_decoding('arrays', arrays)
15
- end
16
-
17
- def test_boolean
18
- booleans = {
19
- "\x00\x07".b => false,
20
- "\x01\x07".b => true,
21
- }
22
- validate_type_decoding('booleans', booleans)
23
- end
24
-
25
- def test_bytes
26
- tests = {
27
- "\x83\xE4\xBA\xBA".b => '人'.b,
28
- }
29
- validate_type_decoding('bytes', tests)
30
- end
31
-
32
- def test_double
33
- doubles = {
34
- "\x68\x00\x00\x00\x00\x00\x00\x00\x00".b => 0.0,
35
- "\x68\x3F\xE0\x00\x00\x00\x00\x00\x00".b => 0.5,
36
- "\x68\x40\x09\x21\xFB\x54\x44\x2E\xEA".b => 3.14159265359,
37
- "\x68\x40\x5E\xC0\x00\x00\x00\x00\x00".b => 123.0,
38
- "\x68\x41\xD0\x00\x00\x00\x07\xF8\xF4".b => 1_073_741_824.12457,
39
- "\x68\xBF\xE0\x00\x00\x00\x00\x00\x00".b => -0.5,
40
- "\x68\xC0\x09\x21\xFB\x54\x44\x2E\xEA".b => -3.14159265359,
41
- "\x68\xC1\xD0\x00\x00\x00\x07\xF8\xF4".b => -1_073_741_824.12457,
42
- }
43
- validate_type_decoding('double', doubles)
44
- end
45
-
46
- def test_float
47
- floats = {
48
- "\x04\x08\x00\x00\x00\x00".b => 0.0,
49
- "\x04\x08\x3F\x80\x00\x00".b => 1.0,
50
- "\x04\x08\x3F\x8C\xCC\xCD".b => 1.1,
51
- "\x04\x08\x40\x48\xF5\xC3".b => 3.14,
52
- "\x04\x08\x46\x1C\x3F\xF6".b => 9999.99,
53
- "\x04\x08\xBF\x80\x00\x00".b => -1.0,
54
- "\x04\x08\xBF\x8C\xCC\xCD".b => -1.1,
55
- "\x04\x08\xC0\x48\xF5\xC3".b => -3.14,
56
- "\x04\x08\xC6\x1C\x3F\xF6".b => -9999.99
57
- }
58
- validate_type_decoding('float', floats)
59
- end
60
-
61
- def test_int32
62
- int32 = {
63
- "\x00\x01".b => 0,
64
- "\x04\x01\xff\xff\xff\xff".b => -1,
65
- "\x01\x01\xff".b => 255,
66
- "\x04\x01\xff\xff\xff\x01".b => -255,
67
- "\x02\x01\x01\xf4".b => 500,
68
- "\x04\x01\xff\xff\xfe\x0c".b => -500,
69
- "\x02\x01\xff\xff".b => 65_535,
70
- "\x04\x01\xff\xff\x00\x01".b => -65_535,
71
- "\x03\x01\xff\xff\xff".b => 16_777_215,
72
- "\x04\x01\xff\x00\x00\x01".b => -16_777_215,
73
- "\x04\x01\x7f\xff\xff\xff".b => 2_147_483_647,
74
- "\x04\x01\x80\x00\x00\x01".b => -2_147_483_647,
75
- }
76
- validate_type_decoding('int32', int32)
77
- end
78
-
79
- def test_map
80
- maps = {
81
- "\xe0".b => {},
82
- "\xe1\x42\x65\x6e\x43\x46\x6f\x6f".b => {
83
- 'en' => 'Foo'
84
- },
85
- "\xe2\x42\x65\x6e\x43\x46\x6f\x6f\x42\x7a\x68\x43\xe4\xba\xba".b => {
86
- 'en' => 'Foo',
87
- 'zh' => '人'
88
- },
89
- "\xe1\x44\x6e\x61\x6d\x65\xe2\x42\x65\x6e".b +
90
- "\x43\x46\x6f\x6f\x42\x7a\x68\x43\xe4\xba\xba".b => {
91
- 'name' => {
92
- 'en' => 'Foo',
93
- 'zh' => '人'
94
- }
95
- },
96
- "\xe1\x49\x6c\x61\x6e\x67\x75\x61\x67\x65\x73".b +
97
- "\x02\x04\x42\x65\x6e\x42\x7a\x68".b => {
98
- 'languages' => %w[en zh]
99
- },
100
- MMDBUtil.make_metadata_map(28) => {
101
- 'node_count' => 0,
102
- 'record_size' => 28,
103
- 'ip_version' => 4,
104
- 'database_type' => 'test',
105
- 'languages' => ['en'],
106
- 'binary_format_major_version' => 2,
107
- 'binary_format_minor_version' => 0,
108
- 'build_epoch' => 0,
109
- 'description' => 'hi',
110
- },
111
- }
112
- validate_type_decoding('maps', maps)
113
- end
114
-
115
- def test_pointer
116
- pointers = {
117
- "\x20\x00".b => 0,
118
- "\x20\x05".b => 5,
119
- "\x20\x0a".b => 10,
120
- "\x23\xff".b => 1023,
121
- "\x28\x03\xc9".b => 3017,
122
- "\x2f\xf7\xfb".b => 524_283,
123
- "\x2f\xff\xff".b => 526_335,
124
- "\x37\xf7\xf7\xfe".b => 134_217_726,
125
- "\x37\xff\xff\xff".b => 134_744_063,
126
- "\x38\x7f\xff\xff\xff".b => 2_147_483_647,
127
- "\x38\xff\xff\xff\xff".b => 4_294_967_295,
128
- }
129
- validate_type_decoding('pointers', pointers)
130
- end
131
-
132
- # rubocop:disable Style/ClassVars
133
- @@strings = {
134
- "\x40".b => '',
135
- "\x41\x31".b => '1',
136
- "\x43\xE4\xBA\xBA".b => '人',
137
- "\x5b\x31\x32\x33\x34".b +
138
- "\x35\x36\x37\x38\x39\x30\x31\x32\x33\x34\x35".b +
139
- "\x36\x37\x38\x39\x30\x31\x32\x33\x34\x35\x36\x37".b =>
140
- '123456789012345678901234567',
141
- "\x5c\x31\x32\x33\x34".b +
142
- "\x35\x36\x37\x38\x39\x30\x31\x32\x33\x34\x35".b +
143
- "\x36\x37\x38\x39\x30\x31\x32\x33\x34\x35\x36".b +
144
- "\x37\x38".b => '1234567890123456789012345678',
145
- "\x5d\x00\x31\x32\x33".b +
146
- "\x34\x35\x36\x37\x38\x39\x30\x31\x32\x33\x34".b +
147
- "\x35\x36\x37\x38\x39\x30\x31\x32\x33\x34\x35".b +
148
- "\x36\x37\x38\x39".b => '12345678901234567890123456789',
149
- "\x5d\x01\x31\x32\x33".b +
150
- "\x34\x35\x36\x37\x38\x39\x30\x31\x32\x33\x34".b +
151
- "\x35\x36\x37\x38\x39\x30\x31\x32\x33\x34\x35".b +
152
- "\x36\x37\x38\x39\x30".b => '123456789012345678901234567890',
153
- "\x5e\x00\xd7".b + ("\x78".b * 500) => 'x' * 500,
154
- "\x5e\x06\xb3".b + ("\x78".b * 2000) => 'x' * 2000,
155
- "\x5f\x00\x10\x53".b + ("\x78".b * 70_000) => 'x' * 70_000,
156
- }
157
- # rubocop:enable Style/ClassVars
158
-
159
- def test_string
160
- values = validate_type_decoding('string', @@strings)
161
- values.each do |s|
162
- assert_equal(Encoding::UTF_8, s.encoding)
163
- end
164
- end
165
-
166
- def test_uint16
167
- uint16 = {
168
- "\xa0".b => 0,
169
- "\xa1\xff".b => 255,
170
- "\xa2\x01\xf4".b => 500,
171
- "\xa2\x2a\x78".b => 10_872,
172
- "\xa2\xff\xff".b => 65_535,
173
- }
174
- validate_type_decoding('uint16', uint16)
175
- end
176
-
177
- def test_uint32
178
- uint32 = {
179
- "\xc0".b => 0,
180
- "\xc1\xff".b => 255,
181
- "\xc2\x01\xf4".b => 500,
182
- "\xc2\x2a\x78".b => 10_872,
183
- "\xc2\xff\xff".b => 65_535,
184
- "\xc3\xff\xff\xff".b => 16_777_215,
185
- "\xc4\xff\xff\xff\xff".b => 4_294_967_295,
186
- }
187
- validate_type_decoding('uint32', uint32)
188
- end
189
-
190
- def generate_large_uint(bits)
191
- ctrl_byte = bits == 64 ? "\x02".b : "\x03".b
192
- uints = {
193
- "\x00".b + ctrl_byte => 0,
194
- "\x02".b + ctrl_byte + "\x01\xf4".b => 500,
195
- "\x02".b + ctrl_byte + "\x2a\x78".b => 10_872,
196
- }
197
- ((bits / 8) + 1).times do |power|
198
- expected = (2**(8 * power)) - 1
199
- input = [power].pack('C') + ctrl_byte + ("\xff".b * power)
200
- uints[input] = expected
201
- end
202
- uints
203
- end
204
-
205
- def test_uint64
206
- validate_type_decoding('uint64', generate_large_uint(64))
207
- end
208
-
209
- def test_uint128
210
- validate_type_decoding('uint128', generate_large_uint(128))
211
- end
212
-
213
- def validate_type_decoding(type, tests)
214
- tests.map do |input, expected|
215
- check_decoding(type, input, expected)
216
- end
217
- end
218
-
219
- def check_decoding(type, input, expected, name = nil)
220
- name ||= expected
221
-
222
- io = MaxMind::DB::MemoryReader.new(input, is_buffer: true)
223
-
224
- pointer_base = 0
225
- pointer_test = true
226
- decoder = MaxMind::DB::Decoder.new(io, pointer_base,
227
- pointer_test)
228
-
229
- offset = 0
230
- r = decoder.decode(offset)
231
-
232
- if %w[float double].include?(type)
233
- assert_in_delta(expected, r[0], 0.001, name)
234
- else
235
- assert_equal(expected, r[0], name)
236
- end
237
-
238
- io.close
239
- r[0]
240
- end
241
- end