[libvirt] [PATCH 4/4] test: qemuxml2xml: Test status XML formatting and parsing
Martin Kletzander
mkletzan at redhat.com
Wed Mar 25 09:30:58 UTC 2015
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.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150325/69f410a2/attachment-0001.sig>
More information about the libvir-list
mailing list