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