Re: [PATCH 4/4] test: qemuxml2xml: Test status XML formatting and parsing

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Mar 24, 2015 at 03:03:23PM +0100, Peter Krempa wrote:
Recently we've fixed a bug where the status XML could not be parsed as
the parser used absolute path XPath queries. This test enhancement tests
all XML files used in the qemu-xml-2-xml test as a part of a status XML
snippet to see whether they are parsed correctly. The status XML-2-XML is
currently tested in 223 cases with this patch.
---
src/conf/domain_conf.c   |   4 +-
src/conf/domain_conf.h   |   9 ++++
src/libvirt_private.syms |   2 +
tests/qemuxml2xmltest.c  | 107 +++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 120 insertions(+), 2 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index d633f93..d28b62a 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -15580,7 +15580,7 @@ virDomainDefParseNode(xmlDocPtr xml,
}


-static virDomainObjPtr
+virDomainObjPtr
virDomainObjParseNode(xmlDocPtr xml,
                      xmlNodePtr root,
                      virCapsPtr caps,
@@ -21252,7 +21252,7 @@ virDomainDefFormat(virDomainDefPtr def, unsigned int flags)
}


-static char *
+char *
virDomainObjFormat(virDomainXMLOptionPtr xmlopt,
                   virDomainObjPtr obj,
                   unsigned int flags)
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index bceb2d7..608f61f 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2565,6 +2565,12 @@ virDomainDefPtr virDomainDefParseNode(xmlDocPtr doc,
                                      virDomainXMLOptionPtr xmlopt,
                                      unsigned int expectedVirtTypes,
                                      unsigned int flags);
+virDomainObjPtr virDomainObjParseNode(xmlDocPtr xml,
+                                      xmlNodePtr root,
+                                      virCapsPtr caps,
+                                      virDomainXMLOptionPtr xmlopt,
+                                      unsigned int expectedVirtTypes,
+                                      unsigned int flags);
virDomainObjPtr virDomainObjParseFile(const char *filename,
                                      virCapsPtr caps,
                                      virDomainXMLOptionPtr xmlopt,
@@ -2580,6 +2586,9 @@ unsigned int virDomainDefFormatConvertXMLFlags(unsigned int flags);

char *virDomainDefFormat(virDomainDefPtr def,
                         unsigned int flags);
+char *virDomainObjFormat(virDomainXMLOptionPtr xmlopt,
+                         virDomainObjPtr obj,
+                         unsigned int flags);
int virDomainDefFormatInternal(virDomainDefPtr def,
                               unsigned int flags,
                               virBufferPtr buf);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 0beb44f..4ab8638 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -364,6 +364,7 @@ virDomainNostateReasonTypeFromString;
virDomainNostateReasonTypeToString;
virDomainObjAssignDef;
virDomainObjCopyPersistentDef;
+virDomainObjFormat;
virDomainObjGetMetadata;
virDomainObjGetPersistentDef;
virDomainObjGetState;
@@ -382,6 +383,7 @@ virDomainObjListNumOfDomains;
virDomainObjListRemove;
virDomainObjListRemoveLocked;
virDomainObjNew;
+virDomainObjParseNode;
virDomainObjSetDefTransient;
virDomainObjSetMetadata;
virDomainObjSetState;
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 627edca..b419231 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -106,6 +106,109 @@ testXML2XMLInactive(const void *opaque)
}


+static const char testStatusXMLPrefix[] =
+"<domstatus state='running' reason='booted' pid='3803518'>\n"
+"  <taint flag='high-privileges'/>\n"
+"  <monitor path='/var/lib/libvirt/qemu/test.monitor' json='1' type='unix'/>\n"
+"  <vcpus>\n"
+"    <vcpu pid='3803519'/>\n"
+"  </vcpus>\n"
+"  <qemuCaps>\n"
+"    <flag name='vnc-colon'/>\n"
+"    <flag name='no-reboot'/>\n"
+"    <flag name='drive'/>\n"
+"    <flag name='name'/>\n"
+"    <flag name='uuid'/>\n"
+"    <flag name='vnet-hdr'/>\n"
+"    <flag name='qxl.vgamem_mb'/>\n"
+"    <flag name='qxl-vga.vgamem_mb'/>\n"
+"    <flag name='pc-dimm'/>\n"
+"  </qemuCaps>\n"
+"  <devices>\n"
+"    <device alias='balloon0'/>\n"
+"    <device alias='video0'/>\n"
+"    <device alias='serial0'/>\n"
+"    <device alias='net0'/>\n"
+"    <device alias='usb'/>\n"
+"  </devices>\n";
+
+static const char testStatusXMLSuffix[] =
+"</domstatus>\n";
+
+
+static int
+testCompareStatusXMLToXMLFiles(const void *opaque)
+{
+    const struct testInfo *data = opaque;
+    virBuffer buf = VIR_BUFFER_INITIALIZER;
+    xmlDocPtr xml = NULL;
+    virDomainObjPtr obj = NULL;
+    char *expect = NULL;
+    char *actual = NULL;
+    char *source = NULL;
+    int ret = -1;
+    int keepBlanksDefault = xmlKeepBlanksDefault(0);
+
+    /* construct faked source status XML */
+    virBufferAdd(&buf, testStatusXMLPrefix, -1);
+    virBufferAdjustIndent(&buf, 2);
+    virBufferAddStr(&buf, data->inFile);
+    virBufferAdjustIndent(&buf, -2);
+    virBufferAdd(&buf, testStatusXMLSuffix, -1);
+
+    if (!(source = virBufferContentAndReset(&buf))) {
+        fprintf(stderr, "Failed to create the source XML");
+        goto cleanup;
+    }
+
+    /* construct the expect string */
+    virBufferAdd(&buf, testStatusXMLPrefix, -1);
+    virBufferAdjustIndent(&buf, 2);
+    virBufferAddStr(&buf, data->outActiveFile);
+    virBufferAdjustIndent(&buf, -2);
+    virBufferAdd(&buf, testStatusXMLSuffix, -1);
+
+    if (!(expect = virBufferContentAndReset(&buf))) {
+        fprintf(stderr, "Failed to create the expect XML");
+        goto cleanup;
+    }
+
+    /* parse the fake source status XML */
+    if (!(xml = virXMLParseString(source, "(domain_status_test_XML)")) ||
+        !(obj = virDomainObjParseNode(xml, xmlDocGetRootElement(xml),
+                                      driver.caps, driver.xmlopt,
+                                      QEMU_EXPECTED_VIRT_TYPES, 0))) {

Looking at how parsing of status XMLs work in QEMU, there are some
flags passed here.  Particularly:
 VIR_DOMAIN_DEF_PARSE_STATUS |
 VIR_DOMAIN_DEF_PARSE_ACTUAL_NET |
 VIR_DOMAIN_DEF_PARSE_PCI_ORIG_STATES |
 VIR_DOMAIN_DEF_PARSE_CLOCK_ADJUST

Some of these are not used at all anywhere in the code (CLOCK_ADJUST),
some will not affect the XML parsing of any XML we test
(PCI_ORIG_STATES | ACTUAL_NET).  And even with all of them (with
PARSE_STATUS as well) added to the flags, none of the tests fail.  I
suspect this is because we currently test no status XMLs in this
test.  But *if* we are going to, shouldn't the following diff be
squashed in?

diff --git i/tests/qemuxml2xmltest.c w/tests/qemuxml2xmltest.c
index b419231..1566c8a 100644
--- i/tests/qemuxml2xmltest.c
+++ w/tests/qemuxml2xmltest.c
@@ -177,7 +177,11 @@ testCompareStatusXMLToXMLFiles(const void *opaque)
    if (!(xml = virXMLParseString(source, "(domain_status_test_XML)")) ||
        !(obj = virDomainObjParseNode(xml, xmlDocGetRootElement(xml),
                                      driver.caps, driver.xmlopt,
-                                      QEMU_EXPECTED_VIRT_TYPES, 0))) {
+                                      QEMU_EXPECTED_VIRT_TYPES,
+                                      VIR_DOMAIN_DEF_PARSE_STATUS |
+                                      VIR_DOMAIN_DEF_PARSE_ACTUAL_NET |
+                                      VIR_DOMAIN_DEF_PARSE_PCI_ORIG_STATES |
+                                      VIR_DOMAIN_DEF_PARSE_CLOCK_ADJUST))) {
        fprintf(stderr, "Failed to parse domain status XML:\n%s", source);
        goto cleanup;
    }
--
@@ -218,6 +321,10 @@ mymain(void)
            if (virtTestRun("QEMU XML-2-XML-active " name,                     \
                            testXML2XMLActive, &info) < 0)                     \
                ret = -1;                                                      \
+                                                                               \
+            if (virtTestRun("QEMU status XML-2-XML " name,                     \

QEMU XML-2-XML-status would look like other cases.

Attachment: pgpbFYeMKaNgF.pgp
Description: PGP signature

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list

[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]