[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