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