From: "Daniel P. Berrange" <berrange(a)redhat.com>
The libxl library allows a libxl_domain_config object to be
serialized to a JSON string. Use this to allow testing of
the XML -> libxl_domain_config conversion process
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
Signed-off-by: Jim Fehlig <jfehlig(a)suse.com>
---
configure.ac | 2 +
tests/Makefile.am | 25 +++-
tests/libxlxml2jsondata/basic-hvm.json | 217 ++++++++++++++++++++++++++++
tests/libxlxml2jsondata/basic-hvm.xml | 36 +++++
tests/libxlxml2jsondata/basic-pv.json | 163 +++++++++++++++++++++
tests/libxlxml2jsondata/basic-pv.xml | 28 ++++
tests/libxlxml2jsontest.c | 251 +++++++++++++++++++++++++++++++++
tests/virmocklibxl.c | 87 ++++++++++++
8 files changed, 808 insertions(+), 1 deletion(-)
diff --git a/configure.ac b/configure.ac
index b4fb99a..80c331f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -875,6 +875,8 @@ if test "$with_libxl" != "no" ; then
AC_CHECK_LIB([xenlight], [libxl_ctx_alloc], [
with_libxl=yes
LIBXL_LIBS="$LIBXL_LIBS -lxenlight -lxenctrl"
+ LIBS="$LIBS -lxenlight -lxenctrl"
+ AC_CHECK_FUNCS([libxl_domain_config_to_json])
],[
if test "$with_libxl" = "yes"; then
fail=1
diff --git a/tests/Makefile.am b/tests/Makefile.am
index d6c3cfb..a8e4e88 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -84,6 +84,7 @@ EXTRA_DIST = \
domainsnapshotxml2xmlout \
fchostdata \
interfaceschemadata \
+ libxlxml2jsondata \
lxcconf2xmldata \
lxcxml2xmldata \
lxcxml2xmloutdata \
@@ -222,6 +223,9 @@ if WITH_XEN
test_programs += xml2sexprtest sexpr2xmltest \
xmconfigtest xencapstest statstest reconnect
endif WITH_XEN
+if WITH_LIBXL
+test_programs += libxlxml2jsontest
+endif WITH_LIBXL
if WITH_QEMU
test_programs += qemuxml2argvtest qemuxml2xmltest qemuxmlnstest \
qemuargv2xmltest qemuhelptest domainsnapshotxml2xmltest \
@@ -393,7 +397,9 @@ test_libraries += libqemumonitortestutils.la \
qemuxml2argvmock.la \
$(NULL)
endif WITH_QEMU
-
+if WITH_LIBXL
+test_libraries += virmocklibxl.la
+endif WITH_LIBXL
if WITH_BHYVE
test_libraries += bhyvexml2argvmock.la
endif WITH_BHYVE
@@ -593,6 +599,23 @@ EXTRA_DIST += qemuxml2argvtest.c qemuxml2xmltest.c qemuargv2xmltest.c
\
$(QEMUMONITORTESTUTILS_SOURCES)
endif ! WITH_QEMU
+if WITH_LIBXL
+libxl_LDADDS = ../src/libvirt_driver_libxl_impl.la
+libxl_LDADDS += $(LDADDS)
+
+libxlxml2jsontest_SOURCES = \
+ libxlxml2jsontest.c testutilsxen.c testutilsxen.h \
+ testutils.c testutils.h
+libxlxml2jsontest_LDADD = $(libxl_LDADDS) $(LIBXML_LIBS)
+
+virmocklibxl_la_SOURCES = \
+ virmocklibxl.c
+virmocklibxl_la_CFLAGS = $(AM_CFLAGS)
+virmocklibxl_la_LDFLAGS = -module -avoid-version \
+ -rpath /evil/libtool/hack/to/force/shared/lib/creation
+
+endif WITH_LIBXL
+
if WITH_LXC
lxc_LDADDS = ../src/libvirt_driver_lxc_impl.la
diff --git a/tests/libxlxml2jsondata/basic-hvm.json
b/tests/libxlxml2jsondata/basic-hvm.json
new file mode 100644
index 0000000..b02e299
--- /dev/null
+++ b/tests/libxlxml2jsondata/basic-hvm.json
@@ -0,0 +1,217 @@
+{
+ "c_info": {
+ "type": "hvm",
+ "hap": "<default>",
+ "oos": "<default>",
+ "ssidref": 0,
+ "name": "sles-hvm",
+ "uuid": "2147d599-9cc6-c0dc-92ab-4064b5446e9b",
+ "xsdata": {
+
+ },
+ "platformdata": {
+
+ },
+ "poolid": 0,
+ "run_hotplug_scripts": "<default>",
+ "pvh": "<default>",
+ "driver_domain": "<default>"
+ },
+ "b_info": {
+ "max_vcpus": 4,
+ "avail_vcpus": [
+ 0,
+ 1,
+ 2,
+ 3
+ ],
+ "cpumap": [
+
+ ],
+ "nodemap": [
+
+ ],
+ "numa_placement": "<default>",
+ "tsc_mode": "default",
+ "max_memkb": 1048576,
+ "target_memkb": 1048576,
+ "video_memkb": -1,
+ "shadow_memkb": 12288,
+ "rtc_timeoffset": 0,
+ "exec_ssidref": 0,
+ "localtime": "<default>",
+ "disable_migrate": "<default>",
+ "cpuid": [
+
+ ],
+ "blkdev_start": null,
+ "device_model_version": "unknown",
+ "device_model_stubdomain": "<default>",
+ "device_model": null,
+ "device_model_ssidref": 0,
+ "extra": [
+
+ ],
+ "extra_pv": [
+
+ ],
+ "extra_hvm": [
+
+ ],
+ "sched_params": {
+ "sched": "unknown",
+ "weight": 1000,
+ "cap": -1,
+ "period": -1,
+ "slice": -1,
+ "latency": -1,
+ "extratime": -1
+ },
+ "ioports": [
+
+ ],
+ "irqs": [
+
+ ],
+ "iomem": [
+
+ ],
+ "claim_mode": "<default>",
+ "event_channels": 0,
+ "u": {
+ "firmware": null,
+ "kernel": null,
+ "cmdline": null,
+ "ramdisk": null,
+ "bios": "unknown",
+ "pae": "True",
+ "apic": "True",
+ "acpi": "True",
+ "acpi_s3": "<default>",
+ "acpi_s4": "<default>",
+ "nx": "<default>",
+ "viridian": "<default>",
+ "timeoffset": null,
+ "hpet": "<default>",
+ "vpt_align": "<default>",
+ "timer_mode": "unknown",
+ "nested_hvm": "<default>",
+ "smbios_firmware": null,
+ "acpi_firmware": null,
+ "nographic": "<default>",
+ "vga": {
+ "kind": "cirrus"
+ },
+ "vnc": {
+ "enable": "True",
+ "listen": "0.0.0.0",
+ "passwd": null,
+ "display": 0,
+ "findunused": "False"
+ },
+ "keymap": null,
+ "sdl": {
+ "enable": "<default>",
+ "opengl": "<default>",
+ "display": null,
+ "xauthority": null
+ },
+ "spice": {
+ "enable": "<default>",
+ "port": 0,
+ "tls_port": 0,
+ "host": null,
+ "disable_ticketing": "<default>",
+ "passwd": null,
+ "agent_mouse": "<default>",
+ "vdagent": "<default>",
+ "clipboard_sharing": "<default>",
+ "usbredirection": 0
+ },
+ "gfx_passthru": "<default>",
+ "serial": null,
+ "boot": "c",
+ "usb": "<default>",
+ "usbversion": 0,
+ "usbdevice": null,
+ "soundhw": null,
+ "xen_platform_pci": "<default>",
+ "usbdevice_list": [
+
+ ],
+ "vendor_device": "none",
+ "watchdog": null,
+ "watchdog_action": null
+ }
+ },
+ "disks": [
+ {
+ "backend_domid": 0,
+ "backend_domname": null,
+ "pdev_path": "/var/lib/xen/images/sles-hvm.img",
+ "vdev": "hda",
+ "backend": "qdisk",
+ "format": "raw",
+ "script": null,
+ "removable": 1,
+ "readwrite": 1,
+ "is_cdrom": 0
+ }
+ ],
+ "nics": [
+ {
+ "backend_domid": 0,
+ "backend_domname": null,
+ "devid": 0,
+ "mtu": 0,
+ "model": null,
+ "mac": "00:16:3e:66:12:b4",
+ "ip": null,
+ "bridge": "br0",
+ "ifname": null,
+ "script": "/etc/xen/scripts/vif-bridge",
+ "nictype": "vif_ioemu",
+ "rate_bytes_per_interval": 0,
+ "rate_interval_usecs": 0,
+ "gatewaydev": null
+ }
+ ],
+ "pcidevs": [
+
+ ],
+ "vfbs": [
+ {
+ "backend_domid": 0,
+ "backend_domname": null,
+ "devid": -1,
+ "vnc": {
+ "enable": "True",
+ "listen": "0.0.0.0",
+ "passwd": null,
+ "display": 0,
+ "findunused": "False"
+ },
+ "sdl": {
+ "enable": "<default>",
+ "opengl": "<default>",
+ "display": null,
+ "xauthority": null
+ },
+ "keymap": null
+ }
+ ],
+ "vkbs": [
+ {
+ "backend_domid": 0,
+ "backend_domname": null,
+ "devid": -1
+ }
+ ],
+ "vtpms": [
+
+ ],
+ "on_poweroff": "destroy",
+ "on_reboot": "restart",
+ "on_watchdog": "destroy",
+ "on_crash": "destroy"
+}
diff --git a/tests/libxlxml2jsondata/basic-hvm.xml
b/tests/libxlxml2jsondata/basic-hvm.xml
new file mode 100644
index 0000000..693a715
--- /dev/null
+++ b/tests/libxlxml2jsondata/basic-hvm.xml
@@ -0,0 +1,36 @@
+<domain type='xen'>
+ <name>sles-hvm</name>
+ <description>None</description>
+ <uuid>2147d599-9cc6-c0dc-92ab-4064b5446e9b</uuid>
+ <memory>1048576</memory>
+ <currentMemory>1048576</currentMemory>
+ <vcpu>4</vcpu>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <clock sync='utc'/>
+ <os>
+ <type>hvm</type>
+ <loader>/usr/lib/xen/boot/hvmloader</loader>
+ <boot dev='hd'/>
+ </os>
+ <features>
+ <apic/>
+ <acpi/>
+ <pae/>
+ </features>
+ <devices>
+ <emulator>/usr/lib/xen/bin/qemu-system-i386</emulator>
+ <disk type='file' device='disk'>
+ <driver name='qemu'/>
+ <source file='/var/lib/xen/images/sles-hvm.img'/>
+ <target dev='hda'/>
+ </disk>
+ <interface type='bridge'>
+ <source bridge='br0'/>
+ <mac address='00:16:3e:66:12:b4'/>
+ <script path='/etc/xen/scripts/vif-bridge'/>
+ </interface>
+ <graphics type='vnc' port='-1' autoport='yes'
listen='0.0.0.0'/>
+ </devices>
+</domain>
diff --git a/tests/libxlxml2jsondata/basic-pv.json
b/tests/libxlxml2jsondata/basic-pv.json
new file mode 100644
index 0000000..326b705
--- /dev/null
+++ b/tests/libxlxml2jsondata/basic-pv.json
@@ -0,0 +1,163 @@
+{
+ "c_info": {
+ "type": "pv",
+ "hap": "<default>",
+ "oos": "<default>",
+ "ssidref": 0,
+ "name": "sles11-pv",
+ "uuid": "039e9ee6-4a84-3055-4c81-8ba426ae2656",
+ "xsdata": {
+
+ },
+ "platformdata": {
+
+ },
+ "poolid": 0,
+ "run_hotplug_scripts": "<default>",
+ "pvh": "<default>",
+ "driver_domain": "<default>"
+ },
+ "b_info": {
+ "max_vcpus": 4,
+ "avail_vcpus": [
+ 0,
+ 1,
+ 2,
+ 3
+ ],
+ "cpumap": [
+
+ ],
+ "nodemap": [
+
+ ],
+ "numa_placement": "<default>",
+ "tsc_mode": "default",
+ "max_memkb": 524288,
+ "target_memkb": 524288,
+ "video_memkb": -1,
+ "shadow_memkb": -1,
+ "rtc_timeoffset": 0,
+ "exec_ssidref": 0,
+ "localtime": "<default>",
+ "disable_migrate": "<default>",
+ "cpuid": [
+
+ ],
+ "blkdev_start": null,
+ "device_model_version": "unknown",
+ "device_model_stubdomain": "<default>",
+ "device_model": null,
+ "device_model_ssidref": 0,
+ "extra": [
+
+ ],
+ "extra_pv": [
+
+ ],
+ "extra_hvm": [
+
+ ],
+ "sched_params": {
+ "sched": "unknown",
+ "weight": 1000,
+ "cap": -1,
+ "period": -1,
+ "slice": -1,
+ "latency": -1,
+ "extratime": -1
+ },
+ "ioports": [
+
+ ],
+ "irqs": [
+
+ ],
+ "iomem": [
+
+ ],
+ "claim_mode": "<default>",
+ "event_channels": 0,
+ "u": {
+ "kernel": null,
+ "slack_memkb": -1,
+ "bootloader": "pygrub",
+ "bootloader_args": [
+
+ ],
+ "cmdline": null,
+ "ramdisk": null,
+ "e820_host": "<default>"
+ }
+ },
+ "disks": [
+ {
+ "backend_domid": 0,
+ "backend_domname": null,
+ "pdev_path": "/var/lib/xen/images/sles11-pv.img",
+ "vdev": "xvda",
+ "backend": "qdisk",
+ "format": "raw",
+ "script": null,
+ "removable": 1,
+ "readwrite": 1,
+ "is_cdrom": 0
+ }
+ ],
+ "nics": [
+ {
+ "backend_domid": 0,
+ "backend_domname": null,
+ "devid": 0,
+ "mtu": 0,
+ "model": null,
+ "mac": "00:16:3e:3e:86:60",
+ "ip": null,
+ "bridge": "br0",
+ "ifname": null,
+ "script": "/etc/xen/scripts/vif-bridge",
+ "nictype": "vif",
+ "rate_bytes_per_interval": 0,
+ "rate_interval_usecs": 0,
+ "gatewaydev": null
+ }
+ ],
+ "pcidevs": [
+
+ ],
+ "vfbs": [
+ {
+ "backend_domid": 0,
+ "backend_domname": null,
+ "devid": -1,
+ "vnc": {
+ "enable": "True",
+ "listen": "0.0.0.0",
+ "passwd": null,
+ "display": 0,
+ "findunused": "False"
+ },
+ "sdl": {
+ "enable": "<default>",
+ "opengl": "<default>",
+ "display": null,
+ "xauthority": null
+ },
+ "keymap": null
+ }
+ ],
+ "vkbs": [
+ {
+ "backend_domid": 0,
+ "backend_domname": null,
+ "devid": -1
+ }
+ ],
+ "vtpms": [
+
+ ],
+ "on_poweroff": "destroy",
+ "on_reboot": "restart",
+ "on_watchdog": "destroy",
+ "on_crash": "destroy"
+}
diff --git a/tests/libxlxml2jsondata/basic-pv.xml b/tests/libxlxml2jsondata/basic-pv.xml
new file mode 100644
index 0000000..109e657
--- /dev/null
+++ b/tests/libxlxml2jsondata/basic-pv.xml
@@ -0,0 +1,28 @@
+<domain type='xen'>
+ <name>sles11-pv</name>
+ <uuid>039e9ee6-4a84-3055-4c81-8ba426ae2656</uuid>
+ <memory>524288</memory>
+ <currentMemory>524288</currentMemory>
+ <vcpu>4</vcpu>
+ <bootloader>pygrub</bootloader>
+ <os>
+ <type arch='i686' machine='xenpv'>linux</type>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <disk type='file' device='disk'>
+ <driver name='qemu'/>
+ <source file='/var/lib/xen/images/sles11-pv.img'/>
+ <target dev='xvda'/>
+ </disk>
+ <interface type='bridge'>
+ <source bridge='br0'/>
+ <mac address='00:16:3e:3e:86:60'/>
+ <script path='/etc/xen/scripts/vif-bridge'/>
+ </interface>
+ <graphics type='vnc' port='-1' autoport='yes'
listen='0.0.0.0'/>
+ </devices>
+</domain>
diff --git a/tests/libxlxml2jsontest.c b/tests/libxlxml2jsontest.c
new file mode 100644
index 0000000..6ae654a
--- /dev/null
+++ b/tests/libxlxml2jsontest.c
@@ -0,0 +1,251 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <
http://www.gnu.org/licenses/>.
+ *
+ * Author: Daniel P. Berrange <berrange(a)redhat.com>
+ */
+
+#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"
+
+#if defined(WITH_LIBXL) && defined(WITH_YAJL) &&
defined(HAVE_LIBXL_DOMAIN_CONFIG_TO_JSON)
+
+# include "internal.h"
+# include "viralloc.h"
+# include "libxl/libxl_conf.h"
+# include "datatypes.h"
+# include "virstring.h"
+# include "virmock.h"
+# include "virjson.h"
+# include "testutilsxen.h"
+
+# define VIR_FROM_THIS VIR_FROM_XEN
+
+static const char *abs_top_srcdir;
+static virCapsPtr xencaps;
+
+#if defined LIBXL_HAVE_BUILDINFO_HVM_VENDOR_DEVICE
+/*
+* Currently no paths ignored on Xen 4.4
+*/
+static const char **ignore_paths = NULL;
+#elif defined LIBXL_HAVE_DOMAIN_NODEAFFINITY
+/*
+* These paths must be ignored if running on Xen 4.3
+*/
+static const char *ignore_paths[] = {
+ "/c_info/pvh",
+ "/c_info/driver_domain",
+ "/b_info/device_model_version",
+ "/b_info/event_channels",
+ "/b_info/u/kernel",
+ "/b_info/u/cmdline",
+ "/b_info/u/ramdisk",
+ "/b_info/u/bios",
+ "/b_info/u/timer_mode",
+ "/b_info/u/vga/kind",
+ "/b_info/u/spice/vdagent",
+ "/b_info/u/spice/clipboard_sharing",
+ "/b_info/u/spice/usbredirection",
+ "/b_info/u/usbversion",
+ "/b_info/u/vendor_device",
+ "/on_watchdog",
+ NULL
+};
+#else
+/*
+ * These paths must be ignored if running on Xen 4.2
+ */
+static const char *ignore_paths[] = {
+ "/c_info/pvh",
+ "/c_info/driver_domain",
+ "/b_info/nodemap",
+ "/b_info/exec_ssidref",
+ "/b_info/iomem",
+ "/b_info/claim_mode",
+ "/b_info/device_model_version",
+ "/b_info/event_channels",
+ "/b_info/u/usbdevice_list",
+ "/b_info/u/kernel",
+ "/b_info/u/cmdline",
+ "/b_info/u/ramdisk",
+ "/b_info/u/bios",
+ "/b_info/u/timer_mode",
+ "/b_info/u/vga/kind",
+ "/b_info/u/spice/vdagent",
+ "/b_info/u/spice/clipboard_sharing",
+ "/b_info/u/spice/usbredirection",
+ "/b_info/u/usbversion",
+ "/b_info/u/vendor_device",
+ "/disks/backend_domname",
+ "/nics/backend_domname",
+ "/nics/gatewaydev",
+ "/vfbs/backend_domname",
+ "/vkbs/backend_domname",
+ "/vtpms",
+ "/on_watchdog",
+ NULL
+};
+#endif
+
+
+static int testCompareXMLToJSONFiles(const char *xml,
+ const char *cmdline)
+{
+ char *expectargv = NULL;
+ int ret = -1;
+ virDomainDefPtr vmdef = NULL;
+ virPortAllocatorPtr gports = NULL;
+ libxl_ctx *ctx = NULL;
+ libxl_domain_config config;
+ xentoollog_logger *log = NULL;
+ virDomainXMLOptionPtr xmlopt = NULL;
+ char *actualargv;
+
+ libxl_domain_config_init(&config);
+
+ if (!(log = (xentoollog_logger *)xtl_createlogger_stdiostream(stderr, XTL_DEBUG,
0)))
+ goto cleanup;
+
+ if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, log) < 0)
+ goto cleanup;
+
+ if (!(gports = virPortAllocatorNew("vnc", 5900, 6000,
+ VIR_PORT_ALLOCATOR_SKIP_BIND_CHECK)))
+ goto cleanup;
+
+ if (!(xmlopt = libxlCreateXMLConf()))
+ goto cleanup;
+
+ if (!(vmdef = virDomainDefParseFile(xml, xencaps, xmlopt,
+ 1 << VIR_DOMAIN_VIRT_XEN,
+ VIR_DOMAIN_XML_INACTIVE)))
+ goto cleanup;
+
+ if (libxlBuildDomainConfig(gports, vmdef, ctx, &config) < 0)
+ goto cleanup;
+
+ if (!(actualargv = libxl_domain_config_to_json(ctx, &config))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ "Failed to create JSON doc for xl config");
+ goto cleanup;
+ }
+
+ virtTestLoadFile(cmdline, &expectargv);
+
+ if (!virJSONStringCompare(expectargv, actualargv, ignore_paths,
+ VIR_JSON_COMPARE_IGNORE_EXPECTED_NULL))
+ goto cleanup;
+
+ ret = 0;
+
+ cleanup:
+ VIR_FREE(expectargv);
+ VIR_FREE(actualargv);
+ virDomainDefFree(vmdef);
+ virObjectUnref(gports);
+ virObjectUnref(xmlopt);
+ libxl_ctx_free(ctx);
+ libxl_domain_config_dispose(&config);
+ xtl_logger_destroy(log);
+ return ret;
+}
+
+
+struct testInfo {
+ const char *name;
+};
+
+static int
+testCompareXMLToJSONHelper(const void *data)
+{
+ int ret = -1;
+ const struct testInfo *info = data;
+ char *xml = NULL;
+ char *args = NULL;
+
+ if (virAsprintf(&xml, "%s/libxlxml2jsondata/%s.xml",
+ abs_srcdir, info->name) < 0 ||
+ virAsprintf(&args, "%s/libxlxml2jsondata/%s.json",
+ abs_srcdir, info->name) < 0)
+ goto cleanup;
+
+ ret = testCompareXMLToJSONFiles(xml, args);
+
+ cleanup:
+ VIR_FREE(xml);
+ VIR_FREE(args);
+ return ret;
+}
+
+
+static int
+mymain(void)
+{
+ int ret = 0;
+
+ abs_top_srcdir = getenv("abs_top_srcdir");
+ if (!abs_top_srcdir)
+ abs_top_srcdir = abs_srcdir "/..";
+
+ /* Set the timezone because we are mocking the time() function.
+ * If we don't do that, then localtime() may return unpredictable
+ * results. In order to detect things that just work by a blind
+ * chance, we need to set an virtual timezone that no libvirt
+ * developer resides in. */
+ if (setenv("TZ", "VIR00:30", 1) < 0) {
+ perror("setenv");
+ return EXIT_FAILURE;
+ }
+
+ if ((xencaps = testXenCapsInit()) == NULL)
+ return EXIT_FAILURE;
+
+# define DO_TEST(name) \
+ do { \
+ static struct testInfo info = { \
+ name, \
+ }; \
+ if (virtTestRun("LibXL XML-2-JSON " name, \
+ testCompareXMLToJSONHelper, &info) < 0) \
+ ret = -1; \
+ } while (0)
+
+ DO_TEST("basic-pv");
+ DO_TEST("basic-hvm");
+
+ return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
+VIRT_TEST_MAIN_PRELOAD(mymain, abs_builddir "/.libs/virmocklibxl.so")
+
+#else
+
+int main(void)
+{
+ return EXIT_AM_SKIP;
+}
+
+#endif /* WITH_XEN && WITH_YAJL && HAVE_LIBXL_DOMAIN_CONFIG_TO_JSON */
diff --git a/tests/virmocklibxl.c b/tests/virmocklibxl.c
new file mode 100644
index 0000000..bc4b53d
--- /dev/null
+++ b/tests/virmocklibxl.c
@@ -0,0 +1,87 @@
+/*
+ * virmocklibxl.c: mocking of xenstore/libxs for libxl
+ *
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <
http://www.gnu.org/licenses/>.
+ *
+ * Author: Daniel P. Berrange <berrange(a)redhat.com>
+ */
+
+#include <config.h>
+
+#if defined(WITH_LIBXL) && defined(WITH_YAJL)
+# include "virmock.h"
+# include <sys/stat.h>
+# include <unistd.h>
+# include <libxl.h>
+# include <xenstore.h>
+# include <xenctrl.h>
+
+VIR_MOCK_IMPL_RET_VOID(xs_daemon_open,
+ struct xs_handle *)
+{
+ VIR_MOCK_REAL_INIT(xs_daemon_open);
+ return (void*)0x1;
+}
+
+VIR_MOCK_IMPL_RET_ARGS(xc_interface_open,
+ xc_interface *,
+ xentoollog_logger *, logger,
+ xentoollog_logger *, dombuild_logger,
+ unsigned, open_flags)
+{
+ VIR_MOCK_REAL_INIT(xc_interface_open);
+ return (void*)0x1;
+}
+
+
+VIR_MOCK_STUB_RET_ARGS(xc_interface_close,
+ int, 0,
+ xc_interface *, handle)
+
+VIR_MOCK_STUB_VOID_ARGS(xs_daemon_close,
+ struct xs_handle *, handle)
+
+VIR_MOCK_IMPL_RET_ARGS(__xstat, int,
+ int, ver,
+ const char *, path,
+ struct stat *, sb)
+{
+ VIR_MOCK_REAL_INIT(__xstat);
+
+ if (strstr(path, "xenstored.pid")) {
+ memset(sb, 0, sizeof(*sb));
+ return 0;
+ }
+
+ return real___xstat(ver, path, sb);
+}
+
+VIR_MOCK_IMPL_RET_ARGS(stat, int,
+ const char *, path,
+ struct stat *, sb)
+{
+ VIR_MOCK_REAL_INIT(stat);
+
+ if (strstr(path, "xenstored.pid")) {
+ memset(sb, 0, sizeof(*sb));
+ return 0;
+ }
+
+ return real_stat(path, sb);
+}
+
+#endif /* WITH_LIBXL && WITH_YAJL */
--
1.8.4.5