geoip2_c 0.3.0 → 0.3.1
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.
- checksums.yaml +4 -4
- data/ext/geoip2/libmaxminddb/.gitignore +35 -0
- data/ext/geoip2/libmaxminddb/.gitmodules +9 -0
- data/ext/geoip2/libmaxminddb/.perltidyrc +11 -0
- data/ext/geoip2/libmaxminddb/.travis.yml +48 -0
- data/ext/geoip2/libmaxminddb/.uncrustify.cfg +78 -0
- data/ext/geoip2/libmaxminddb/AUTHORS +0 -0
- data/ext/geoip2/libmaxminddb/Changes.md +238 -0
- data/ext/geoip2/libmaxminddb/LICENSE +202 -0
- data/ext/geoip2/libmaxminddb/Makefile.am +41 -0
- data/ext/geoip2/libmaxminddb/NOTICE +13 -0
- data/ext/geoip2/libmaxminddb/README.dev.md +58 -0
- data/ext/geoip2/libmaxminddb/README.md +122 -0
- data/ext/geoip2/libmaxminddb/appveyor.yml +33 -0
- data/ext/geoip2/libmaxminddb/bin/Makefile.am +5 -0
- data/ext/geoip2/libmaxminddb/bin/mmdblookup.c +397 -0
- data/ext/geoip2/libmaxminddb/bootstrap +21 -0
- data/ext/geoip2/libmaxminddb/common.mk +7 -0
- data/ext/geoip2/libmaxminddb/configure.ac +132 -0
- data/ext/geoip2/libmaxminddb/dev-bin/make-man-pages.pl +76 -0
- data/ext/geoip2/libmaxminddb/dev-bin/ppa-release.sh +50 -0
- data/ext/geoip2/libmaxminddb/dev-bin/regen-prototypes.pl +136 -0
- data/ext/geoip2/libmaxminddb/dev-bin/regen-win32-test-projs.pl +54 -0
- data/ext/geoip2/libmaxminddb/dev-bin/release.sh +106 -0
- data/ext/geoip2/libmaxminddb/dev-bin/uncrustify-all.sh +21 -0
- data/ext/geoip2/libmaxminddb/dev-bin/valgrind-all.pl +46 -0
- data/ext/geoip2/libmaxminddb/doc/libmaxminddb.md +889 -0
- data/ext/geoip2/libmaxminddb/doc/mmdblookup.md +103 -0
- data/ext/geoip2/libmaxminddb/include/maxminddb.h +232 -0
- data/ext/geoip2/libmaxminddb/include/maxminddb_config.h.in +14 -0
- data/ext/geoip2/libmaxminddb/projects/VS12/README.md +59 -0
- data/ext/geoip2/libmaxminddb/projects/VS12/libmaxminddb-release.props +32 -0
- data/ext/geoip2/libmaxminddb/projects/VS12/libmaxminddb-x64.props +14 -0
- data/ext/geoip2/libmaxminddb/projects/VS12/libmaxminddb.props +32 -0
- data/ext/geoip2/libmaxminddb/projects/VS12/libmaxminddb.sln +150 -0
- data/ext/geoip2/libmaxminddb/projects/VS12/libmaxminddb.vcxproj +141 -0
- data/ext/geoip2/libmaxminddb/projects/VS12/libmaxminddb.vcxproj.filters +26 -0
- data/ext/geoip2/libmaxminddb/projects/VS12/maxminddb_config.h +14 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/bad_pointers.vcxproj +105 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/basic_lookup.vcxproj +105 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/data_entry_list.vcxproj +105 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/data_types.vcxproj +105 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/dump.vcxproj +105 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/get_value.vcxproj +105 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/get_value_pointer_bug.vcxproj +105 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/ipv4_start_cache.vcxproj +105 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/ipv6_lookup_in_ipv4.vcxproj +105 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/libtap.vcxproj +85 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/maxminddb_test_helper.vcxproj +107 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/metadata.vcxproj +105 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/metadata_pointers.vcxproj +105 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/no_map_get_value.vcxproj +105 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/read_node.vcxproj +105 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/shared.vcxproj +104 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/threads.vcxproj +103 -0
- data/ext/geoip2/libmaxminddb/projects/VS12-tests/version.vcxproj +105 -0
- data/ext/geoip2/libmaxminddb/projects/test.vcxproj.template +105 -0
- data/ext/geoip2/libmaxminddb/src/Makefile.am +9 -0
- data/ext/geoip2/libmaxminddb/src/libmaxminddb.pc.in +11 -0
- data/ext/geoip2/libmaxminddb/src/maxminddb-compat-util.h +167 -0
- data/ext/geoip2/libmaxminddb/src/maxminddb.c +2171 -0
- data/ext/geoip2/libmaxminddb/t/Makefile.am +23 -0
- data/ext/geoip2/libmaxminddb/t/bad_databases_t.c +66 -0
- data/ext/geoip2/libmaxminddb/t/bad_pointers_t.c +53 -0
- data/ext/geoip2/libmaxminddb/t/basic_lookup_t.c +172 -0
- data/ext/geoip2/libmaxminddb/t/compile_c++_t.pl +107 -0
- data/ext/geoip2/libmaxminddb/t/data_entry_list_t.c +353 -0
- data/ext/geoip2/libmaxminddb/t/data_types_t.c +439 -0
- data/ext/geoip2/libmaxminddb/t/dump_t.c +103 -0
- data/ext/geoip2/libmaxminddb/t/get_value_pointer_bug_t.c +66 -0
- data/ext/geoip2/libmaxminddb/t/get_value_t.c +249 -0
- data/ext/geoip2/libmaxminddb/t/ipv4_start_cache_t.c +36 -0
- data/ext/geoip2/libmaxminddb/t/ipv6_lookup_in_ipv4_t.c +48 -0
- data/ext/geoip2/libmaxminddb/t/maxminddb_test_helper.c +255 -0
- data/ext/geoip2/libmaxminddb/t/maxminddb_test_helper.h +69 -0
- data/ext/geoip2/libmaxminddb/t/metadata_pointers_t.c +32 -0
- data/ext/geoip2/libmaxminddb/t/metadata_t.c +226 -0
- data/ext/geoip2/libmaxminddb/t/mmdblookup_t.pl +158 -0
- data/ext/geoip2/libmaxminddb/t/no_map_get_value_t.c +32 -0
- data/ext/geoip2/libmaxminddb/t/read_node_t.c +157 -0
- data/ext/geoip2/libmaxminddb/t/threads_t.c +196 -0
- data/ext/geoip2/libmaxminddb/t/version_t.c +10 -0
- data/geoip2_c.gemspec +1 -1
- data/lib/geoip2/version.rb +1 -1
- metadata +82 -1
@@ -0,0 +1,353 @@
|
|
1
|
+
#include "maxminddb_test_helper.h"
|
2
|
+
|
3
|
+
MMDB_entry_data_list_s *test_array_value(MMDB_entry_data_list_s
|
4
|
+
*entry_data_list)
|
5
|
+
{
|
6
|
+
MMDB_entry_data_list_s *array = entry_data_list = entry_data_list->next;
|
7
|
+
cmp_ok(array->entry_data.type, "==", MMDB_DATA_TYPE_ARRAY,
|
8
|
+
"'array' key's value is an array");
|
9
|
+
cmp_ok(array->entry_data.data_size, "==", 3,
|
10
|
+
"'array' key's value has 3 elements");
|
11
|
+
|
12
|
+
MMDB_entry_data_list_s *idx0 = entry_data_list = entry_data_list->next;
|
13
|
+
cmp_ok(idx0->entry_data.type, "==", MMDB_DATA_TYPE_UINT32,
|
14
|
+
"first array entry is a UINT32");
|
15
|
+
cmp_ok(idx0->entry_data.uint32, "==", 1, "first array entry value is 1");
|
16
|
+
|
17
|
+
MMDB_entry_data_list_s *idx1 = entry_data_list = entry_data_list->next;
|
18
|
+
cmp_ok(idx1->entry_data.type, "==", MMDB_DATA_TYPE_UINT32,
|
19
|
+
"second array entry is a UINT32");
|
20
|
+
cmp_ok(idx1->entry_data.uint32, "==", 2, "second array entry value is 2");
|
21
|
+
|
22
|
+
MMDB_entry_data_list_s *idx2 = entry_data_list = entry_data_list->next;
|
23
|
+
cmp_ok(idx2->entry_data.type, "==", MMDB_DATA_TYPE_UINT32,
|
24
|
+
"third array entry is a UINT32");
|
25
|
+
cmp_ok(idx2->entry_data.uint32, "==", 3, "third array entry value is 3");
|
26
|
+
|
27
|
+
return entry_data_list;
|
28
|
+
}
|
29
|
+
|
30
|
+
MMDB_entry_data_list_s *test_boolean_value(MMDB_entry_data_list_s
|
31
|
+
*entry_data_list)
|
32
|
+
{
|
33
|
+
MMDB_entry_data_list_s *value = entry_data_list = entry_data_list->next;
|
34
|
+
|
35
|
+
cmp_ok(value->entry_data.type, "==", MMDB_DATA_TYPE_BOOLEAN,
|
36
|
+
"'boolean' key's value is a boolean");
|
37
|
+
ok(value->entry_data.boolean, "'boolean' key's value is true");
|
38
|
+
|
39
|
+
return entry_data_list;
|
40
|
+
}
|
41
|
+
|
42
|
+
MMDB_entry_data_list_s *test_bytes_value(MMDB_entry_data_list_s
|
43
|
+
*entry_data_list)
|
44
|
+
{
|
45
|
+
MMDB_entry_data_list_s *value = entry_data_list = entry_data_list->next;
|
46
|
+
|
47
|
+
cmp_ok(value->entry_data.type, "==", MMDB_DATA_TYPE_BYTES,
|
48
|
+
"'bytes' key's value is bytes");
|
49
|
+
uint8_t *bytes = malloc(value->entry_data.data_size);
|
50
|
+
if (NULL == bytes) {
|
51
|
+
BAIL_OUT("malloc failed");
|
52
|
+
}
|
53
|
+
memcpy(bytes, value->entry_data.bytes, value->entry_data.data_size);
|
54
|
+
uint8_t expect[] = { 0x00, 0x00, 0x00, 0x2a };
|
55
|
+
|
56
|
+
ok(memcmp(bytes, expect, 4) == 0, "got expected value for bytes key");
|
57
|
+
|
58
|
+
free((void *)bytes);
|
59
|
+
|
60
|
+
return entry_data_list;
|
61
|
+
}
|
62
|
+
|
63
|
+
MMDB_entry_data_list_s *test_double_value(MMDB_entry_data_list_s
|
64
|
+
*entry_data_list)
|
65
|
+
{
|
66
|
+
MMDB_entry_data_list_s *value = entry_data_list = entry_data_list->next;
|
67
|
+
|
68
|
+
cmp_ok(value->entry_data.type, "==", MMDB_DATA_TYPE_DOUBLE,
|
69
|
+
"'double' key's value is a double");
|
70
|
+
|
71
|
+
compare_double(value->entry_data.double_value, 42.123456);
|
72
|
+
|
73
|
+
return entry_data_list;
|
74
|
+
}
|
75
|
+
|
76
|
+
MMDB_entry_data_list_s *test_float_value(MMDB_entry_data_list_s
|
77
|
+
*entry_data_list)
|
78
|
+
{
|
79
|
+
MMDB_entry_data_list_s *value = entry_data_list = entry_data_list->next;
|
80
|
+
|
81
|
+
cmp_ok(value->entry_data.type, "==", MMDB_DATA_TYPE_FLOAT,
|
82
|
+
"'float' key's value is a float");
|
83
|
+
|
84
|
+
compare_float(value->entry_data.float_value, 1.1F);
|
85
|
+
|
86
|
+
return entry_data_list;
|
87
|
+
}
|
88
|
+
|
89
|
+
MMDB_entry_data_list_s *test_int32_value(MMDB_entry_data_list_s
|
90
|
+
*entry_data_list)
|
91
|
+
{
|
92
|
+
MMDB_entry_data_list_s *value = entry_data_list = entry_data_list->next;
|
93
|
+
|
94
|
+
cmp_ok(value->entry_data.type, "==", MMDB_DATA_TYPE_INT32,
|
95
|
+
"'int32' key's value is an int32");
|
96
|
+
|
97
|
+
int32_t expect = 1 << 28;
|
98
|
+
expect *= -1;
|
99
|
+
cmp_ok(value->entry_data.int32, "==", expect,
|
100
|
+
"got expected value for int32 key");
|
101
|
+
|
102
|
+
return entry_data_list;
|
103
|
+
}
|
104
|
+
|
105
|
+
MMDB_entry_data_list_s *test_arrayX_value(MMDB_entry_data_list_s
|
106
|
+
*entry_data_list)
|
107
|
+
{
|
108
|
+
MMDB_entry_data_list_s *arrayX = entry_data_list = entry_data_list->next;
|
109
|
+
cmp_ok(arrayX->entry_data.type, "==", MMDB_DATA_TYPE_ARRAY,
|
110
|
+
"'map{mapX}{arrayX}' key's value is an array");
|
111
|
+
cmp_ok(arrayX->entry_data.data_size, "==", 3,
|
112
|
+
"'map{mapX}{arrayX}' key's value has 3 elements");
|
113
|
+
|
114
|
+
MMDB_entry_data_list_s *idx0 = entry_data_list = entry_data_list->next;
|
115
|
+
cmp_ok(idx0->entry_data.type, "==", MMDB_DATA_TYPE_UINT32,
|
116
|
+
"first array entry is a UINT32");
|
117
|
+
cmp_ok(idx0->entry_data.uint32, "==", 7, "first array entry value is 7");
|
118
|
+
|
119
|
+
MMDB_entry_data_list_s *idx1 = entry_data_list = entry_data_list->next;
|
120
|
+
cmp_ok(idx1->entry_data.type, "==", MMDB_DATA_TYPE_UINT32,
|
121
|
+
"second array entry is a UINT32");
|
122
|
+
cmp_ok(idx1->entry_data.uint32, "==", 8, "second array entry value is 8");
|
123
|
+
|
124
|
+
MMDB_entry_data_list_s *idx2 = entry_data_list = entry_data_list->next;
|
125
|
+
cmp_ok(idx2->entry_data.type, "==", MMDB_DATA_TYPE_UINT32,
|
126
|
+
"third array entry is a UINT32");
|
127
|
+
cmp_ok(idx2->entry_data.uint32, "==", 9, "third array entry value is 9");
|
128
|
+
|
129
|
+
return entry_data_list;
|
130
|
+
}
|
131
|
+
|
132
|
+
MMDB_entry_data_list_s *test_mapX_key_value_pair(MMDB_entry_data_list_s
|
133
|
+
*entry_data_list)
|
134
|
+
{
|
135
|
+
MMDB_entry_data_list_s *mapX_key = entry_data_list = entry_data_list->next;
|
136
|
+
cmp_ok(mapX_key->entry_data.type, "==", MMDB_DATA_TYPE_UTF8_STRING,
|
137
|
+
"found a map key in 'map{mapX}'");
|
138
|
+
const char *mapX_key_name = dup_entry_string_or_bail(mapX_key->entry_data);
|
139
|
+
|
140
|
+
if (strcmp(mapX_key_name, "utf8_stringX") == 0) {
|
141
|
+
MMDB_entry_data_list_s *mapX_value =
|
142
|
+
entry_data_list = entry_data_list->next;
|
143
|
+
cmp_ok(mapX_value->entry_data.type, "==", MMDB_DATA_TYPE_UTF8_STRING,
|
144
|
+
"'map{mapX}{utf8_stringX}' type is utf8_string");
|
145
|
+
const char *utf8_stringX_value = dup_entry_string_or_bail(
|
146
|
+
mapX_value->entry_data);
|
147
|
+
ok(strcmp(utf8_stringX_value, "hello") == 0,
|
148
|
+
"map{mapX}{utf8_stringX} value is 'hello'");
|
149
|
+
free((void *)utf8_stringX_value);
|
150
|
+
} else if (strcmp(mapX_key_name, "arrayX") == 0) {
|
151
|
+
entry_data_list = test_arrayX_value(entry_data_list);
|
152
|
+
} else {
|
153
|
+
ok(0, "unknown key found in map{mapX} - %s", mapX_key_name);
|
154
|
+
}
|
155
|
+
|
156
|
+
free((void *)mapX_key_name);
|
157
|
+
|
158
|
+
return entry_data_list;
|
159
|
+
}
|
160
|
+
|
161
|
+
MMDB_entry_data_list_s *test_map_value(MMDB_entry_data_list_s *entry_data_list)
|
162
|
+
{
|
163
|
+
MMDB_entry_data_list_s *map = entry_data_list = entry_data_list->next;
|
164
|
+
cmp_ok(map->entry_data.type, "==", MMDB_DATA_TYPE_MAP,
|
165
|
+
"'map' key's value is a map");
|
166
|
+
cmp_ok(map->entry_data.data_size, "==", 1,
|
167
|
+
"'map' key's value has 1 key/value pair");
|
168
|
+
|
169
|
+
MMDB_entry_data_list_s *map_key_1 = entry_data_list = entry_data_list->next;
|
170
|
+
cmp_ok(map_key_1->entry_data.type, "==", MMDB_DATA_TYPE_UTF8_STRING,
|
171
|
+
"found a map key in 'map'");
|
172
|
+
const char *map_key_1_name =
|
173
|
+
dup_entry_string_or_bail(map_key_1->entry_data);
|
174
|
+
ok(strcmp(map_key_1_name, "mapX") == 0, "key name is mapX");
|
175
|
+
free((void *)map_key_1_name);
|
176
|
+
|
177
|
+
MMDB_entry_data_list_s *mapX = entry_data_list = entry_data_list->next;
|
178
|
+
cmp_ok(mapX->entry_data.type, "==", MMDB_DATA_TYPE_MAP,
|
179
|
+
"'map{mapX}' key's value is a map");
|
180
|
+
cmp_ok(mapX->entry_data.data_size, "==", 2,
|
181
|
+
"'map' key's value has 2 key/value pairs");
|
182
|
+
|
183
|
+
entry_data_list = test_mapX_key_value_pair(entry_data_list);
|
184
|
+
entry_data_list = test_mapX_key_value_pair(entry_data_list);
|
185
|
+
|
186
|
+
return entry_data_list;
|
187
|
+
}
|
188
|
+
|
189
|
+
MMDB_entry_data_list_s *test_uint128_value(MMDB_entry_data_list_s
|
190
|
+
*entry_data_list)
|
191
|
+
{
|
192
|
+
MMDB_entry_data_list_s *value = entry_data_list = entry_data_list->next;
|
193
|
+
|
194
|
+
cmp_ok(value->entry_data.type, "==", MMDB_DATA_TYPE_UINT128,
|
195
|
+
"'uint128' key's value is an uint128");
|
196
|
+
|
197
|
+
#if MMDB_UINT128_IS_BYTE_ARRAY
|
198
|
+
uint8_t expect[16] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
199
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
200
|
+
ok(memcmp(value->entry_data.uint128, expect, 16) == 0,
|
201
|
+
"uint128 field is 2**120");
|
202
|
+
#else
|
203
|
+
mmdb_uint128_t expect = 1;
|
204
|
+
expect <<= 120;
|
205
|
+
cmp_ok(value->entry_data.uint128, "==", expect, "uint128 field is 2**120");
|
206
|
+
#endif
|
207
|
+
|
208
|
+
return entry_data_list;
|
209
|
+
}
|
210
|
+
|
211
|
+
MMDB_entry_data_list_s *test_uint16_value(MMDB_entry_data_list_s
|
212
|
+
*entry_data_list)
|
213
|
+
{
|
214
|
+
MMDB_entry_data_list_s *value = entry_data_list = entry_data_list->next;
|
215
|
+
|
216
|
+
cmp_ok(value->entry_data.type, "==", MMDB_DATA_TYPE_UINT16,
|
217
|
+
"'uint16' key's value is an uint16");
|
218
|
+
uint16_t expect = 100;
|
219
|
+
ok(value->entry_data.uint16 == expect, "uint16 field is 100");
|
220
|
+
|
221
|
+
return entry_data_list;
|
222
|
+
}
|
223
|
+
|
224
|
+
MMDB_entry_data_list_s *test_uint32_value(MMDB_entry_data_list_s
|
225
|
+
*entry_data_list)
|
226
|
+
{
|
227
|
+
MMDB_entry_data_list_s *value = entry_data_list = entry_data_list->next;
|
228
|
+
|
229
|
+
cmp_ok(value->entry_data.type, "==", MMDB_DATA_TYPE_UINT32,
|
230
|
+
"'uint32' key's value is an uint32");
|
231
|
+
uint32_t expect = 1 << 28;
|
232
|
+
cmp_ok(value->entry_data.uint32, "==", expect, "uint32 field is 100");
|
233
|
+
|
234
|
+
return entry_data_list;
|
235
|
+
}
|
236
|
+
|
237
|
+
MMDB_entry_data_list_s *test_uint64_value(MMDB_entry_data_list_s
|
238
|
+
*entry_data_list)
|
239
|
+
{
|
240
|
+
MMDB_entry_data_list_s *value = entry_data_list = entry_data_list->next;
|
241
|
+
|
242
|
+
cmp_ok(value->entry_data.type, "==", MMDB_DATA_TYPE_UINT64,
|
243
|
+
"'uint64' key's value is an uint64");
|
244
|
+
uint64_t expect = 1;
|
245
|
+
expect <<= 60;
|
246
|
+
cmp_ok(value->entry_data.uint64, "==", expect, "uint64 field is 2**60");
|
247
|
+
|
248
|
+
return entry_data_list;
|
249
|
+
}
|
250
|
+
|
251
|
+
MMDB_entry_data_list_s *test_utf8_string_value(MMDB_entry_data_list_s
|
252
|
+
*entry_data_list)
|
253
|
+
{
|
254
|
+
MMDB_entry_data_list_s *value = entry_data_list = entry_data_list->next;
|
255
|
+
|
256
|
+
cmp_ok(value->entry_data.type, "==", MMDB_DATA_TYPE_UTF8_STRING,
|
257
|
+
"'utf8_string' key's value is a string");
|
258
|
+
const char *utf8_string = dup_entry_string_or_bail(value->entry_data);
|
259
|
+
// This is hex for "unicode! ☯ - ♫" as bytes
|
260
|
+
char expect[19] =
|
261
|
+
{ 0x75, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x21, 0x20, 0xe2, 0x98,
|
262
|
+
0xaf, 0x20, 0x2d, 0x20, 0xe2, 0x99, 0xab, 0x00 };
|
263
|
+
|
264
|
+
is(utf8_string, expect, "got expected value for utf8_string key");
|
265
|
+
|
266
|
+
free((void *)utf8_string);
|
267
|
+
|
268
|
+
return entry_data_list;
|
269
|
+
}
|
270
|
+
|
271
|
+
void run_tests(int mode, const char *description)
|
272
|
+
{
|
273
|
+
const char *filename = "MaxMind-DB-test-decoder.mmdb";
|
274
|
+
const char *path = test_database_path(filename);
|
275
|
+
MMDB_s *mmdb = open_ok(path, mode, description);
|
276
|
+
free((void *)path);
|
277
|
+
|
278
|
+
char *ip = "1.1.1.1";
|
279
|
+
MMDB_lookup_result_s result =
|
280
|
+
lookup_string_ok(mmdb, ip, filename, description);
|
281
|
+
|
282
|
+
MMDB_entry_data_list_s *entry_data_list, *first;
|
283
|
+
int status = MMDB_get_entry_data_list(&result.entry, &entry_data_list);
|
284
|
+
|
285
|
+
if (MMDB_SUCCESS != status) {
|
286
|
+
BAIL_OUT("MMDB_get_entry_data_list failed with %s",
|
287
|
+
MMDB_strerror(status));
|
288
|
+
} else {
|
289
|
+
cmp_ok(status, "==", MMDB_SUCCESS,
|
290
|
+
"MMDB_get_entry_data_list succeeded");
|
291
|
+
}
|
292
|
+
|
293
|
+
first = entry_data_list;
|
294
|
+
|
295
|
+
cmp_ok(entry_data_list->entry_data.type, "==", MMDB_DATA_TYPE_MAP,
|
296
|
+
"first entry in entry data list is a map");
|
297
|
+
cmp_ok(entry_data_list->entry_data.data_size, "==", 12,
|
298
|
+
"first map in entry data list has 12 k/v pairs");
|
299
|
+
|
300
|
+
while (1) {
|
301
|
+
MMDB_entry_data_list_s *key = entry_data_list = entry_data_list->next;
|
302
|
+
|
303
|
+
if (!key) {
|
304
|
+
break;
|
305
|
+
}
|
306
|
+
|
307
|
+
cmp_ok(key->entry_data.type, "==", MMDB_DATA_TYPE_UTF8_STRING,
|
308
|
+
"found a map key");
|
309
|
+
|
310
|
+
const char *key_name = dup_entry_string_or_bail(key->entry_data);
|
311
|
+
if (strcmp(key_name, "array") == 0) {
|
312
|
+
entry_data_list = test_array_value(entry_data_list);
|
313
|
+
} else if (strcmp(key_name, "boolean") == 0) {
|
314
|
+
entry_data_list = test_boolean_value(entry_data_list);
|
315
|
+
} else if (strcmp(key_name, "bytes") == 0) {
|
316
|
+
entry_data_list = test_bytes_value(entry_data_list);
|
317
|
+
} else if (strcmp(key_name, "double") == 0) {
|
318
|
+
entry_data_list = test_double_value(entry_data_list);
|
319
|
+
} else if (strcmp(key_name, "float") == 0) {
|
320
|
+
entry_data_list = test_float_value(entry_data_list);
|
321
|
+
} else if (strcmp(key_name, "int32") == 0) {
|
322
|
+
entry_data_list = test_int32_value(entry_data_list);
|
323
|
+
} else if (strcmp(key_name, "map") == 0) {
|
324
|
+
entry_data_list = test_map_value(entry_data_list);
|
325
|
+
} else if (strcmp(key_name, "uint128") == 0) {
|
326
|
+
entry_data_list = test_uint128_value(entry_data_list);
|
327
|
+
} else if (strcmp(key_name, "uint16") == 0) {
|
328
|
+
entry_data_list = test_uint16_value(entry_data_list);
|
329
|
+
} else if (strcmp(key_name, "uint32") == 0) {
|
330
|
+
entry_data_list = test_uint32_value(entry_data_list);
|
331
|
+
} else if (strcmp(key_name, "uint64") == 0) {
|
332
|
+
entry_data_list = test_uint64_value(entry_data_list);
|
333
|
+
} else if (strcmp(key_name, "utf8_string") == 0) {
|
334
|
+
entry_data_list = test_utf8_string_value(entry_data_list);
|
335
|
+
} else {
|
336
|
+
ok(0, "unknown key found in map - %s", key_name);
|
337
|
+
}
|
338
|
+
|
339
|
+
free((void *)key_name);
|
340
|
+
}
|
341
|
+
|
342
|
+
MMDB_free_entry_data_list(first);
|
343
|
+
|
344
|
+
MMDB_close(mmdb);
|
345
|
+
free(mmdb);
|
346
|
+
}
|
347
|
+
|
348
|
+
int main(void)
|
349
|
+
{
|
350
|
+
plan(NO_PLAN);
|
351
|
+
for_all_modes(&run_tests);
|
352
|
+
done_testing();
|
353
|
+
}
|