[libvirt] [PATCH v3 0/2] tests: json: Test nested json formatting and parsing

v3: - patch split into two according to review Peter Krempa (2): tests: virjson: Test parsing and formatting of strings with escaped chars tests: virjson: Test nesting of JSON string into a JSON (string) property tests/virjsontest.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) -- 2.13.2

Make sure that JSON strings can contain characters which need to be escaped (double quotes, backslashes, tabs, etc.). --- tests/virjsontest.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/virjsontest.c b/tests/virjsontest.c index a6e158179..d5a823431 100644 --- a/tests/virjsontest.c +++ b/tests/virjsontest.c @@ -490,6 +490,10 @@ mymain(void) DO_TEST_PARSE("integer", "1", NULL); DO_TEST_PARSE("boolean", "true", NULL); DO_TEST_PARSE("null", "null", NULL); + + DO_TEST_PARSE("escaping symbols", "[\"\\\"\\t\\n\\\\\"]", NULL); + DO_TEST_PARSE("escaped strings", "[\"{\\\"blurb\\\":\\\"test\\\"}\"]", NULL); + DO_TEST_PARSE_FAIL("incomplete keyword", "tr"); DO_TEST_PARSE_FAIL("overdone keyword", "[ truest ]"); DO_TEST_PARSE_FAIL("unknown keyword", "huh"); -- 2.13.2

Test that we are able to create a JSON object and nest it into a string property of a JSON object and then correctly extract and parse it back. --- tests/virjsontest.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/tests/virjsontest.c b/tests/virjsontest.c index d5a823431..30457d118 100644 --- a/tests/virjsontest.c +++ b/tests/virjsontest.c @@ -365,7 +365,67 @@ testJSONDeflatten(const void *data) VIR_FREE(actual); return ret; +} + + +static int +testJSONEscapeObj(const void *data ATTRIBUTE_UNUSED) +{ + virJSONValuePtr json = NULL; + virJSONValuePtr nestjson = NULL; + virJSONValuePtr parsejson = NULL; + char *neststr = NULL; + char *result = NULL; + const char *parsednestedstr; + int ret = -1; + + if (virJSONValueObjectCreate(&nestjson, + "s:stringkey", "stringvalue", + "i:numberkey", 1234, + "b:booleankey", false, NULL) < 0) { + VIR_TEST_VERBOSE("failed to create nested json object"); + goto cleanup; + } + + if (!(neststr = virJSONValueToString(nestjson, false))) { + VIR_TEST_VERBOSE("failed to format nested json object"); + goto cleanup; + } + + if (virJSONValueObjectCreate(&json, "s:test", neststr, NULL) < 0) { + VIR_TEST_VERBOSE("Failed to create json object"); + goto cleanup; + } + + if (!(result = virJSONValueToString(json, false))) { + VIR_TEST_VERBOSE("Failed to format json object"); + goto cleanup; + } + + if (!(parsejson = virJSONValueFromString(result))) { + VIR_TEST_VERBOSE("Failed to parse JSON with nested JSON in string"); + goto cleanup; + } + + if (!(parsednestedstr = virJSONValueObjectGetString(parsejson, "test"))) { + VIR_TEST_VERBOSE("Failed to retrieve string containing nested json"); + goto cleanup; + } + if (STRNEQ(parsednestedstr, neststr)) { + virTestDifference(stderr, neststr, parsednestedstr); + goto cleanup; + } + + ret = 0; + + cleanup: + VIR_FREE(neststr); + VIR_FREE(result); + virJSONValueFree(json); + virJSONValueFree(nestjson); + virJSONValueFree(parsejson); + return ret; } @@ -526,6 +586,8 @@ mymain(void) DO_TEST_FULL("lookup with correct type", Lookup, "{ \"a\": {}, \"b\": 1, \"c\": \"str\", \"d\": [] }", NULL, true); + DO_TEST_FULL("create object with nested json in attribute", EscapeObj, + NULL, NULL, true); #define DO_TEST_DEFLATTEN(name, pass) \ DO_TEST_FULL(name, Deflatten, name, NULL, pass) -- 2.13.2

On 07/19/2017 10:17 AM, Peter Krempa wrote:
v3: - patch split into two according to review
Peter Krempa (2): tests: virjson: Test parsing and formatting of strings with escaped chars tests: virjson: Test nesting of JSON string into a JSON (string) property
tests/virjsontest.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+)
Reviewed-by: John Ferlan <jferlan@redhat.com> series, John
participants (2)
-
John Ferlan
-
Peter Krempa