From 02f0f1ccc71ae53c1b6d8db4ce7270653663ea0c Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Tue, 24 Mar 2015 13:25:27 +0100 Subject: [PATCH] tests: qemuxml2xml: Test status XML formatting and parsing 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 0d4b165566..9324de065c 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 bceb2d75d6..608f61f0e3 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 893e181506..839702b874 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 e6d4e6f046..817e408337 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -106,6 +106,113 @@ testXML2XMLInactive(const void *opaque) } +static const char testStatusXMLPrefix[] = +"\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n"; + +static const char testStatusXMLSuffix[] = +"\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) { @@ -217,6 +324,10 @@ mymain(void) if (info.outActiveName) { \ 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); \ -- GitLab