• source navigation  • diff markup  • identifier search  • freetext search  • 

Sources/json-c/tests/test_json_pointer.c

  1 #ifdef NDEBUG
  2 #undef NDEBUG
  3 #endif
  4 #include <assert.h>
  5 #include <errno.h>
  6 #include <stdio.h>
  7 #include <string.h>
  8 
  9 #include "json.h"
 10 
 11 static void test_example_int(struct json_object *jo1, const char *json_pointer, int expected_int)
 12 {
 13         struct json_object *jo2 = NULL;
 14         assert(0 == json_pointer_get(jo1, json_pointer, NULL));
 15         assert(0 == json_pointer_get(jo1, json_pointer, &jo2));
 16         assert(json_object_is_type(jo2, json_type_int));
 17         assert(expected_int == json_object_get_int(jo2));
 18         printf("PASSED - GET -  %s == %d\n", json_pointer, expected_int);
 19 }
 20 
 21 static const char *input_json_str = "{ "
 22                                     "'foo': ['bar', 'baz'], "
 23                                     "'': 0, "
 24                                     "'a/b': 1, "
 25                                     "'c%d': 2, "
 26                                     "'e^f': 3, "
 27                                     "'g|h': 4, "
 28                                     "'i\\\\j': 5, "
 29                                     "'k\\\"l': 6, "
 30                                     "' ': 7, "
 31                                     "'m~n': 8 "
 32                                     "}";
 33 
 34 /* clang-format off */
 35 static const char *rec_input_json_str =
 36     "{"
 37             "'arr' : ["
 38                     "{"
 39                             "'obj': ["
 40                                     "{},{},"
 41                                         "{"
 42                                             "'obj1': 0,"
 43                                             "'obj2': \"1\""
 44                                     "}"
 45                             "]"
 46                     "}"
 47             "],"
 48             "'obj' : {"
 49                     "'obj': {"
 50                             "'obj': ["
 51                                     "{"
 52                                             "'obj1': 0,"
 53                                             "'obj2': \"1\""
 54                                     "}"
 55                             "]"
 56                     "}"
 57             "}"
 58     "}";
 59 /* clang-format on */
 60 
 61 /* Example from RFC */
 62 static void test_example_get(void)
 63 {
 64         int i;
 65         struct json_object *jo1, *jo2, *jo3;
 66         struct json_pointer_map_s_i
 67         {
 68                 const char *s;
 69                 int i;
 70         };
 71         /* Create a map to iterate over for the ints */
 72         /* clang-format off */
 73         struct json_pointer_map_s_i json_pointers[] = {
 74                 { "/", 0 },
 75                 { "/a~1b", 1 },
 76                 {"/c%d", 2 },
 77                 {"/e^f", 3 },
 78                 { "/g|h", 4 },
 79                 { "/i\\j", 5 },
 80                 { "/k\"l", 6 },
 81                 { "/ ", 7 },
 82                 { "/m~0n", 8 },
 83                 { NULL, 0}
 84         };
 85         /* clang-format on */
 86 
 87         jo1 = json_tokener_parse(input_json_str);
 88         assert(NULL != jo1);
 89         printf("PASSED - GET - LOADED TEST JSON\n");
 90         printf("%s\n", json_object_get_string(jo1));
 91 
 92         /* Test empty string returns entire object */
 93         jo2 = NULL;
 94         /* For each test, we're trying to see that NULL **value works (does no segfault) */
 95         assert(0 == json_pointer_get(jo1, "", NULL));
 96         assert(0 == json_pointer_get(jo1, "", &jo2));
 97         assert(json_object_equal(jo2, jo1));
 98         printf("PASSED - GET - ENTIRE OBJECT WORKED\n");
 99 
100         /* Test /foo == ['bar', 'baz']  */
101         jo3 = json_object_new_array();
102         json_object_array_add(jo3, json_object_new_string("bar"));
103         json_object_array_add(jo3, json_object_new_string("baz"));
104 
105         jo2 = NULL;
106         assert(0 == json_pointer_get(jo1, "/foo", NULL));
107         assert(0 == json_pointer_get(jo1, "/foo", &jo2));
108         assert(NULL != jo2);
109         assert(json_object_equal(jo2, jo3));
110         json_object_put(jo3);
111         printf("PASSED - GET - /foo == ['bar', 'baz']\n");
112 
113         /* Test /foo/0 == 'bar' */
114         jo2 = NULL;
115         assert(0 == json_pointer_get(jo1, "/foo/0", NULL));
116         assert(0 == json_pointer_get(jo1, "/foo/0", &jo2));
117         assert(NULL != jo2);
118         assert(0 == strcmp("bar", json_object_get_string(jo2)));
119         printf("PASSED - GET - /foo/0 == 'bar'\n");
120 
121         for (i = 0; json_pointers[i].s; i++)
122                 test_example_int(jo1, json_pointers[i].s, json_pointers[i].i);
123 
124         json_object_put(jo1);
125 }
126 
127 /* I'm not too happy with the RFC example to test the recusion of the json_pointer_get() function */
128 static void test_recursion_get(void)
129 {
130         struct json_object *jo2, *jo1 = json_tokener_parse(rec_input_json_str);
131 
132         jo2 = NULL;
133         assert(jo1 != NULL);
134         printf("%s\n", json_object_get_string(jo1));
135         assert(0 == json_pointer_get(jo1, "/arr/0/obj/2/obj1", &jo2));
136         assert(json_object_is_type(jo2, json_type_int));
137         assert(0 == json_object_get_int(jo2));
138 
139         assert(0 == json_pointer_get(jo1, "/arr/0/obj/2/obj2", &jo2));
140         assert(json_object_is_type(jo2, json_type_string));
141         assert(0 == strcmp("1", json_object_get_string(jo2)));
142 
143         assert(0 == json_pointer_getf(jo1, &jo2, "/%s/%d/%s/%d/%s", "arr", 0, "obj", 2, "obj2"));
144         assert(json_object_is_type(jo2, json_type_string));
145         assert(0 == strcmp("1", json_object_get_string(jo2)));
146 
147         assert(jo1 != NULL);
148         assert(0 == json_pointer_get(jo1, "/obj/obj/obj/0/obj1", &jo2));
149         assert(json_object_is_type(jo2, json_type_int));
150         assert(0 == json_object_get_int(jo2));
151 
152         assert(0 == json_pointer_get(jo1, "/obj/obj/obj/0/obj2", &jo2));
153         assert(json_object_is_type(jo2, json_type_string));
154         assert(0 == strcmp("1", json_object_get_string(jo2)));
155 
156         assert(0 == json_pointer_getf(jo1, &jo2, "%s", "\0"));
157 
158         printf("PASSED - GET - RECURSION TEST\n");
159 
160         json_object_put(jo1);
161 }
162 
163 static void test_wrong_inputs_get(void)
164 {
165         struct json_object *jo2, *jo1 = json_tokener_parse(input_json_str);
166 
167         assert(NULL != jo1);
168         printf("PASSED - GET - LOADED TEST JSON\n");
169         printf("%s\n", json_object_get_string(jo1));
170 
171         /* Test leading '/' missing */
172         jo2 = NULL;
173         errno = 0;
174         assert(0 != json_pointer_get(jo1, "foo/bar", NULL));
175         assert(0 != json_pointer_get(jo1, "foo/bar", &jo2));
176         assert(errno == EINVAL);
177         assert(jo2 == NULL);
178         printf("PASSED - GET - MISSING /\n");
179 
180         /* Test combinations of NULL params for input json & path */
181         errno = 0;
182         assert(0 != json_pointer_get(NULL, "foo/bar", NULL));
183         assert(errno == EINVAL);
184         errno = 0;
185         assert(0 != json_pointer_get(NULL, NULL, NULL));
186         assert(errno == EINVAL);
187         errno = 0;
188         assert(0 != json_pointer_getf(NULL, NULL, NULL));
189         assert(errno == EINVAL);
190         errno = 0;
191         assert(0 != json_pointer_get(jo1, NULL, NULL));
192         assert(errno == EINVAL);
193         errno = 0;
194         assert(0 != json_pointer_getf(jo1, NULL, NULL));
195         assert(errno == EINVAL);
196         printf("PASSED - GET - NULL INPUTS\n");
197 
198         /* Test invalid indexes for array */
199         errno = 0;
200         assert(0 != json_pointer_get(jo1, "/foo/a", NULL));
201         assert(errno == EINVAL);
202         errno = 0;
203         assert(0 != json_pointer_get(jo1, "/foo/01", NULL));
204         assert(errno == EINVAL);
205         errno = 0;
206         assert(0 != json_pointer_getf(jo1, NULL, "/%s/a", "foo"));
207         assert(errno == EINVAL);
208         errno = 0;
209         assert(0 != json_pointer_get(jo1, "/foo/-", NULL));
210         assert(errno == EINVAL);
211         errno = 0;
212         /* Test optimized array path */
213         assert(0 != json_pointer_get(jo1, "/foo/4", NULL));
214         assert(errno == ENOENT);
215         errno = 0;
216         /* Test non-optimized array path */
217         assert(0 != json_pointer_getf(jo1, NULL, "%s", "/foo/22"));
218         assert(errno == ENOENT);
219         errno = 0;
220         assert(0 != json_pointer_getf(jo1, NULL, "/%s/%d", "foo", 22));
221         assert(errno == ENOENT);
222         errno = 0;
223         assert(0 != json_pointer_get(jo1, "/foo/-1", NULL));
224         assert(errno == EINVAL);
225         errno = 0;
226         assert(0 != json_pointer_get(jo1, "/foo/10", NULL));
227         assert(errno == ENOENT);
228         printf("PASSED - GET - INVALID INDEXES\n");
229 
230         json_object_put(jo1);
231 }
232 
233 static void test_example_set(void)
234 {
235         struct json_object *jo2, *jo1 = json_tokener_parse(input_json_str);
236 
237         assert(jo1 != NULL);
238         printf("PASSED - SET - LOADED TEST JSON\n");
239         printf("%s\n", json_object_get_string(jo1));
240 
241         assert(0 == json_pointer_set(&jo1, "/foo/1", json_object_new_string("cod")));
242         assert(0 == strcmp("cod", json_object_get_string(json_object_array_get_idx(
243                                       json_object_object_get(jo1, "foo"), 1))));
244         printf("PASSED - SET - 'cod' in /foo/1\n");
245         assert(0 != json_pointer_set(&jo1, "/fud/gaw", (jo2 = json_tokener_parse("[1,2,3]"))));
246         assert(errno == ENOENT);
247         printf("PASSED - SET - non-existing /fud/gaw\n");
248         assert(0 == json_pointer_set(&jo1, "/fud", json_object_new_object()));
249         printf("PASSED - SET - /fud == {}\n");
250         assert(0 == json_pointer_set(&jo1, "/fud/gaw", jo2)); /* re-using jo2 from above */
251         printf("PASSED - SET - /fug/gaw == [1,2,3]\n");
252         assert(0 == json_pointer_set(&jo1, "/fud/gaw/0", json_object_new_int(0)));
253         assert(0 == json_pointer_setf(&jo1, json_object_new_int(0), "%s%s/%d", "/fud", "/gaw", 0));
254         printf("PASSED - SET - /fug/gaw == [0,2,3]\n");
255         assert(0 == json_pointer_set(&jo1, "/fud/gaw/-", json_object_new_int(4)));
256         printf("PASSED - SET - /fug/gaw == [0,2,3,4]\n");
257         assert(0 == json_pointer_set(&jo1, "/", json_object_new_int(9)));
258         printf("PASSED - SET - / == 9\n");
259 
260         jo2 = json_tokener_parse(
261             "{ 'foo': [ 'bar', 'cod' ], '': 9, 'a/b': 1, 'c%d': 2, 'e^f': 3, 'g|h': 4, 'i\\\\j': "
262             "5, 'k\\\"l': 6, ' ': 7, 'm~n': 8, 'fud': { 'gaw': [ 0, 2, 3, 4 ] } }");
263         assert(json_object_equal(jo2, jo1));
264         printf("PASSED - SET - Final JSON is: %s\n", json_object_get_string(jo1));
265         json_object_put(jo2);
266 
267         assert(0 == json_pointer_set(&jo1, "", json_object_new_int(10)));
268         assert(10 == json_object_get_int(jo1));
269         printf("%s\n", json_object_get_string(jo1));
270 
271         json_object_put(jo1);
272 }
273 
274 static void test_wrong_inputs_set(void)
275 {
276         struct json_object *jo2, *jo1 = json_tokener_parse(input_json_str);
277 
278         assert(jo1 != NULL);
279         printf("PASSED - SET - LOADED TEST JSON\n");
280         printf("%s\n", json_object_get_string(jo1));
281 
282         assert(0 != json_pointer_set(NULL, NULL, NULL));
283         assert(0 != json_pointer_setf(NULL, NULL, NULL));
284         assert(0 != json_pointer_set(&jo1, NULL, NULL));
285         assert(0 != json_pointer_setf(&jo1, NULL, NULL));
286         printf("PASSED - SET - failed with NULL params for input json & path\n");
287 
288         assert(0 != json_pointer_set(&jo1, "foo/bar", (jo2 = json_object_new_string("cod"))));
289         printf("PASSED - SET - failed 'cod' with path 'foo/bar'\n");
290         json_object_put(jo2);
291 
292         assert(0 !=
293                json_pointer_setf(&jo1, (jo2 = json_object_new_string("cod")), "%s", "foo/bar"));
294         printf("PASSED - SET - failed 'cod' with path 'foo/bar'\n");
295         json_object_put(jo2);
296 
297         assert(0 != json_pointer_set(&jo1, "", (jo2 = json_object_new_string("cod"))));
298         printf("PASSED - SET - failed with invalid array index'\n");
299         json_object_put(jo2);
300 
301         jo2 = json_object_new_string("whatever");
302         assert(0 != json_pointer_set(&jo1, "/fud/gaw", jo2));
303         assert(0 == json_pointer_set(&jo1, "/fud", json_object_new_object()));
304         assert(0 == json_pointer_set(&jo1, "/fud/gaw", jo2)); /* re-using jo2 from above */
305         // ownership of jo2 transferred into jo1
306 
307         jo2 = json_object_new_int(0);
308         assert(0 != json_pointer_set(&jo1, "/fud/gaw/0", jo2));
309         json_object_put(jo2);
310         jo2 = json_object_new_int(0);
311         assert(0 != json_pointer_set(&jo1, "/fud/gaw/", jo2));
312         json_object_put(jo2);
313         printf("PASSED - SET - failed to set index to non-array\n");
314 
315         assert(0 == json_pointer_setf(&jo1, json_object_new_string("cod"), "%s", "\0"));
316 
317         json_object_put(jo1);
318 }
319 
320 int main(int argc, char **argv)
321 {
322         test_example_get();
323         test_recursion_get();
324         test_wrong_inputs_get();
325         test_example_set();
326         test_wrong_inputs_set();
327         return 0;
328 }
329 

This page was automatically generated by LXR 0.3.1.  •  OpenWrt