Format the parsed string back and compare it to the original (or
modified) string for back and forth comparison.
---
tests/virjsontest.c | 58 ++++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 44 insertions(+), 14 deletions(-)
diff --git a/tests/virjsontest.c b/tests/virjsontest.c
index 2a6b2f44e..451275a4c 100644
--- a/tests/virjsontest.c
+++ b/tests/virjsontest.c
@@ -21,6 +21,8 @@ testJSONFromString(const void *data)
{
const struct testInfo *info = data;
virJSONValuePtr json;
+ const char *expectstr = info->expect ? info->expect : info->doc;
+ char *formatted = NULL;
int ret = -1;
json = virJSONValueFromString(info->doc);
@@ -43,9 +45,20 @@ testJSONFromString(const void *data)
VIR_TEST_DEBUG("Parsed %s\n", info->doc);
+ if (!(formatted = virJSONValueToString(json, false))) {
+ VIR_TEST_VERBOSE("Failed to format json data\n");
+ goto cleanup;
+ }
+
+ if (STRNEQ(expectstr, formatted)) {
+ virTestDifference(stderr, expectstr, formatted);
+ goto cleanup;
+ }
+
ret = 0;
cleanup:
+ VIR_FREE(formatted);
virJSONValueFree(json);
return ret;
}
@@ -323,23 +336,39 @@ mymain(void)
ret = -1; \
} while (0)
-#define DO_TEST_PARSE(name, doc) \
- DO_TEST_FULL(name, FromString, doc, NULL, true)
+/**
+ * DO_TEST_PARSE:
+ * @name: test name
+ * @doc: source JSON string
+ * @expect: expected output JSON formatted from parsed @doc
+ *
+ * Parses @doc and formats it back. If @expect is NULL the result has to be
+ * identical to @doc.
+ */
+#define DO_TEST_PARSE(name, doc, expect) \
+ DO_TEST_FULL(name, FromString, doc, expect, true)
#define DO_TEST_PARSE_FAIL(name, doc) \
DO_TEST_FULL(name, FromString, doc, NULL, false)
- DO_TEST_PARSE("Simple", "{\"return\": {}, \"id\":
\"libvirt-1\"}");
+ DO_TEST_PARSE("Simple", "{\"return\": {}, \"id\":
\"libvirt-1\"}",
+
"{\"return\":{},\"id\":\"libvirt-1\"}");
DO_TEST_PARSE("NotSoSimple", "{\"QMP\":
{\"version\": {\"qemu\":"
"{\"micro\": 91, \"minor\": 13,
\"major\": 0},"
- "\"package\": \" (qemu-kvm-devel)\"},
\"capabilities\": []}}");
-
+ "\"package\": \" (qemu-kvm-devel)\"},
\"capabilities\": []}}",
+
"{\"QMP\":{\"version\":{\"qemu\":"
+
"{\"micro\":91,\"minor\":13,\"major\":0},"
+ "\"package\":\"
(qemu-kvm-devel)\"},\"capabilities\":[]}}");
DO_TEST_PARSE("Harder", "{\"return\":
[{\"filename\": "
"\"unix:/home/berrange/.libvirt/qemu/lib/tck.monitor,server\","
"\"label\": \"charmonitor\"},
{\"filename\": \"pty:/dev/pts/158\","
- "\"label\": \"charserial0\"}],
\"id\": \"libvirt-3\"}");
+ "\"label\": \"charserial0\"}],
\"id\": \"libvirt-3\"}",
+ "{\"return\":[{\"filename\":"
+
"\"unix:/home/berrange/.libvirt/qemu/lib/tck.monitor,server\","
+
"\"label\":\"charmonitor\"},{\"filename\":\"pty:/dev/pts/158\","
+
"\"label\":\"charserial0\"}],\"id\":\"libvirt-3\"}");
DO_TEST_PARSE("VeryHard",
"{\"return\":[{\"name\":\"quit\"},{\"name\":"
"\"eject\"},{\"name\":\"change\"},{\"name\":\"screendump\"},"
@@ -364,7 +393,7 @@ mymain(void)
"\"query-mice\"},{\"name\":\"query-vnc\"},{\"name\":"
"\"query-spice\"},{\"name\":\"query-name\"},{\"name\":"
"\"query-uuid\"},{\"name\":\"query-migrate\"},{\"name\":"
-
"\"query-balloon\"}],\"id\":\"libvirt-2\"}");
+
"\"query-balloon\"}],\"id\":\"libvirt-2\"}",
NULL);
DO_TEST_FULL("add and remove", AddRemove,
"{\"name\": \"sample\", \"value\":
true}",
@@ -400,21 +429,22 @@ mymain(void)
"\"query-balloon\"}], \"id\":
\"libvirt-2\"}", NULL, true);
- DO_TEST_PARSE("almost nothing", "[]");
+ DO_TEST_PARSE("almost nothing", "[]", NULL);
DO_TEST_PARSE_FAIL("nothing", "");
- DO_TEST_PARSE("number without garbage", "[ 234545 ]");
+ DO_TEST_PARSE("number without garbage", "[ 234545 ]",
"[234545]");
DO_TEST_PARSE_FAIL("number with garbage", "[ 2345b45 ]");
- DO_TEST_PARSE("float without garbage", "[ 0.0314159e+100 ]");
+ DO_TEST_PARSE("float without garbage", "[ 0.0314159e+100 ]",
"[0.0314159e+100]");
DO_TEST_PARSE_FAIL("float with garbage", "[ 0.0314159ee+100 ]");
- DO_TEST_PARSE("string", "[ \"The meaning of life\"
]");
+ DO_TEST_PARSE("string", "[ \"The meaning of life\" ]",
+ "[\"The meaning of life\"]");
DO_TEST_PARSE_FAIL("unterminated string", "[ \"The meaning of lif
]");
- DO_TEST_PARSE("integer", "1");
- DO_TEST_PARSE("boolean", "true");
- DO_TEST_PARSE("null", "null");
+ DO_TEST_PARSE("integer", "1", NULL);
+ DO_TEST_PARSE("boolean", "true", NULL);
+ DO_TEST_PARSE("null", "null", NULL);
DO_TEST_PARSE_FAIL("incomplete keyword", "tr");
DO_TEST_PARSE_FAIL("overdone keyword", "[ truest ]");
DO_TEST_PARSE_FAIL("unknown keyword", "huh");
--
2.12.2