[libvirt] [PATCH v3 2/5] Network: Add regression tests for the command-line arguments

Michal Novotny minovotn at redhat.com
Mon May 2 12:10:53 UTC 2011


The regression testing done by comparison of command-line
generated from the network XML file and the expected
command-line arguments (read from file).

For the tests the pidfile should be set to NULL string, i.e.
(null) since no real invocation of the command is being done,
just the command-line is being generated and compared to the
expected one.

Signed-off-by: Michal Novotny <minovotn at redhat.com>
---
 src/Makefile.am                                    |    7 +-
 src/libvirt_network.syms                           |    6 +
 src/network/bridge_driver.c                        |   36 +++++--
 src/network/bridge_driver.h                        |    3 +
 tests/Makefile.am                                  |   10 ++
 tests/networkxml2argvdata/isolated-network.argv    |    1 +
 tests/networkxml2argvdata/isolated-network.xml     |   11 ++
 .../nat-network-dns-txt-record.argv                |    1 +
 .../nat-network-dns-txt-record.xml                 |   24 ++++
 tests/networkxml2argvdata/nat-network.argv         |    1 +
 tests/networkxml2argvdata/nat-network.xml          |   21 ++++
 tests/networkxml2argvdata/netboot-network.argv     |    1 +
 tests/networkxml2argvdata/netboot-network.xml      |   14 +++
 .../networkxml2argvdata/netboot-proxy-network.argv |    1 +
 .../networkxml2argvdata/netboot-proxy-network.xml  |   13 +++
 tests/networkxml2argvdata/routed-network.argv      |    1 +
 tests/networkxml2argvdata/routed-network.xml       |    9 ++
 tests/networkxml2argvtest.c                        |  114 ++++++++++++++++++++
 18 files changed, 266 insertions(+), 8 deletions(-)
 create mode 100644 src/libvirt_network.syms
 create mode 100644 tests/networkxml2argvdata/isolated-network.argv
 create mode 100644 tests/networkxml2argvdata/isolated-network.xml
 create mode 100644 tests/networkxml2argvdata/nat-network-dns-txt-record.argv
 create mode 100644 tests/networkxml2argvdata/nat-network-dns-txt-record.xml
 create mode 100644 tests/networkxml2argvdata/nat-network.argv
 create mode 100644 tests/networkxml2argvdata/nat-network.xml
 create mode 100644 tests/networkxml2argvdata/netboot-network.argv
 create mode 100644 tests/networkxml2argvdata/netboot-network.xml
 create mode 100644 tests/networkxml2argvdata/netboot-proxy-network.argv
 create mode 100644 tests/networkxml2argvdata/netboot-proxy-network.xml
 create mode 100644 tests/networkxml2argvdata/routed-network.argv
 create mode 100644 tests/networkxml2argvdata/routed-network.xml
 create mode 100644 tests/networkxml2argvtest.c

diff --git a/src/Makefile.am b/src/Makefile.am
index 1eaa7d1..40da089 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1097,6 +1097,10 @@ if WITH_VMX
 USED_SYM_FILES += libvirt_vmx.syms
 endif
 
+if WITH_NETWORK
+USED_SYM_FILES += libvirt_network.syms
+endif
+
 EXTRA_DIST += \
   libvirt_public.syms		\
   libvirt_private.syms		\
@@ -1106,7 +1110,8 @@ EXTRA_DIST += \
   libvirt_macvtap.syms		\
   libvirt_daemon.syms		\
   libvirt_nwfilter.syms	\
-  libvirt_vmx.syms
+  libvirt_vmx.syms	\
+  libvirt_network.syms
 
 BUILT_SOURCES += libvirt.syms libvirt.def libvirt_qemu.def
 
diff --git a/src/libvirt_network.syms b/src/libvirt_network.syms
new file mode 100644
index 0000000..6be5e45
--- /dev/null
+++ b/src/libvirt_network.syms
@@ -0,0 +1,6 @@
+#
+# Network-specific symbols
+#
+
+# bridge_driver.h
+networkBuildDhcpDaemonCommandLine;
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 8003b1c..eb4477a 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -633,12 +633,12 @@ cleanup:
     return ret;
 }
 
-static int
-networkStartDhcpDaemon(virNetworkObjPtr network)
+int
+networkBuildDhcpDaemonCommandLine(virNetworkObjPtr network, virCommandPtr *cmdout,
+                                  char *pidfile)
 {
     virCommandPtr cmd = NULL;
-    char *pidfile = NULL;
-    int ret = -1, err, ii;
+    int ret = -1, ii;
     virNetworkIpDefPtr ipdef;
 
     network->dnsmasqPid = -1;
@@ -663,6 +663,29 @@ networkStartDhcpDaemon(virNetworkObjPtr network)
     if (!virNetworkDefGetIpByIndex(network->def, AF_UNSPEC, 0))
         return 0;
 
+    cmd = virCommandNew(DNSMASQ);
+    if (networkBuildDnsmasqArgv(network, ipdef, pidfile, cmd) < 0) {
+        goto cleanup;
+    }
+
+    if (cmdout)
+        *cmdout = cmd;
+
+    ret = 0;
+cleanup:
+    if (ret < 0)
+        virCommandFree(cmd);
+    return ret;
+}
+
+static int
+networkStartDhcpDaemon(virNetworkObjPtr network)
+{
+    virCommandPtr cmd = NULL;
+    char *pidfile = NULL;
+    int ret = -1;
+    int err;
+
     if ((err = virFileMakePath(NETWORK_PID_DIR)) != 0) {
         virReportSystemError(err,
                              _("cannot create directory %s"),
@@ -688,10 +711,9 @@ networkStartDhcpDaemon(virNetworkObjPtr network)
         goto cleanup;
     }
 
-    cmd = virCommandNew(DNSMASQ);
-    if (networkBuildDnsmasqArgv(network, ipdef, pidfile, cmd) < 0) {
+    ret = networkBuildDhcpDaemonCommandLine(network, &cmd, pidfile);
+    if (ret < 0)
         goto cleanup;
-    }
 
     if (virCommandRun(cmd, NULL) < 0)
         goto cleanup;
diff --git a/src/network/bridge_driver.h b/src/network/bridge_driver.h
index 32d2ae7..8d82b67 100644
--- a/src/network/bridge_driver.h
+++ b/src/network/bridge_driver.h
@@ -28,7 +28,10 @@
 # include <config.h>
 
 # include "internal.h"
+# include "network_conf.h"
+# include "command.h"
 
 int networkRegister(void);
+int networkBuildDhcpDaemonCommandLine(virNetworkObjPtr network, virCommandPtr *cmdout, char *pidfile);
 
 #endif /* __VIR_NETWORK__DRIVER_H */
diff --git a/tests/Makefile.am b/tests/Makefile.am
index fe191fd..7cc73a5 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -50,6 +50,7 @@ EXTRA_DIST =		\
 	networkschematest \
 	networkxml2xmlin \
 	networkxml2xmlout \
+	networkxml2argvdata \
 	nodedevschemadata \
 	nodedevschematest \
 	nodeinfodata     \
@@ -105,6 +106,8 @@ endif
 
 check_PROGRAMS += networkxml2xmltest
 
+check_PROGRAMS += networkxml2argvtest
+
 check_PROGRAMS += nwfilterxml2xmltest
 
 check_PROGRAMS += storagevolxml2xmltest storagepoolxml2xmltest
@@ -194,6 +197,8 @@ endif
 
 TESTS += networkxml2xmltest
 
+TESTS += networkxml2argvtest
+
 TESTS += storagevolxml2xmltest storagepoolxml2xmltest
 
 TESTS += nodedevxml2xmltest
@@ -311,6 +316,11 @@ networkxml2xmltest_SOURCES = \
 	testutils.c testutils.h
 networkxml2xmltest_LDADD = $(LDADDS)
 
+networkxml2argvtest_SOURCES = \
+	networkxml2argvtest.c \
+	testutils.c testutils.h
+networkxml2argvtest_LDADD = ../src/libvirt_driver_network.la $(LDADDS)
+
 nwfilterxml2xmltest_SOURCES = \
 	nwfilterxml2xmltest.c \
 	testutils.c testutils.h
diff --git a/tests/networkxml2argvdata/isolated-network.argv b/tests/networkxml2argvdata/isolated-network.argv
new file mode 100644
index 0000000..dce6034
--- /dev/null
+++ b/tests/networkxml2argvdata/isolated-network.argv
@@ -0,0 +1 @@
+/usr/sbin/dnsmasq --strict-order --bind-interfaces --pid-file=(null) --conf-file= --except-interface lo --dhcp-option=3 --listen-address 192.168.152.1 --dhcp-range 192.168.152.2,192.168.152.254 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/private.leases --dhcp-lease-max=253 --dhcp-no-override
\ No newline at end of file
diff --git a/tests/networkxml2argvdata/isolated-network.xml b/tests/networkxml2argvdata/isolated-network.xml
new file mode 100644
index 0000000..cc320a9
--- /dev/null
+++ b/tests/networkxml2argvdata/isolated-network.xml
@@ -0,0 +1,11 @@
+<network>
+  <name>private</name>
+  <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+  <bridge name='virbr2' stp='on' delay='0' />
+  <mac address='52:54:00:17:3F:37'/>
+  <ip address='192.168.152.1' netmask='255.255.255.0'>
+    <dhcp>
+      <range start='192.168.152.2' end='192.168.152.254' />
+    </dhcp>
+  </ip>
+</network>
diff --git a/tests/networkxml2argvdata/nat-network-dns-txt-record.argv b/tests/networkxml2argvdata/nat-network-dns-txt-record.argv
new file mode 100644
index 0000000..54a34e9
--- /dev/null
+++ b/tests/networkxml2argvdata/nat-network-dns-txt-record.argv
@@ -0,0 +1 @@
+/usr/sbin/dnsmasq --strict-order --bind-interfaces --pid-file=(null) --conf-file= --except-interface lo --listen-address 192.168.122.1 --listen-address 192.168.123.1 --listen-address 2001:db8:ac10:fe01::1 --listen-address 2001:db8:ac10:fd01::1 --listen-address 10.24.10.1 --dhcp-range 192.168.122.2,192.168.122.254 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases --dhcp-lease-max=253 --dhcp-no-override
\ No newline at end of file
diff --git a/tests/networkxml2argvdata/nat-network-dns-txt-record.xml b/tests/networkxml2argvdata/nat-network-dns-txt-record.xml
new file mode 100644
index 0000000..d3e795d
--- /dev/null
+++ b/tests/networkxml2argvdata/nat-network-dns-txt-record.xml
@@ -0,0 +1,24 @@
+<network>
+  <name>default</name>
+  <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+  <forward dev='eth1' mode='nat'/>
+  <bridge name='virbr0' stp='on' delay='0' />
+  <ip address='192.168.122.1' netmask='255.255.255.0'>
+    <dhcp>
+      <range start='192.168.122.2' end='192.168.122.254' />
+      <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10' />
+      <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11' />
+    </dhcp>
+    <dns>
+      <txt-record name='example' value='example value' />
+    </dns>
+  </ip>
+  <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fe01::1' prefix='64'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fd01::1' prefix='64'>
+  </ip>
+  <ip family='ipv4' address='10.24.10.1'>
+  </ip>
+</network>
diff --git a/tests/networkxml2argvdata/nat-network.argv b/tests/networkxml2argvdata/nat-network.argv
new file mode 100644
index 0000000..54a34e9
--- /dev/null
+++ b/tests/networkxml2argvdata/nat-network.argv
@@ -0,0 +1 @@
+/usr/sbin/dnsmasq --strict-order --bind-interfaces --pid-file=(null) --conf-file= --except-interface lo --listen-address 192.168.122.1 --listen-address 192.168.123.1 --listen-address 2001:db8:ac10:fe01::1 --listen-address 2001:db8:ac10:fd01::1 --listen-address 10.24.10.1 --dhcp-range 192.168.122.2,192.168.122.254 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases --dhcp-lease-max=253 --dhcp-no-override
\ No newline at end of file
diff --git a/tests/networkxml2argvdata/nat-network.xml b/tests/networkxml2argvdata/nat-network.xml
new file mode 100644
index 0000000..eb71d9e
--- /dev/null
+++ b/tests/networkxml2argvdata/nat-network.xml
@@ -0,0 +1,21 @@
+<network>
+  <name>default</name>
+  <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+  <forward dev='eth1' mode='nat'/>
+  <bridge name='virbr0' stp='on' delay='0' />
+  <ip address='192.168.122.1' netmask='255.255.255.0'>
+    <dhcp>
+      <range start='192.168.122.2' end='192.168.122.254' />
+      <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10' />
+      <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11' />
+    </dhcp>
+  </ip>
+  <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fe01::1' prefix='64'>
+  </ip>
+  <ip family='ipv6' address='2001:db8:ac10:fd01::1' prefix='64'>
+  </ip>
+  <ip family='ipv4' address='10.24.10.1'>
+  </ip>
+</network>
diff --git a/tests/networkxml2argvdata/netboot-network.argv b/tests/networkxml2argvdata/netboot-network.argv
new file mode 100644
index 0000000..565c41b
--- /dev/null
+++ b/tests/networkxml2argvdata/netboot-network.argv
@@ -0,0 +1 @@
+/usr/sbin/dnsmasq --strict-order --bind-interfaces --domain example.com --pid-file=(null) --conf-file= --except-interface lo --listen-address 192.168.122.1 --dhcp-range 192.168.122.2,192.168.122.254 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/netboot.leases --dhcp-lease-max=253 --dhcp-no-override --enable-tftp --tftp-root /var/lib/tftproot --dhcp-boot pxeboot.img
\ No newline at end of file
diff --git a/tests/networkxml2argvdata/netboot-network.xml b/tests/networkxml2argvdata/netboot-network.xml
new file mode 100644
index 0000000..b8a4d99
--- /dev/null
+++ b/tests/networkxml2argvdata/netboot-network.xml
@@ -0,0 +1,14 @@
+<network>
+  <name>netboot</name>
+  <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+  <forward mode='nat'/>
+  <bridge name='virbr1' stp='off' delay='1' />
+  <domain name='example.com'/>
+  <ip address='192.168.122.1' netmask='255.255.255.0'>
+    <tftp root='/var/lib/tftproot' />
+    <dhcp>
+      <range start='192.168.122.2' end='192.168.122.254' />
+      <bootp file='pxeboot.img' />
+    </dhcp>
+  </ip>
+</network>
diff --git a/tests/networkxml2argvdata/netboot-proxy-network.argv b/tests/networkxml2argvdata/netboot-proxy-network.argv
new file mode 100644
index 0000000..019367d
--- /dev/null
+++ b/tests/networkxml2argvdata/netboot-proxy-network.argv
@@ -0,0 +1 @@
+/usr/sbin/dnsmasq --strict-order --bind-interfaces --domain example.com --pid-file=(null) --conf-file= --except-interface lo --listen-address 192.168.122.1 --dhcp-range 192.168.122.2,192.168.122.254 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/netboot.leases --dhcp-lease-max=253 --dhcp-no-override --dhcp-boot pxeboot.img,,10.20.30.40
\ No newline at end of file
diff --git a/tests/networkxml2argvdata/netboot-proxy-network.xml b/tests/networkxml2argvdata/netboot-proxy-network.xml
new file mode 100644
index 0000000..e11c50b
--- /dev/null
+++ b/tests/networkxml2argvdata/netboot-proxy-network.xml
@@ -0,0 +1,13 @@
+<network>
+  <name>netboot</name>
+  <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+  <forward mode='nat'/>
+  <bridge name='virbr1' stp='off' delay='1' />
+  <domain name='example.com'/>
+  <ip address='192.168.122.1' netmask='255.255.255.0'>
+    <dhcp>
+      <range start='192.168.122.2' end='192.168.122.254' />
+      <bootp file='pxeboot.img' server='10.20.30.40' />
+    </dhcp>
+  </ip>
+</network>
diff --git a/tests/networkxml2argvdata/routed-network.argv b/tests/networkxml2argvdata/routed-network.argv
new file mode 100644
index 0000000..2b51d90
--- /dev/null
+++ b/tests/networkxml2argvdata/routed-network.argv
@@ -0,0 +1 @@
+/usr/sbin/dnsmasq --strict-order --bind-interfaces --pid-file=(null) --conf-file= --except-interface lo --listen-address 192.168.122.1
\ No newline at end of file
diff --git a/tests/networkxml2argvdata/routed-network.xml b/tests/networkxml2argvdata/routed-network.xml
new file mode 100644
index 0000000..3aa8109
--- /dev/null
+++ b/tests/networkxml2argvdata/routed-network.xml
@@ -0,0 +1,9 @@
+<network>
+  <name>local</name>
+  <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+  <forward dev='eth1' mode='route'/>
+  <bridge name='virbr1' stp='on' delay='0' />
+  <mac address='12:34:56:78:9A:BC'/>
+  <ip address='192.168.122.1' netmask='255.255.255.0'>
+  </ip>
+</network>
diff --git a/tests/networkxml2argvtest.c b/tests/networkxml2argvtest.c
new file mode 100644
index 0000000..2498fd2
--- /dev/null
+++ b/tests/networkxml2argvtest.c
@@ -0,0 +1,114 @@
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <sys/types.h>
+#include <fcntl.h>
+
+#include "internal.h"
+#include "testutils.h"
+#include "network_conf.h"
+#include "command.h"
+#include "memory.h"
+#include "network/bridge_driver.h"
+
+static char *progname;
+static char *abs_srcdir;
+
+#define MAX_FILE 4096
+
+
+static int testCompareXMLToArgvFiles(const char *inxml, const char *outargv) {
+    char inXmlData[MAX_FILE];
+    char *inXmlPtr = &(inXmlData[0]);
+    char outArgvData[MAX_FILE];
+    char *outArgvPtr = &(outArgvData[0]);
+    char *actual = NULL;
+    int ret = -1;
+    virNetworkDefPtr dev = NULL;
+    virNetworkObjPtr obj = NULL;
+    virCommandPtr cmd = NULL;
+    char *pidfile = NULL;
+
+    if (virtTestLoadFile(inxml, &inXmlPtr, MAX_FILE) < 0)
+        goto fail;
+
+    if (virtTestLoadFile(outargv, &outArgvPtr, MAX_FILE) < 0)
+        goto fail;
+
+    if (!(dev = virNetworkDefParseString(inXmlData)))
+        goto fail;
+
+    if (VIR_ALLOC(obj) < 0)
+        goto fail;
+
+    obj->def = dev;
+
+    if (networkBuildDhcpDaemonCommandLine(obj, &cmd, pidfile) != 0)
+        goto fail;
+
+    if (!(actual = virCommandToString(cmd)))
+        goto fail;
+
+    if (STRNEQ(outArgvData, actual)) {
+        virtTestDifference(stderr, outArgvData, actual);
+        goto fail;
+    }
+
+    ret = 0;
+
+ fail:
+    free(actual);
+    VIR_FREE(pidfile);
+    virCommandFree(cmd);
+    virNetworkObjFree(obj);
+    return ret;
+}
+
+static int testCompareXMLToArgvHelper(const void *data) {
+    char inxml[PATH_MAX];
+    char outargv[PATH_MAX];
+    snprintf(inxml, PATH_MAX, "%s/networkxml2argvdata/%s.xml",
+             abs_srcdir, (const char*)data);
+    snprintf(outargv, PATH_MAX, "%s/networkxml2argvdata/%s.argv",
+             abs_srcdir, (const char*)data);
+    return testCompareXMLToArgvFiles(inxml, outargv);
+}
+
+
+static int
+mymain(int argc, char **argv)
+{
+    int ret = 0;
+    char cwd[PATH_MAX];
+
+    progname = argv[0];
+
+    if (argc > 1) {
+        fprintf(stderr, "Usage: %s\n", progname);
+        return (EXIT_FAILURE);
+    }
+
+    abs_srcdir = getenv("abs_srcdir");
+    if (!abs_srcdir)
+        abs_srcdir = getcwd(cwd, sizeof(cwd));
+
+#define DO_TEST(name) \
+    if (virtTestRun("Network XML-2-Argv " name, \
+                    1, testCompareXMLToArgvHelper, (name)) < 0) \
+        ret = -1
+
+    DO_TEST("isolated-network");
+    DO_TEST("routed-network");
+    DO_TEST("nat-network");
+    DO_TEST("netboot-network");
+    DO_TEST("netboot-proxy-network");
+    DO_TEST("nat-network-dns-txt-record");
+
+    return (ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+
+VIRT_TEST_MAIN(mymain)
-- 
1.7.3.2




More information about the libvir-list mailing list