[libvirt] [PATCH v3] libxl: Add a test suite for libxl_domain_config generator
Joao Martins
joao.m.martins at oracle.com
Thu Aug 3 12:29:45 UTC 2017
On Tue, Aug 01, 2017 at 03:17:51PM +0200, Marek Marczykowski-Górecki wrote:
> From: Jim Fehlig <jfehlig at suse.com>
>
> The libxl library allows a libxl_domain_config object to be serialized
> from/to a JSON string. Use this to allow testing of the XML to
> libxl_domain_config conversion process. Test XML is converted to
> libxl_domain_config, which is then serialized to json. A json template
> corresponding to the test XML is converted to a libxl_domain_config
> object using libxl_domain_config_from_json(), and then serialized
> back to json using libxl_domain_config_to_json(). The two json
> docs are then compared.
>
> Using libxl to convert the json template to a libxl_domain_config
> object and then back to json provides a simple way to account for
> any changes or additions to the json representation across Xen
> releases.
>
> Signed-off-by: Jim Fehlig <jfehlig at suse.com>
> [update to v3.5.0-rc1, improve error reporting, use /bin/true emulator]
> Signed-off-by: Marek Marczykowski-Górecki <marmarek at invisiblethingslab.com>
I've been looking at this series for the past days, and taking into
account the comments that Jim mentioned yesterday are ammended, and this
looks good to me:
Reviewed-by: Joao Martins <joao.m.martins at oracle.com>
It adds a really nice piece of testing infra for libxl_domain_configs.
Maybe in the future more tests could be added in (in addition to the
CPUID one that Marek has planned).
Joao
> ---
> m4/virt-driver-libxl.m4 | 6 +-
> tests/Makefile.am | 18 +-
> tests/libxlxml2domconfigdata/basic-hvm.json | 89 ++++++++-
> tests/libxlxml2domconfigdata/basic-hvm.xml | 36 +++-
> tests/libxlxml2domconfigdata/basic-pv.json | 65 ++++++-
> tests/libxlxml2domconfigdata/basic-pv.xml | 28 ++-
> tests/libxlxml2domconfigdata/moredevs-hvm.json | 111 ++++++++++-
> tests/libxlxml2domconfigdata/moredevs-hvm.xml | 63 ++++++-
> tests/libxlxml2domconfigtest.c | 205 ++++++++++++++++++-
> tests/virmocklibxl.c | 87 ++++++++-
> 10 files changed, 705 insertions(+), 3 deletions(-)
> create mode 100644 tests/libxlxml2domconfigdata/basic-hvm.json
> create mode 100644 tests/libxlxml2domconfigdata/basic-hvm.xml
> create mode 100644 tests/libxlxml2domconfigdata/basic-pv.json
> create mode 100644 tests/libxlxml2domconfigdata/basic-pv.xml
> create mode 100644 tests/libxlxml2domconfigdata/moredevs-hvm.json
> create mode 100644 tests/libxlxml2domconfigdata/moredevs-hvm.xml
> create mode 100644 tests/libxlxml2domconfigtest.c
> create mode 100644 tests/virmocklibxl.c
>
> diff --git a/m4/virt-driver-libxl.m4 b/m4/virt-driver-libxl.m4
> index 96a9d47..3d635f0 100644
> --- a/m4/virt-driver-libxl.m4
> +++ b/m4/virt-driver-libxl.m4
> @@ -35,7 +35,7 @@ AC_DEFUN([LIBVIRT_DRIVER_CHECK_LIBXL], [
> if test "x$with_libxl" = "xyes" ; then
> LIBXL_FIRMWARE_DIR=$($PKG_CONFIG --variable xenfirmwaredir xenlight)
> LIBXL_EXECBIN_DIR=$($PKG_CONFIG --variable libexec_bin xenlight)
> - fi
> + fi
>
> dnl pkgconfig file not found, fallback to lib probe
> if test "x$with_libxl" = "xno" ; then
> @@ -80,6 +80,10 @@ AC_DEFUN([LIBVIRT_DRIVER_CHECK_LIBXL], [
> LIBXL_LIBS="$LIBXL_LIBS -lxenctrl"
> ])
>
> + dnl Check if libxl_domain_config_from_json is available for domXML to
> + dnl libxl_domain_config tests
> + LIBS="$LIBS -lxenlight -lxenctrl"
> + AC_CHECK_FUNCS([libxl_domain_config_from_json])
> CFLAGS="$old_CFLAGS"
> LIBS="$old_LIBS"
> fi
> diff --git a/tests/Makefile.am b/tests/Makefile.am
> index 3e3d580..49b9d40 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -99,6 +99,7 @@ EXTRA_DIST = \
> genericxml2xmlindata \
> genericxml2xmloutdata \
> interfaceschemadata \
> + libxlxml2domconfigdata \
> lxcconf2xmldata \
> lxcxml2xmldata \
> lxcxml2xmloutdata \
> @@ -271,7 +272,8 @@ test_programs += xml2sexprtest sexpr2xmltest \
> endif WITH_XEN
>
> if WITH_LIBXL
> -test_programs += xlconfigtest
> +test_programs += xlconfigtest libxlxml2domconfigtest
> +test_libraries += virmocklibxl.la
> endif WITH_LIBXL
>
> if WITH_QEMU
> @@ -528,8 +530,20 @@ xlconfigtest_SOURCES = \
> xlconfigtest.c testutilsxen.c testutilsxen.h \
> testutils.c testutils.h
> xlconfigtest_LDADD =$(libxl_LDADDS)
> +
> +libxlxml2domconfigtest_SOURCES = \
> + libxlxml2domconfigtest.c testutilsxen.c testutilsxen.h \
> + testutils.c testutils.h
> +libxlxml2domconfigtest_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
> +
> else ! WITH_LIBXL
> -EXTRA_DIST += xlconfigtest.c
> +EXTRA_DIST += xlconfigtest.c libxlxml2domconfigtest.c
> endif ! WITH_LIBXL
>
> QEMUMONITORTESTUTILS_SOURCES = \
> diff --git a/tests/libxlxml2domconfigdata/basic-hvm.json b/tests/libxlxml2domconfigdata/basic-hvm.json
> new file mode 100644
> index 0000000..6fa41f3
> --- /dev/null
> +++ b/tests/libxlxml2domconfigdata/basic-hvm.json
> @@ -0,0 +1,89 @@
> +{
> + "c_info": {
> + "type": "hvm",
> + "name": "test-hvm",
> + "uuid": "2147d599-9cc6-c0dc-92ab-4064b5446e9b"
> + },
> + "b_info": {
> + "max_vcpus": 4,
> + "avail_vcpus": [
> + 0,
> + 1,
> + 2,
> + 3
> + ],
> + "max_memkb": 1048576,
> + "target_memkb": 1048576,
> + "video_memkb": 8192,
> + "shadow_memkb": 12288,
> + "device_model_version": "qemu_xen",
> + "device_model": "/bin/true",
> + "sched_params": {
> + "weight": 1000
> + },
> + "type.hvm": {
> + "pae": "True",
> + "apic": "True",
> + "acpi": "True",
> + "vga": {
> + "kind": "cirrus"
> + },
> + "vnc": {
> + "enable": "True",
> + "listen": "0.0.0.0",
> + "findunused": "False"
> + },
> + "sdl": {
> + "enable": "False"
> + },
> + "spice": {
> +
> + },
> + "boot": "c",
> + "rdm": {
> +
> + }
> + },
> + "arch_arm": {
> +
> + }
> + },
> + "disks": [
> + {
> + "pdev_path": "/var/lib/xen/images/test-hvm.img",
> + "vdev": "hda",
> + "backend": "qdisk",
> + "format": "raw",
> + "removable": 1,
> + "readwrite": 1
> + }
> + ],
> + "nics": [
> + {
> + "devid": 0,
> + "mac": "00:16:3e:66:12:b4",
> + "bridge": "br0",
> + "script": "/etc/xen/scripts/vif-bridge",
> + "nictype": "vif_ioemu"
> + }
> + ],
> + "vfbs": [
> + {
> + "devid": -1,
> + "vnc": {
> + "enable": "True",
> + "listen": "0.0.0.0",
> + "findunused": "False"
> + },
> + "sdl": {
> + "enable": "False"
> + }
> + }
> + ],
> + "vkbs": [
> + {
> + "devid": -1
> + }
> + ],
> + "on_reboot": "restart"
> +}
> diff --git a/tests/libxlxml2domconfigdata/basic-hvm.xml b/tests/libxlxml2domconfigdata/basic-hvm.xml
> new file mode 100644
> index 0000000..d8cd2a2
> --- /dev/null
> +++ b/tests/libxlxml2domconfigdata/basic-hvm.xml
> @@ -0,0 +1,36 @@
> +<domain type='xen'>
> + <name>test-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>/bin/true</emulator>
> + <disk type='file' device='disk'>
> + <driver name='qemu'/>
> + <source file='/var/lib/xen/images/test-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/libxlxml2domconfigdata/basic-pv.json b/tests/libxlxml2domconfigdata/basic-pv.json
> new file mode 100644
> index 0000000..7e1abd3
> --- /dev/null
> +++ b/tests/libxlxml2domconfigdata/basic-pv.json
> @@ -0,0 +1,65 @@
> +{
> + "c_info": {
> + "type": "pv",
> + "name": "test-pv",
> + "uuid": "039e9ee6-4a84-3055-4c81-8ba426ae2656"
> + },
> + "b_info": {
> + "max_vcpus": 4,
> + "avail_vcpus": [
> + 0,
> + 1,
> + 2,
> + 3
> + ],
> + "max_memkb": 524288,
> + "target_memkb": 524288,
> + "sched_params": {
> + "weight": 1000
> + },
> + "type.pv": {
> + "bootloader": "pygrub"
> + },
> + "arch_arm": {
> +
> + }
> + },
> + "disks": [
> + {
> + "pdev_path": "/var/lib/xen/images/test-pv.img",
> + "vdev": "xvda",
> + "backend": "qdisk",
> + "format": "raw",
> + "removable": 1,
> + "readwrite": 1
> + }
> + ],
> + "nics": [
> + {
> + "devid": 0,
> + "mac": "00:16:3e:3e:86:60",
> + "bridge": "br0",
> + "script": "/etc/xen/scripts/vif-bridge",
> + "nictype": "vif"
> + }
> + ],
> + "vfbs": [
> + {
> + "devid": -1,
> + "vnc": {
> + "enable": "True",
> + "listen": "0.0.0.0",
> + "findunused": "False"
> + },
> + "sdl": {
> + "enable": "False"
> + }
> + }
> + ],
> + "vkbs": [
> + {
> + "devid": -1
> + }
> + ],
> + "on_reboot": "restart"
> +}
> diff --git a/tests/libxlxml2domconfigdata/basic-pv.xml b/tests/libxlxml2domconfigdata/basic-pv.xml
> new file mode 100644
> index 0000000..b3bc601
> --- /dev/null
> +++ b/tests/libxlxml2domconfigdata/basic-pv.xml
> @@ -0,0 +1,28 @@
> +<domain type='xen'>
> + <name>test-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/test-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/libxlxml2domconfigdata/moredevs-hvm.json b/tests/libxlxml2domconfigdata/moredevs-hvm.json
> new file mode 100644
> index 0000000..8f861f3
> --- /dev/null
> +++ b/tests/libxlxml2domconfigdata/moredevs-hvm.json
> @@ -0,0 +1,111 @@
> +{
> + "c_info": {
> + "type": "hvm",
> + "hap": "True",
> + "name": "test-hvm",
> + "uuid": "2147d599-9cc6-c0dc-92ab-4064b5446e9b"
> + },
> + "b_info": {
> + "max_vcpus": 4,
> + "avail_vcpus": [
> + 0,
> + 1,
> + 2,
> + 3
> + ],
> + "tsc_mode": "native",
> + "max_memkb": 1048576,
> + "target_memkb": 1048576,
> + "video_memkb": 8192,
> + "shadow_memkb": 12288,
> + "device_model_version": "qemu_xen",
> + "device_model": "/bin/true",
> + "sched_params": {
> + "weight": 1000
> + },
> + "type.hvm": {
> + "pae": "True",
> + "apic": "True",
> + "acpi": "True",
> + "hpet": "True",
> + "vga": {
> + "kind": "cirrus"
> + },
> + "vnc": {
> + "enable": "True",
> + "findunused": "False"
> + },
> + "sdl": {
> + "enable": "False"
> + },
> + "spice": {
> +
> + },
> + "serial": "pty",
> + "boot": "c",
> + "usbdevice_list": [
> + "mouse",
> + "tablet"
> + ],
> + "rdm": {
> +
> + }
> + },
> + "arch_arm": {
> +
> + }
> + },
> + "disks": [
> + {
> + "pdev_path": "/var/lib/xen/images/test-hvm.img",
> + "vdev": "hda",
> + "backend": "qdisk",
> + "format": "raw",
> + "removable": 1,
> + "readwrite": 1
> + },
> + {
> + "pdev_path": "/root/boot.iso",
> + "vdev": "hdb",
> + "backend": "qdisk",
> + "format": "raw",
> + "removable": 1,
> + "is_cdrom": 1
> + }
> + ],
> + "nics": [
> + {
> + "devid": 0,
> + "model": "netfront",
> + "mac": "00:16:3e:7a:35:ce",
> + "bridge": "br0",
> + "script": "/etc/xen/scripts/vif-bridge",
> + "nictype": "vif"
> + }
> + ],
> + "pcidevs": [
> + {
> + "dev": 16,
> + "bus": 10,
> + "rdm_policy": "invalid"
> + }
> + ],
> + "vfbs": [
> + {
> + "devid": -1,
> + "vnc": {
> + "enable": "True",
> + "findunused": "False"
> + },
> + "sdl": {
> + "enable": "False"
> + }
> + }
> + ],
> + "vkbs": [
> + {
> + "devid": -1
> + }
> + ],
> + "on_reboot": "restart"
> +}
> diff --git a/tests/libxlxml2domconfigdata/moredevs-hvm.xml b/tests/libxlxml2domconfigdata/moredevs-hvm.xml
> new file mode 100644
> index 0000000..f7eb09f
> --- /dev/null
> +++ b/tests/libxlxml2domconfigdata/moredevs-hvm.xml
> @@ -0,0 +1,63 @@
> +<domain type='xen'>
> + <name>test-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 offset='variable' adjustment='0' basis='utc'>
> + <timer name='tsc' present='yes' mode='native'/>
> + <timer name='hpet' present='yes'/>
> + </clock>
> + <os>
> + <type>hvm</type>
> + <loader>/usr/lib/xen/boot/hvmloader</loader>
> + <boot dev='hd'/>
> + </os>
> + <features>
> + <apic/>
> + <acpi/>
> + <pae/>
> + <hap/>
> + </features>
> + <devices>
> + <emulator>/bin/true</emulator>
> + <disk type='file' device='disk'>
> + <driver name='qemu' type='raw' cache='default'/>
> + <source file='/var/lib/xen/images/test-hvm.img'/>
> + <target dev='hda'/>
> + </disk>
> + <disk type='file' device='cdrom'>
> + <driver name='qemu' type='raw' cache='default'/>
> + <source file='/root/boot.iso'/>
> + <target dev='hdb'/>
> + </disk>
> + <interface type='bridge'>
> + <source bridge='br0'/>
> + <mac address='00:16:3e:7a:35:ce'/>
> + <script path='/etc/xen/scripts/vif-bridge'/>
> + <model type='netfront'/>
> + </interface>
> + <interface type='hostdev' managed='yes'>
> + <mac address='00:16:3e:2e:e7:fc'/>
> + <driver name='xen'/>
> + <source>
> + <address type='pci' domain='0x0000' bus='0x0a' slot='0x10' function='0x0'/>
> + </source>
> + </interface>
> + <graphics type='vnc'/>
> + <video>
> + <model type='cirrus' vram='8192' heads='1' primary='yes'/>
> + </video>
> + <console type='pty'>
> + <target port='0'/>
> + </console>
> + <input type='mouse' bus='usb'/>
> + <input type='tablet' bus='usb'/>
> + <input type='mouse' bus='ps2'/>
> + <input type='keyboard' bus='ps2'/>
> + </devices>
> +</domain>
> diff --git a/tests/libxlxml2domconfigtest.c b/tests/libxlxml2domconfigtest.c
> new file mode 100644
> index 0000000..d943cf2
> --- /dev/null
> +++ b/tests/libxlxml2domconfigtest.c
> @@ -0,0 +1,205 @@
> +/*
> + * libxlxml2domconfigtest.c: test conversion of domXML to
> + * libxl_domain_config structure.
> + *
> + * Copyright (C) 2017 SUSE LINUX Products GmbH, Nuernberg, Germany.
> + *
> + * 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: Jim Fehlig <jfehlig at suse.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_FROM_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_LIBXL
> +
> +static const char *abs_top_srcdir;
> +static virCapsPtr xencaps;
> +
> +static int
> +testCompareXMLToDomConfig(const char *xmlfile,
> + const char *jsonfile)
> +{
> + int ret = -1;
> + libxl_domain_config actualconfig;
> + libxl_domain_config expectconfig;
> + xentoollog_logger *log = NULL;
> + libxl_ctx *ctx = NULL;
> + virPortAllocatorPtr gports = NULL;
> + virDomainXMLOptionPtr xmlopt = NULL;
> + virDomainDefPtr vmdef = NULL;
> + char *actualjson = NULL;
> + char *tempjson = NULL;
> + char *expectjson = NULL;
> +
> + libxl_domain_config_init(&actualconfig);
> + libxl_domain_config_init(&expectconfig);
> +
> + 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(xmlfile, xencaps, xmlopt,
> + NULL, VIR_DOMAIN_XML_INACTIVE)))
> + goto cleanup;
> +
> + if (libxlBuildDomainConfig(gports, vmdef, NULL, ctx, xencaps, &actualconfig) < 0)
> + goto cleanup;
> +
> + if (!(actualjson = libxl_domain_config_to_json(ctx, &actualconfig))) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + "Failed to retrieve JSON doc for libxl_domain_config");
> + goto cleanup;
> + }
> +
> + virTestLoadFile(jsonfile, &tempjson);
> + if (libxl_domain_config_from_json(ctx, &expectconfig, tempjson) != 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + "Failed to create libxl_domain_config from JSON doc");
> + goto cleanup;
> + }
> + if (!(expectjson = libxl_domain_config_to_json(ctx, &expectconfig))) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + "Failed to retrieve JSON doc for libxl_domain_config");
> + goto cleanup;
> + }
> +
> + if (virTestCompareToString(expectjson, actualjson) < 0)
> + goto cleanup;
> +
> + ret = 0;
> +
> + cleanup:
> + VIR_FREE(expectjson);
> + VIR_FREE(actualjson);
> + VIR_FREE(tempjson);
> + virDomainDefFree(vmdef);
> + virObjectUnref(gports);
> + virObjectUnref(xmlopt);
> + libxl_ctx_free(ctx);
> + libxl_domain_config_dispose(&actualconfig);
> + libxl_domain_config_dispose(&expectconfig);
> + xtl_logger_destroy(log);
> + return ret;
> +}
> +
> +
> +struct testInfo {
> + const char *name;
> +};
> +
> +
> +static int
> +testCompareXMLToDomConfigHelper(const void *data)
> +{
> + int ret = -1;
> + const struct testInfo *info = data;
> + char *xmlfile = NULL;
> + char *jsonfile = NULL;
> +
> + if (virAsprintf(&xmlfile, "%s/libxlxml2domconfigdata/%s.xml",
> + abs_srcdir, info->name) < 0 ||
> + virAsprintf(&jsonfile, "%s/libxlxml2domconfigdata/%s.json",
> + abs_srcdir, info->name) < 0)
> + goto cleanup;
> +
> + ret = testCompareXMLToDomConfig(xmlfile, jsonfile);
> +
> + cleanup:
> + VIR_FREE(xmlfile);
> + VIR_FREE(jsonfile);
> + 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 (virTestRun("LibXL XML-2-JSON " name, \
> + testCompareXMLToDomConfigHelper, &info) < 0) \
> + ret = -1; \
> + } while (0)
> +
> + DO_TEST("basic-pv");
> + DO_TEST("basic-hvm");
> + DO_TEST("moredevs-hvm");
> +
> + return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
> +}
> +
> +VIR_TEST_MAIN_PRELOAD(mymain, abs_builddir "/.libs/virmocklibxl.so")
> +
> +#else
> +
> +int main(void)
> +{
> + return EXIT_AM_SKIP;
> +}
> +
> +#endif /* WITH_LIBXL && WITH_YAJL && HAVE_LIBXL_DOMAIN_CONFIG_FROM_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 at 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 */
>
> base-commit: ace45e67abbd9a033be54602db71a9dbc71408d7
> --
> git-series 0.9.1
More information about the libvir-list
mailing list