diff --git a/CMakeLists.txt b/CMakeLists.txt index f13638c..648de04 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,6 +71,7 @@ endif () set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) +set(JANSSON_TEMP_DIR ${PROJECT_BINARY_DIR}/tmp) # Give the debug version a different postfix for windows, # so both the debug and release version can be built in the @@ -534,9 +535,12 @@ if (NOT JANSSON_WITHOUT_TESTS) if (JANSSON_TEST_WITH_VALGRIND) add_test(memcheck__${test} - ${MEMCHECK_COMMAND} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${test}) + ${MEMCHECK_COMMAND} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${test} + WORKING_DIRECTORY ${JANSSON_TEMP_DIR}) else() - add_test(${test} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${test}) + add_test(${test} + ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${test} + WORKING_DIRECTORY ${JANSSON_TEMP_DIR}) endif () endforeach () diff --git a/src/strbuffer.c b/src/strbuffer.c index b3ddd0e..5129205 100644 --- a/src/strbuffer.c +++ b/src/strbuffer.c @@ -60,11 +60,6 @@ char *strbuffer_steal_value(strbuffer_t *strbuff) return result; } -int strbuffer_append(strbuffer_t *strbuff, const char *string) -{ - return strbuffer_append_bytes(strbuff, string, strlen(string)); -} - int strbuffer_append_byte(strbuffer_t *strbuff, char byte) { return strbuffer_append_bytes(strbuff, &byte, 1); diff --git a/src/strbuffer.h b/src/strbuffer.h index fc11ec0..88b7e05 100644 --- a/src/strbuffer.h +++ b/src/strbuffer.h @@ -8,6 +8,8 @@ #ifndef STRBUFFER_H #define STRBUFFER_H +#include + typedef struct { char *value; size_t length; /* bytes used */ @@ -24,7 +26,6 @@ const char *strbuffer_value(const strbuffer_t *strbuff); /* Steal the value and close the strbuffer */ char *strbuffer_steal_value(strbuffer_t *strbuff); -int strbuffer_append(strbuffer_t *strbuff, const char *string); int strbuffer_append_byte(strbuffer_t *strbuff, char byte); int strbuffer_append_bytes(strbuffer_t *strbuff, const char *data, size_t size); diff --git a/test/suites/api/test_dump.c b/test/suites/api/test_dump.c index 8731752..ac4a883 100644 --- a/test/suites/api/test_dump.c +++ b/test/suites/api/test_dump.c @@ -194,6 +194,24 @@ static void encode_nul_byte() json_decref(json); } +static void dump_file() +{ + json_t *json; + int result; + + result = json_dump_file(NULL, "", 0); + if (result != -1) + fail("json_dump_file succeeded with invalid args"); + + json = json_object(); + result = json_dump_file(json, "json_dump_file.json", 0); + if (result != 0) + fail("json_dump_file failed"); + + json_decref(json); + remove("json_dump_file.json"); +} + static void run_tests() { encode_null(); @@ -202,4 +220,5 @@ static void run_tests() encode_other_than_array_or_object(); escape_slashes(); encode_nul_byte(); + dump_file(); } diff --git a/test/suites/api/test_load.c b/test/suites/api/test_load.c index 80d159f..8d1e9f4 100644 --- a/test/suites/api/test_load.c +++ b/test/suites/api/test_load.c @@ -34,6 +34,20 @@ static void file_not_found() fail("json_load_file returned an invalid error message"); } +static void very_long_file_name() { + json_t *json; + json_error_t error; + + json = json_load_file("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 0, &error); + if(json) + fail("json_load_file returned non-NULL for a nonexistent file"); + if(error.line != -1) + fail("json_load_file returned an invalid line number"); + + if (strncmp(error.source, "...aaa", 6) != 0) + fail("error source was set incorrectly"); +} + static void reject_duplicates() { json_error_t error; @@ -191,6 +205,7 @@ static void position() static void run_tests() { file_not_found(); + very_long_file_name(); reject_duplicates(); disable_eof_check(); decode_any(); diff --git a/test/suites/api/test_object.c b/test/suites/api/test_object.c index 5b30738..aff83f9 100644 --- a/test/suites/api/test_object.c +++ b/test/suites/api/test_object.c @@ -139,6 +139,32 @@ static void test_update() json_decref(object); } +static void test_set_many_keys() +{ + json_t *object, *value; + const char *keys = "abcdefghijklmnopqrstuvwxyz"; + char buf[2]; + size_t i; + + object = json_object(); + if (!object) + fail("unable to create object"); + + value = json_string("a"); + if (!value) + fail("unable to create string"); + + buf[1] = '\0'; + for (i = 0; i < strlen(keys); i++) { + buf[0] = keys[i]; + if (json_object_set(object, buf, value)) + fail("unable to set object key"); + } + + json_decref(object); + json_decref(value); +} + static void test_conditional_updates() { json_t *object, *other; @@ -374,6 +400,12 @@ static void test_misc() if(!json_object_set(object, NULL, string)) fail("able to set NULL key"); + if(json_object_del(object, "a")) + fail("unable to del the only key"); + + if(json_object_set(object, "a", string)) + fail("unable to set value"); + if(!json_object_set(object, "a", NULL)) fail("able to set NULL value"); @@ -518,6 +550,7 @@ static void run_tests() test_misc(); test_clear(); test_update(); + test_set_many_keys(); test_conditional_updates(); test_circular(); test_set_nocheck();