[libvirt] [PATCH 10/10] tests: add some simple libxl XML->XML tests

Marek Marczykowski-Górecki marmarek at invisiblethingslab.com
Thu Feb 5 05:17:16 UTC 2015


Handle features supported only on xen: driver domains, qemu in
stubdomain.

Signed-off-by: Marek Marczykowski-Górecki <marmarek at invisiblethingslab.com>
---
 tests/Makefile.am                                  |   9 +-
 tests/domainschematest                             |   2 +-
 tests/xlxml2xmldata/xlxml2xml-hvm-stubdom.xml      |  41 +++++
 tests/xlxml2xmldata/xlxml2xml-hvm.xml              |  40 +++++
 tests/xlxml2xmldata/xlxml2xml-network-bridged.xml  |  38 +++++
 .../xlxml2xml-network-driver-domain.xml            |  38 +++++
 tests/xlxml2xmldata/xlxml2xml-network-routed.xml   |  39 +++++
 tests/xlxml2xmldata/xlxml2xml-pv.xml               |  38 +++++
 tests/xlxml2xmltest.c                              | 189 +++++++++++++++++++++
 9 files changed, 431 insertions(+), 3 deletions(-)
 create mode 100644 tests/xlxml2xmldata/xlxml2xml-hvm-stubdom.xml
 create mode 100644 tests/xlxml2xmldata/xlxml2xml-hvm.xml
 create mode 100644 tests/xlxml2xmldata/xlxml2xml-network-bridged.xml
 create mode 100644 tests/xlxml2xmldata/xlxml2xml-network-driver-domain.xml
 create mode 100644 tests/xlxml2xmldata/xlxml2xml-network-routed.xml
 create mode 100644 tests/xlxml2xmldata/xlxml2xml-pv.xml
 create mode 100644 tests/xlxml2xmltest.c

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 938270c..48648b9 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -85,6 +85,7 @@ EXTRA_DIST =		\
 	domainsnapshotxml2xmlout \
 	fchostdata \
 	interfaceschemadata \
+	xlxml2xmldata \
 	lxcconf2xmldata \
 	lxcxml2xmldata \
 	lxcxml2xmloutdata \
@@ -230,7 +231,7 @@ test_programs += xml2sexprtest sexpr2xmltest \
 endif WITH_XEN
 
 if WITH_LIBXL
-test_programs += xlconfigtest
+test_programs += xlconfigtest xlxml2xmltest
 endif WITH_LIBXL
 
 if WITH_QEMU
@@ -515,8 +516,12 @@ xlconfigtest_SOURCES = \
 	xlconfigtest.c testutilsxen.c testutilsxen.h \
 	testutils.c testutils.h
 xlconfigtest_LDADD =$(libxl_LDADDS)
+xlxml2xmltest_SOURCES = \
+	xlxml2xmltest.c testutilsxen.c testutilsxen.h \
+	testutils.c testutils.h
+xlxml2xmltest_LDADD =$(libxl_LDADDS)
 else ! WITH_LIBXL
-EXTRA_DIST += xlconfigtest.c
+EXTRA_DIST += xlconfigtest.c xlxml2xmltest.c
 endif ! WITH_LIBXL
 
 QEMUMONITORTESTUTILS_SOURCES = \
diff --git a/tests/domainschematest b/tests/domainschematest
index ba90180..18b442b 100755
--- a/tests/domainschematest
+++ b/tests/domainschematest
@@ -8,7 +8,7 @@ DIRS=""
 DIRS="$DIRS domainschemadata qemuxml2argvdata sexpr2xmldata"
 DIRS="$DIRS xmconfigdata xml2sexprdata qemuxml2xmloutdata"
 DIRS="$DIRS lxcxml2xmldata lxcxml2xmloutdata"
-DIRS="$DIRS bhyvexml2argvdata"
+DIRS="$DIRS bhyvexml2argvdata xlxml2xmldata"
 SCHEMA="domain.rng"
 
 check_schema "$DIRS" "$SCHEMA"
diff --git a/tests/xlxml2xmldata/xlxml2xml-hvm-stubdom.xml b/tests/xlxml2xmldata/xlxml2xml-hvm-stubdom.xml
new file mode 100644
index 0000000..ed6440c
--- /dev/null
+++ b/tests/xlxml2xmldata/xlxml2xml-hvm-stubdom.xml
@@ -0,0 +1,41 @@
+<domain type='xen'>
+  <name>testhvm</name>
+  <uuid>a3d3fa04-dc23-4136-9eab-b579d2930817</uuid>
+  <memory unit='KiB'>524288</memory>
+  <currentMemory unit='KiB'>524288</currentMemory>
+  <vcpu placement='static'>2</vcpu>
+  <os>
+    <type arch='x86_64' machine='xenfv'>hvm</type>
+    <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader>
+    <boot dev='cdrom'/>
+    <boot dev='hd'/>
+  </os>
+  <features>
+    <acpi/>
+    <apic/>
+    <pae/>
+    <viridian/>
+  </features>
+  <clock offset='variable' adjustment='0' basis='localtime'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>destroy</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator type='stubdom'>/usr/lib/xen/bin/qemu-dm</emulator>
+    <disk type='file' device='disk'>
+      <driver name='file'/>
+      <source file='/var/lib/libvirt/images/testhvm/root.img'/>
+      <target dev='xvda' bus='xen'/>
+    </disk>
+    <disk type='file' device='disk'>
+      <driver name='file'/>
+      <source file='/var/lib/libvirt/images/testhvm/private.img'/>
+      <target dev='xvdb' bus='xen'/>
+    </disk>
+    <interface type='network'>
+      <mac address='00:16:3e:5e:6c:09'/>
+      <source network='default'/>
+    </interface>
+    <input type='tablet' bus='usb'/>
+  </devices>
+</domain>
diff --git a/tests/xlxml2xmldata/xlxml2xml-hvm.xml b/tests/xlxml2xmldata/xlxml2xml-hvm.xml
new file mode 100644
index 0000000..95d9b84
--- /dev/null
+++ b/tests/xlxml2xmldata/xlxml2xml-hvm.xml
@@ -0,0 +1,40 @@
+<domain type='xen'>
+  <name>testhvm</name>
+  <uuid>a3d3fa04-dc23-4136-9eab-b579d2930817</uuid>
+  <memory unit='KiB'>524288</memory>
+  <currentMemory unit='KiB'>524288</currentMemory>
+  <vcpu placement='static'>2</vcpu>
+  <os>
+    <type arch='x86_64' machine='xenfv'>hvm</type>
+    <loader type='rom'>/usr/lib/xen/boot/hvmloader</loader>
+    <boot dev='cdrom'/>
+    <boot dev='hd'/>
+  </os>
+  <features>
+    <acpi/>
+    <apic/>
+    <pae/>
+    <viridian/>
+  </features>
+  <clock offset='variable' adjustment='0' basis='localtime'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>destroy</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <disk type='file' device='disk'>
+      <driver name='file'/>
+      <source file='/var/lib/libvirt/images/testhvm/root.img'/>
+      <target dev='xvda' bus='xen'/>
+    </disk>
+    <disk type='file' device='disk'>
+      <driver name='file'/>
+      <source file='/var/lib/libvirt/images/testhvm/private.img'/>
+      <target dev='xvdb' bus='xen'/>
+    </disk>
+    <interface type='network'>
+      <mac address='00:16:3e:5e:6c:09'/>
+      <source network='default'/>
+    </interface>
+    <input type='tablet' bus='usb'/>
+  </devices>
+</domain>
diff --git a/tests/xlxml2xmldata/xlxml2xml-network-bridged.xml b/tests/xlxml2xmldata/xlxml2xml-network-bridged.xml
new file mode 100644
index 0000000..a6b8f59
--- /dev/null
+++ b/tests/xlxml2xmldata/xlxml2xml-network-bridged.xml
@@ -0,0 +1,38 @@
+<domain type='xen'>
+  <name>testvm</name>
+  <uuid>900e3685-4998-41ad-a2c9-e496a5ed40a4</uuid>
+  <memory unit='KiB'>4096000</memory>
+  <currentMemory unit='KiB'>409600</currentMemory>
+  <vcpu placement='static'>2</vcpu>
+  <os>
+    <type arch='x86_64' machine='xenpv'>linux</type>
+    <kernel>/boot/vmlinuz-3.12.37-1</kernel>
+    <initrd>/boot/initramfs-3.12.37-1.img</initrd>
+    <cmdline>root=/dev/xvda ro nomodeset console=hvc0 rd_NO_PLYMOUTH 3</cmdline>
+  </os>
+  <clock offset='utc' adjustment='reset'>
+    <timer name='tsc' mode='native'/>
+  </clock>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>destroy</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <disk type='file' device='disk'>
+      <driver name='file'/>
+      <source file='/var/lib/libvirt/images/testvm/root.img'/>
+      <target dev='xvda' bus='xen'/>
+    </disk>
+    <disk type='block' device='disk'>
+      <driver name='file'/>
+      <source dev='/var/lib/libvirt/images/testvm/home.img'/>
+      <target dev='xvdb' bus='xen'/>
+    </disk>
+    <interface type='bridge'>
+      <mac address='00:16:3e:5e:6c:09'/>
+      <source bridge='xenbr0'/>
+    </interface>
+    <console type='pty'>
+      <target type='xen' port='0'/>
+    </console>
+  </devices>
+</domain>
diff --git a/tests/xlxml2xmldata/xlxml2xml-network-driver-domain.xml b/tests/xlxml2xmldata/xlxml2xml-network-driver-domain.xml
new file mode 100644
index 0000000..31c0437
--- /dev/null
+++ b/tests/xlxml2xmldata/xlxml2xml-network-driver-domain.xml
@@ -0,0 +1,38 @@
+<domain type='xen'>
+  <name>testvm</name>
+  <uuid>900e3685-4998-41ad-a2c9-e496a5ed40a4</uuid>
+  <memory unit='KiB'>4096000</memory>
+  <currentMemory unit='KiB'>409600</currentMemory>
+  <vcpu placement='static'>2</vcpu>
+  <os>
+    <type arch='x86_64' machine='xenpv'>linux</type>
+    <kernel>/boot/vmlinuz-3.12.37-1</kernel>
+    <initrd>/boot/initramfs-3.12.37-1.img</initrd>
+    <cmdline>root=/dev/xvda ro nomodeset console=hvc0 rd_NO_PLYMOUTH 3</cmdline>
+  </os>
+  <clock offset='utc' adjustment='reset'>
+    <timer name='tsc' mode='native'/>
+  </clock>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>destroy</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <disk type='file' device='disk'>
+      <driver name='file'/>
+      <source file='/var/lib/libvirt/images/testvm/root.img'/>
+      <target dev='xvda' bus='xen'/>
+    </disk>
+    <disk type='block' device='disk'>
+      <driver name='file'/>
+      <source dev='/var/lib/libvirt/images/testvm/home.img'/>
+      <target dev='xvdb' bus='xen'/>
+    </disk>
+    <interface type='bridge'>
+      <mac address='00:16:3e:5e:6c:09'/>
+      <source bridge='xenbr0' domain='netvm'/>
+    </interface>
+    <console type='pty'>
+      <target type='xen' port='0'/>
+    </console>
+  </devices>
+</domain>
diff --git a/tests/xlxml2xmldata/xlxml2xml-network-routed.xml b/tests/xlxml2xmldata/xlxml2xml-network-routed.xml
new file mode 100644
index 0000000..fac9d8d
--- /dev/null
+++ b/tests/xlxml2xmldata/xlxml2xml-network-routed.xml
@@ -0,0 +1,39 @@
+<domain type='xen'>
+  <name>testvm</name>
+  <uuid>900e3685-4998-41ad-a2c9-e496a5ed40a4</uuid>
+  <memory unit='KiB'>4096000</memory>
+  <currentMemory unit='KiB'>409600</currentMemory>
+  <vcpu placement='static'>2</vcpu>
+  <os>
+    <type arch='x86_64' machine='xenpv'>linux</type>
+    <kernel>/boot/vmlinuz-3.12.37-1</kernel>
+    <initrd>/boot/initramfs-3.12.37-1.img</initrd>
+    <cmdline>root=/dev/xvda ro nomodeset console=hvc0 rd_NO_PLYMOUTH 3</cmdline>
+  </os>
+  <clock offset='utc' adjustment='reset'>
+    <timer name='tsc' mode='native'/>
+  </clock>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>destroy</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <disk type='file' device='disk'>
+      <driver name='file'/>
+      <source file='/var/lib/libvirt/images/testvm/root.img'/>
+      <target dev='xvda' bus='xen'/>
+    </disk>
+    <disk type='block' device='disk'>
+      <driver name='file'/>
+      <source dev='/var/lib/libvirt/images/testvm/home.img'/>
+      <target dev='xvdb' bus='xen'/>
+    </disk>
+    <interface type='ethernet'>
+      <mac address='00:16:3e:5e:6c:09'/>
+      <ip address='192.168.0.1' family='ipv4'/>
+      <script path='vif-route'/>
+    </interface>
+    <console type='pty'>
+      <target type='xen' port='0'/>
+    </console>
+  </devices>
+</domain>
diff --git a/tests/xlxml2xmldata/xlxml2xml-pv.xml b/tests/xlxml2xmldata/xlxml2xml-pv.xml
new file mode 100644
index 0000000..b937b8b
--- /dev/null
+++ b/tests/xlxml2xmldata/xlxml2xml-pv.xml
@@ -0,0 +1,38 @@
+<domain type='xen'>
+  <name>testvm</name>
+  <uuid>900e3685-4998-41ad-a2c9-e496a5ed40a4</uuid>
+  <memory unit='KiB'>4096000</memory>
+  <currentMemory unit='KiB'>409600</currentMemory>
+  <vcpu placement='static'>2</vcpu>
+  <os>
+    <type arch='x86_64' machine='xenpv'>linux</type>
+    <kernel>/boot/vmlinuz-3.12.37-1</kernel>
+    <initrd>/boot/initramfs-3.12.37-1.img</initrd>
+    <cmdline>root=/dev/xvda ro nomodeset console=hvc0 rd_NO_PLYMOUTH 3</cmdline>
+  </os>
+  <clock offset='utc' adjustment='reset'>
+    <timer name='tsc' mode='native'/>
+  </clock>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>destroy</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <disk type='file' device='disk'>
+      <driver name='file'/>
+      <source file='/var/lib/libvirt/images/testvm/root.img'/>
+      <target dev='xvda' bus='xen'/>
+    </disk>
+    <disk type='block' device='disk'>
+      <driver name='file'/>
+      <source dev='/var/lib/libvirt/images/testvm/home.img'/>
+      <target dev='xvdb' bus='xen'/>
+    </disk>
+    <interface type='network'>
+      <mac address='00:16:3e:5e:6c:09'/>
+      <source network='default'/>
+    </interface>
+    <console type='pty'>
+      <target type='xen' port='0'/>
+    </console>
+  </devices>
+</domain>
diff --git a/tests/xlxml2xmltest.c b/tests/xlxml2xmltest.c
new file mode 100644
index 0000000..131e43b
--- /dev/null
+++ b/tests/xlxml2xmltest.c
@@ -0,0 +1,189 @@
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <sys/types.h>
+#include <fcntl.h>
+
+#include "testutils.h"
+
+#ifdef WITH_LIBXL
+
+# include "internal.h"
+# include "libxl/libxl_conf.h"
+# include "libxl/libxl_domain.h"
+# include "testutilsxen.h"
+# include "virstring.h"
+
+# define VIR_FROM_THIS VIR_FROM_NONE
+
+static virCapsPtr caps;
+static virDomainXMLOptionPtr xmlopt;
+
+static int
+testCompareXMLToXMLFiles(const char *inxml, const char *outxml, bool live)
+{
+    char *inXmlData = NULL;
+    char *outXmlData = NULL;
+    char *actual = NULL;
+    int ret = -1;
+    virDomainDefPtr def = NULL;
+    unsigned int parse_flags = live ? 0 : VIR_DOMAIN_DEF_PARSE_INACTIVE;
+    unsigned int format_flags = VIR_DOMAIN_DEF_FORMAT_SECURE;
+    if (!live)
+        format_flags |= VIR_DOMAIN_DEF_FORMAT_INACTIVE;
+
+    if (virtTestLoadFile(inxml, &inXmlData) < 0)
+        goto fail;
+    if (virtTestLoadFile(outxml, &outXmlData) < 0)
+        goto fail;
+
+    if (!(def = virDomainDefParseString(inXmlData, caps, xmlopt,
+                                        1 << VIR_DOMAIN_VIRT_XEN, parse_flags)))
+        goto fail;
+
+    if (!virDomainDefCheckABIStability(def, def)) {
+        fprintf(stderr, "ABI stability check failed on %s", inxml);
+        goto fail;
+    }
+
+    if (!(actual = virDomainDefFormat(def, format_flags)))
+        goto fail;
+
+    if (STRNEQ(outXmlData, actual)) {
+        virtTestDifferenceFull(stderr, outXmlData, outxml, actual, inxml);
+        goto fail;
+    }
+
+    ret = 0;
+ fail:
+    VIR_FREE(inXmlData);
+    VIR_FREE(outXmlData);
+    VIR_FREE(actual);
+    virDomainDefFree(def);
+    return ret;
+}
+
+enum {
+    WHEN_INACTIVE = 1,
+    WHEN_ACTIVE = 2,
+    WHEN_EITHER = 3,
+};
+
+struct testInfo {
+    const char *name;
+    bool different;
+    int when;
+};
+
+static int
+testCompareXMLToXMLHelper(const void *data)
+{
+    const struct testInfo *info = data;
+    char *xml_in = NULL;
+    char *xml_out = NULL;
+    char *xml_out_active = NULL;
+    char *xml_out_inactive = NULL;
+    int ret = -1;
+
+    if (virAsprintf(&xml_in, "%s/xlxml2xmldata/xlxml2xml-%s.xml",
+                    abs_srcdir, info->name) < 0 ||
+        virAsprintf(&xml_out, "%s/xlxml2xmldata/xlxml2xml-%s-out.xml",
+                    abs_srcdir, info->name) < 0 ||
+        virAsprintf(&xml_out_active,
+                    "%s/xlxml2xmldata/xlxml2xml-%s-active.xml",
+                    abs_srcdir, info->name) < 0 ||
+        virAsprintf(&xml_out_inactive,
+                    "%s/xlxml2xmldata/xlxml2xml-%s-inactive.xml",
+                    abs_srcdir, info->name) < 0)
+        goto cleanup;
+
+    if ((info->when & WHEN_INACTIVE)) {
+        char *out;
+        if (!info->different)
+            out = xml_in;
+        else if (virFileExists(xml_out_inactive))
+            out = xml_out_inactive;
+        else
+            out = xml_out;
+
+        if (testCompareXMLToXMLFiles(xml_in, out, false) < 0)
+            goto cleanup;
+    }
+
+    if ((info->when & WHEN_ACTIVE)) {
+        char *out;
+        if (!info->different)
+            out = xml_in;
+        else if (virFileExists(xml_out_active))
+            out = xml_out_active;
+        else
+            out = xml_out;
+
+        if (testCompareXMLToXMLFiles(xml_in, out, true) < 0)
+            goto cleanup;
+    }
+
+    ret = 0;
+
+ cleanup:
+    VIR_FREE(xml_in);
+    VIR_FREE(xml_out);
+    VIR_FREE(xml_out_active);
+    VIR_FREE(xml_out_inactive);
+    return ret;
+}
+
+
+static int
+mymain(void)
+{
+    int ret = 0;
+
+    if ((caps = testXLInitCaps()) == NULL)
+        return EXIT_FAILURE;
+
+    if (!(xmlopt = libxlCreateXMLConf()))
+        return EXIT_FAILURE;
+
+# define DO_TEST_FULL(name, is_different, when)                         \
+    do {                                                                \
+        const struct testInfo info = {name, is_different, when};        \
+        if (virtTestRun("LibXL XML-2-XML " name,                         \
+                        testCompareXMLToXMLHelper, &info) < 0)          \
+            ret = -1;                                                   \
+    } while (0)
+
+# define DO_TEST(name) \
+    DO_TEST_FULL(name, false, WHEN_EITHER)
+
+# define DO_TEST_DIFFERENT(name) \
+    DO_TEST_FULL(name, true, WHEN_EITHER)
+
+    DO_TEST("hvm");
+    DO_TEST("pv");
+    DO_TEST("hvm-stubdom");
+    DO_TEST("network-bridged");
+    DO_TEST("network-routed");
+    DO_TEST("network-driver-domain");
+
+    virObjectUnref(caps);
+    virObjectUnref(xmlopt);
+
+    return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
+VIRT_TEST_MAIN(mymain)
+
+#else
+
+int
+main(void)
+{
+    return EXIT_AM_SKIP;
+}
+
+#endif /* WITH_LIBXL */
-- 
1.8.3.1




More information about the libvir-list mailing list