On 07/11/2017 08:56 AM, Peter Krempa wrote: > Make sure that JSON strings can contain characters which need to be > escaped (double quotes, backslashes, tabs, etc.) and that JSON objects > formatted into strings can be nested into strings. > --- > tests/virjsontest.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 66 insertions(+) > Seems there should be two separate patches here, one that ensures escaped strings work for DO_TEST_PARSE and the other passing/using a nested string obj. Is "EscapeObj" even a right name, seems like "NestedObj" would be more appropriate. Is there some sort of escaping in the strings that I'm missing? Also, w/r/t escaping do we need handle double commas ",," that are supposed to turn into "," ? John > diff --git a/tests/virjsontest.c b/tests/virjsontest.c > index a6e158179..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; > } > > > @@ -490,6 +550,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"); > @@ -522,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) > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list