#include #include "testutils.h" #ifdef WITH_VBOX # include # include # include # include "vbox/vbox_snapshot_conf.h" # define VIR_FROM_THIS VIR_FROM_NONE static const char *testSnapshotXMLVariableLineRegexStr = "lastStateChange=[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z"; regex_t *testSnapshotXMLVariableLineRegex = NULL; static char * testFilterXML(char *xml) { virBuffer buf = VIR_BUFFER_INITIALIZER; char **xmlLines = NULL; char **xmlLine; char *ret = NULL; if (!(xmlLines = virStringSplit(xml, "\n", 0))) { VIR_FREE(xml); goto cleanup; } VIR_FREE(xml); for (xmlLine = xmlLines; *xmlLine; xmlLine++) { if (regexec(testSnapshotXMLVariableLineRegex, *xmlLine, 0, NULL, 0) == 0) continue; virBufferStrcat(&buf, *xmlLine, "\n", NULL); } if (virBufferError(&buf)) { virReportOOMError(); goto cleanup; } ret = virBufferContentAndReset(&buf); cleanup: virBufferFreeAndReset(&buf); virStringFreeList(xmlLines); return ret; } static int testCompareXMLtoXMLFiles(const char *xml) { char *xmlData = NULL; char *actual = NULL; char *pathResult = NULL; int ret = -1; virVBoxSnapshotConfMachinePtr machine = NULL; if (virAsprintf(&pathResult, "%s/vboxsnapshotxmldata/testResult.vbox", abs_srcdir) < 0) return -1; if (virtTestLoadFile(xml, &xmlData) < 0) goto fail; if (!(machine = virVBoxSnapshotConfLoadVboxFile(xml, (char*)""))) goto fail; if (virVBoxSnapshotConfSaveVboxFile(machine, pathResult) < 0) goto fail; if (virtTestLoadFile(pathResult, &actual) < 0) goto fail; if (unlink(pathResult) < 0) goto fail; if (!(actual = testFilterXML(actual))) goto fail; if (!(xmlData = testFilterXML(xmlData))) goto fail; if (STRNEQ(actual, xmlData)) { virtTestDifference(stderr, xmlData, actual); goto fail; } ret = 0; fail: VIR_FREE(xmlData); VIR_FREE(actual); virVBoxSnapshotConfMachineFree(machine); VIR_FREE(pathResult); return ret; } static int testCompareXMLToXMLHelper(const void *data) { int result = -1; char *xml = NULL; if (virAsprintf(&xml, "%s/vboxsnapshotxmldata/%s.vbox", abs_srcdir, (const char*)data) < 0) return -1; result = testCompareXMLtoXMLFiles(xml); VIR_FREE(xml); return result; } static int mymain(void) { int ret = 0; if (VIR_ALLOC(testSnapshotXMLVariableLineRegex) < 0) goto cleanup; if (regcomp(testSnapshotXMLVariableLineRegex, testSnapshotXMLVariableLineRegexStr, REG_EXTENDED | REG_NOSUB) != 0) { ret = -1; virReportError(VIR_ERR_INTERNAL_ERROR, "%s", "failed to compile test regex"); goto cleanup; } # define DO_TEST(name) \ if (virtTestRun("VBox Snapshot XML-2-XML " name, \ testCompareXMLToXMLHelper, (name)) < 0) \ ret = -1 DO_TEST("2disks-nosnap"); DO_TEST("2disks-1snap"); DO_TEST("2disks-2snap"); DO_TEST("2disks-3snap"); DO_TEST("2disks-3snap-brother"); cleanup: if (testSnapshotXMLVariableLineRegex) regfree(testSnapshotXMLVariableLineRegex); VIR_FREE(testSnapshotXMLVariableLineRegex); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } VIRT_TEST_MAIN(mymain) #else int main(void) { return EXIT_AM_SKIP; } #endif /*WITH_VBOX*/