/* * Copyright (c) 2009-2014 Petri Lehtinen * * Jansson is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. */ #include #include #include "util.h" static int encode_null_callback(const char *buffer, size_t size, void *data) { (void)buffer; (void)size; (void)data; return 0; } static void encode_null() { if(json_dumps(NULL, JSON_ENCODE_ANY) != NULL) fail("json_dumps didn't fail for NULL"); if(json_dumpf(NULL, stderr, JSON_ENCODE_ANY) != -1) fail("json_dumpf didn't fail for NULL"); /* Don't test json_dump_file to avoid creating a file */ if(json_dump_callback(NULL, encode_null_callback, NULL, JSON_ENCODE_ANY) != -1) fail("json_dump_callback didn't fail for NULL"); } static void encode_twice() { /* Encode an empty object/array, add an item, encode again */ json_t *json; char *result; json = json_object(); result = json_dumps(json, 0); if(!result || strcmp(result, "{}")) fail("json_dumps failed"); free(result); json_object_set_new(json, "foo", json_integer(5)); result = json_dumps(json, 0); if(!result || strcmp(result, "{\"foo\": 5}")) fail("json_dumps failed"); free(result); json_decref(json); json = json_array(); result = json_dumps(json, 0); if(!result || strcmp(result, "[]")) fail("json_dumps failed"); free(result); json_array_append_new(json, json_integer(5)); result = json_dumps(json, 0); if(!result || strcmp(result, "[5]")) fail("json_dumps failed"); free(result); json_decref(json); } static void circular_references() { /* Construct a JSON object/array with a circular reference: object: {"a": {"b": {"c": }}} array: [[[]]] Encode it, remove the circular reference and encode again. */ json_t *json; char *result; json = json_object(); json_object_set_new(json, "a", json_object()); json_object_set_new(json_object_get(json, "a"), "b", json_object()); json_object_set(json_object_get(json_object_get(json, "a"), "b"), "c", json_object_get(json, "a")); if(json_dumps(json, 0)) fail("json_dumps encoded a circular reference!"); json_object_del(json_object_get(json_object_get(json, "a"), "b"), "c"); result = json_dumps(json, 0); if(!result || strcmp(result, "{\"a\": {\"b\": {}}}")) fail("json_dumps failed!"); free(result); json_decref(json); json = json_array(); json_array_append_new(json, json_array()); json_array_append_new(json_array_get(json, 0), json_array()); json_array_append(json_array_get(json_array_get(json, 0), 0), json_array_get(json, 0)); if(json_dumps(json, 0)) fail("json_dumps encoded a circular reference!"); json_array_remove(json_array_get(json_array_get(json, 0), 0), 0); result = json_dumps(json, 0); if(!result || strcmp(result, "[[[]]]")) fail("json_dumps failed!"); free(result); json_decref(json); } static void encode_other_than_array_or_object() { /* Encoding anything other than array or object should only * succeed if the JSON_ENCODE_ANY flag is used */ json_t *json; FILE *fp = NULL; char *result; json = json_string("foo"); if(json_dumps(json, 0) != NULL) fail("json_dumps encoded a string!"); if(json_dumpf(json, fp, 0) == 0) fail("json_dumpf encoded a string!"); result = json_dumps(json, JSON_ENCODE_ANY); if(!result || strcmp(result, "\"foo\"") != 0) fail("json_dumps failed to encode a string with JSON_ENCODE_ANY"); free(result); json_decref(json); json = json_integer(42); if(json_dumps(json, 0) != NULL) fail("json_dumps encoded an integer!"); if(json_dumpf(json, fp, 0) == 0) fail("json_dumpf encoded an integer!"); result = json_dumps(json, JSON_ENCODE_ANY); if(!result || strcmp(result, "42") != 0) fail("json_dumps failed to encode an integer with JSON_ENCODE_ANY"); free(result); json_decref(json); } static void escape_slashes() { /* Test dump escaping slashes */ json_t *json; char *result; json = json_object(); json_object_set_new(json, "url", json_string("https://github.com/akheron/jansson")); result = json_dumps(json, 0); if(!result || strcmp(result, "{\"url\": \"https://github.com/akheron/jansson\"}")) fail("json_dumps failed to not escape slashes"); free(result); result = json_dumps(json, JSON_ESCAPE_SLASH); if(!result || strcmp(result, "{\"url\": \"https:\\/\\/github.com\\/akheron\\/jansson\"}")) fail("json_dumps failed to escape slashes"); free(result); json_decref(json); } static void encode_nul_byte() { json_t *json; char *result; json = json_stringn("nul byte \0 in string", 20); result = json_dumps(json, JSON_ENCODE_ANY); if(!result || memcmp(result, "\"nul byte \\u0000 in string\"", 27)) fail("json_dumps failed to dump an embedded NUL byte"); free(result); json_decref(json); } static void run_tests() { encode_null(); encode_twice(); circular_references(); encode_other_than_array_or_object(); escape_slashes(); encode_nul_byte(); }