]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemublocktest: XMLjsonXML: Test formatting/parsing of modern JSON
authorPeter Krempa <pkrempa@redhat.com>
Mon, 9 Mar 2020 14:39:04 +0000 (15:39 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 16 Mar 2020 14:51:44 +0000 (15:51 +0100)
The test was invoking the JSON formatter with the 'legacy' flag thus
formatting bunch of obsolete JSON blockdev definitions. We also should
test the modern ones. Add a boolean and re-run all the tests in both
cases.

Additionally for any modern invocation we should also validate that the
output conforms to the QAPI schema.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
tests/qemublocktest.c

index f803c9c6b30178445b2fba933fa28364f21b25d1..77484cc8e7c26c3f8ed0d2ae595f7a42409cd2db 100644 (file)
@@ -41,6 +41,9 @@ VIR_LOG_INIT("tests.storagetest");
 struct testBackingXMLjsonXMLdata {
     int type;
     const char *xml;
+    bool legacy;
+    virHashTablePtr schema;
+    virJSONValuePtr schemaroot;
 };
 
 static int
@@ -57,6 +60,7 @@ testBackingXMLjsonXML(const void *args)
     g_autofree char *actualxml = NULL;
     g_autoptr(virStorageSource) xmlsrc = NULL;
     g_autoptr(virStorageSource) jsonsrc = NULL;
+    g_auto(virBuffer) debug = VIR_BUFFER_INITIALIZER;
 
     if (!(xmlsrc = virStorageSourceNew()))
         return -1;
@@ -71,12 +75,27 @@ testBackingXMLjsonXML(const void *args)
         return -1;
     }
 
-    if (!(backendprops = qemuBlockStorageSourceGetBackendProps(xmlsrc, true, false,
+    if (!(backendprops = qemuBlockStorageSourceGetBackendProps(xmlsrc,
+                                                               data->legacy,
+                                                               false,
                                                                false))) {
         fprintf(stderr, "failed to format disk source json\n");
         return -1;
     }
 
+    if (!data->legacy) {
+        if (testQEMUSchemaValidate(backendprops, data->schemaroot,
+                                   data->schema, &debug) < 0) {
+            g_autofree char *debugmsg = virBufferContentAndReset(&debug);
+            g_autofree char *debugprops = virJSONValueToString(backendprops, true);
+
+            VIR_TEST_VERBOSE("json does not conform to QAPI schema");
+            VIR_TEST_DEBUG("json:\n%s\ndoes not match schema. Debug output:\n %s",
+                           debugprops, NULLSTR(debugmsg));
+            return -1;
+        }
+    }
+
     if (virJSONValueObjectCreate(&wrapper, "a:file", &backendprops, NULL) < 0)
         return -1;
 
@@ -911,6 +930,10 @@ mymain(void)
     do { \
         xmljsonxmldata.type = tpe; \
         xmljsonxmldata.xml = xmlstr; \
+        xmljsonxmldata.legacy = true; \
+        if (virTestRun(virTestCounterNext(), testBackingXMLjsonXML, \
+                       &xmljsonxmldata) < 0) \
+        xmljsonxmldata.legacy = false; \
         if (virTestRun(virTestCounterNext(), testBackingXMLjsonXML, \
                        &xmljsonxmldata) < 0) \
             ret = -1; \
@@ -919,6 +942,9 @@ mymain(void)
 #define TEST_JSON_FORMAT_NET(xmlstr) \
     TEST_JSON_FORMAT(VIR_STORAGE_TYPE_NETWORK, xmlstr)
 
+    xmljsonxmldata.schema = qmp_schema_x86_64;
+    xmljsonxmldata.schemaroot = qmp_schemaroot_x86_64_blockdev_add;
+
     TEST_JSON_FORMAT(VIR_STORAGE_TYPE_FILE, "<source file='/path/to/file'/>\n");
 
     /* type VIR_STORAGE_TYPE_BLOCK is not tested since it parses back to 'file' */