[libvirt] [PATCH v2 4/4] tests: virjson: Test string escaping
John Ferlan
jferlan at redhat.com
Wed Jul 19 13:08:16 UTC 2017
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)
>
More information about the libvir-list
mailing list