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 | 111 +++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 124 insertions(+), 2 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 0d4b165..9324de0 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 893e181..839702b 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 e6d4e6f..817e408 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -106,6 +106,113 @@ 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,
+ 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;
+ }
+
+ /* format it back */
+ if (!(actual = virDomainObjFormat(driver.xmlopt, obj,
+ VIR_DOMAIN_DEF_FORMAT_SECURE))) {
+ fprintf(stderr, "Failed to format domain status XML");
+ goto cleanup;
+ }
+
+ if (STRNEQ(actual, expect)) {
+ virtTestDifferenceFull(stderr,
+ expect, data->outActiveName,
+ actual, data->inName);
+ goto cleanup;
+ }
+
+ ret = 0;
+
+ cleanup:
+ xmlKeepBlanksDefault(keepBlanksDefault);
+ xmlFreeDoc(xml);
+ virObjectUnref(obj);
+ VIR_FREE(expect);
+ VIR_FREE(actual);
+ VIR_FREE(source);
+ return ret;
+}
+
+
static void
testInfoFree(struct testInfo *info)
{
@@ -218,6 +325,10 @@ mymain(void)
if (virtTestRun("QEMU XML-2-XML-active " name,
\
testXML2XMLActive, &info) < 0) \
ret = -1; \
+ \
+ if (virtTestRun("QEMU XML-2-XML-status " name,
\
+ testCompareStatusXMLToXMLFiles, &info) < 0) \
+ ret = -1; \
} \
testInfoFree(&info); \
} while (0)
--
2.2.2