[libvirt] [PATCH v2] tests: dynamically replace dnsmasq path

Philipp Hahn hahn at univention.de
Mon Jan 30 17:13:08 UTC 2012


The path to the dnsmasq binary can be configured while in the test data
the path is hard-coded to /usr/bin/. This break the test suite if a the
binary is located in a different location, like /usr/local/sbin/.

Replace the hard coded path in the test data by a token, which is
dynamically replaced in networkxml2argvtest with the configured path
after the test data has been loaded.

(Another option would have been to modify configure.ac to generate the
 test data during configure, but I do not know of an easy way do trick
 configure into mass-generate those test files without listing every
 single one, which I consider less flexible.)

v2:
- Use VIR_REALLOC_N() instead of realloc()
- Use memcpy() for replacement
- Skip shrinking buffer
- Add missing update of token_end
- simplify code after the changes above
- unit-test the unit-test:
  #include <assert.h>
  #define TEST(in,token,rep,out) { char *buf = strdup(in); assert(!replaceTokens(&buf, token, rep) && !strcmp(buf, out)); free(buf); }
  TEST("", "AA", "B", "");
  TEST("A", "AA", "B", "A");
  TEST("AA", "AA", "B", "B");
  TEST("AAA", "AA", "B", "BA");
  TEST("AA", "AA", "BB", "BB");
  TEST("AA", "AA", "BBB", "BBB");
  TEST("<AA", "AA", "B", "<B");
  TEST("<AA", "AA", "BB", "<BB");
  TEST("<AA", "AA", "BBB", "<BBB");
  TEST("AA>", "AA", "B", "B>");
  TEST("AA>", "AA", "BB", "BB>");
  TEST("AA>", "AA", "BBB", "BBB>");
  TEST("<AA>", "AA", "B", "<B>");
  TEST("<AA>", "AA", "BB", "<BB>");
  TEST("<AA>", "AA", "BBB", "<BBB>");
  TEST("<AA|AA>", "AA", "B", "<B|B>");
  TEST("<AA|AA>", "AA", "BB", "<BB|BB>");
  TEST("<AA|AA>", "AA", "BBB", "<BBB|BBB>");
  TEST("<AAAA>", "AA", "B", "<BB>");
  TEST("<AAAA>", "AA", "BB", "<BBBB>");
  TEST("<AAAA>", "AA", "BBB", "<BBBBBB>");
  TEST("AAAA>", "AA", "B", "BB>");
  TEST("AAAA>", "AA", "BB", "BBBB>");
  TEST("AAAA>", "AA", "BBB", "BBBBBB>");
  TEST("<AAAA", "AA", "B", "<BB");
  TEST("<AAAA", "AA", "BB", "<BBBB");
  TEST("<AAAA", "AA", "BBB", "<BBBBBB");
  alarm(1); /* no infinit loop */
  TEST("A", "A", "A", "A");
  TEST("AA", "A", "A", "AA");
  alarm(0);

Signed-off-by: Philipp Hahn <hahn at univention.de>
---
 tests/networkxml2argvdata/isolated-network.argv    |    2 +-
 .../networkxml2argvdata/nat-network-dns-hosts.argv |    2 +-
 .../nat-network-dns-srv-record-minimal.argv        |    2 +-
 .../nat-network-dns-srv-record.argv                |    2 +-
 .../nat-network-dns-txt-record.argv                |    2 +-
 tests/networkxml2argvdata/nat-network.argv         |    2 +-
 tests/networkxml2argvdata/netboot-network.argv     |    2 +-
 .../networkxml2argvdata/netboot-proxy-network.argv |    2 +-
 tests/networkxml2argvdata/routed-network.argv      |    2 +-
 tests/networkxml2argvtest.c                        |   33 ++++++++++++++++++++
 10 files changed, 42 insertions(+), 9 deletions(-)

diff --git a/tests/networkxml2argvdata/isolated-network.argv b/tests/networkxml2argvdata/isolated-network.argv
index 7ea2e94..a9beb05 100644
--- a/tests/networkxml2argvdata/isolated-network.argv
+++ b/tests/networkxml2argvdata/isolated-network.argv
@@ -1,4 +1,4 @@
-/usr/sbin/dnsmasq --strict-order --bind-interfaces --conf-file= \
+ at DNSMASQ@ --strict-order --bind-interfaces --conf-file= \
 --except-interface lo --dhcp-option=3 --no-resolv \
 --listen-address 192.168.152.1 \
 --dhcp-range 192.168.152.2,192.168.152.254 \
diff --git a/tests/networkxml2argvdata/nat-network-dns-hosts.argv b/tests/networkxml2argvdata/nat-network-dns-hosts.argv
index 2158df8..c7e4967 100644
--- a/tests/networkxml2argvdata/nat-network-dns-hosts.argv
+++ b/tests/networkxml2argvdata/nat-network-dns-hosts.argv
@@ -1,3 +1,3 @@
-/usr/sbin/dnsmasq --strict-order --bind-interfaces --domain example.com \
+ at DNSMASQ@ --strict-order --bind-interfaces --domain example.com \
 --conf-file= --except-interface lo --listen-address 192.168.122.1 \
 --expand-hosts --addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts\
diff --git a/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv b/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv
index 021e8f0..ea1da6d 100644
--- a/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv
+++ b/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv
@@ -1,4 +1,4 @@
-/usr/sbin/dnsmasq \
+ at DNSMASQ@ \
 --strict-order \
 --bind-interfaces \
 --conf-file= \
diff --git a/tests/networkxml2argvdata/nat-network-dns-srv-record.argv b/tests/networkxml2argvdata/nat-network-dns-srv-record.argv
index 85afbba..84c2d2f 100644
--- a/tests/networkxml2argvdata/nat-network-dns-srv-record.argv
+++ b/tests/networkxml2argvdata/nat-network-dns-srv-record.argv
@@ -1,4 +1,4 @@
-/usr/sbin/dnsmasq \
+ at DNSMASQ@ \
 --strict-order \
 --bind-interfaces \
 --conf-file= \
diff --git a/tests/networkxml2argvdata/nat-network-dns-txt-record.argv b/tests/networkxml2argvdata/nat-network-dns-txt-record.argv
index be6ba4b..bed309f 100644
--- a/tests/networkxml2argvdata/nat-network-dns-txt-record.argv
+++ b/tests/networkxml2argvdata/nat-network-dns-txt-record.argv
@@ -1,4 +1,4 @@
-/usr/sbin/dnsmasq --strict-order --bind-interfaces --conf-file= \
+ at DNSMASQ@ --strict-order --bind-interfaces --conf-file= \
 --except-interface lo --txt-record=example,example value \
 --listen-address 192.168.122.1 --listen-address 192.168.123.1 \
 --listen-address 2001:db8:ac10:fe01::1 \
diff --git a/tests/networkxml2argvdata/nat-network.argv b/tests/networkxml2argvdata/nat-network.argv
index d7faee2..80878a8 100644
--- a/tests/networkxml2argvdata/nat-network.argv
+++ b/tests/networkxml2argvdata/nat-network.argv
@@ -1,4 +1,4 @@
-/usr/sbin/dnsmasq --strict-order --bind-interfaces --conf-file= \
+ at DNSMASQ@ --strict-order --bind-interfaces --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 \
diff --git a/tests/networkxml2argvdata/netboot-network.argv b/tests/networkxml2argvdata/netboot-network.argv
index 78e873c..7ae5b75 100644
--- a/tests/networkxml2argvdata/netboot-network.argv
+++ b/tests/networkxml2argvdata/netboot-network.argv
@@ -1,4 +1,4 @@
-/usr/sbin/dnsmasq --strict-order --bind-interfaces --domain example.com \
+ at DNSMASQ@ --strict-order --bind-interfaces --domain example.com \
 --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 \
diff --git a/tests/networkxml2argvdata/netboot-proxy-network.argv b/tests/networkxml2argvdata/netboot-proxy-network.argv
index 5fe1b8e..2c5a0d5 100644
--- a/tests/networkxml2argvdata/netboot-proxy-network.argv
+++ b/tests/networkxml2argvdata/netboot-proxy-network.argv
@@ -1,4 +1,4 @@
-/usr/sbin/dnsmasq --strict-order --bind-interfaces --domain example.com \
+ at DNSMASQ@ --strict-order --bind-interfaces --domain example.com \
 --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 \
diff --git a/tests/networkxml2argvdata/routed-network.argv b/tests/networkxml2argvdata/routed-network.argv
index d059630..75303e6 100644
--- a/tests/networkxml2argvdata/routed-network.argv
+++ b/tests/networkxml2argvdata/routed-network.argv
@@ -1,2 +1,2 @@
-/usr/sbin/dnsmasq --strict-order --bind-interfaces --conf-file= \
+ at DNSMASQ@ --strict-order --bind-interfaces --conf-file= \
 --except-interface lo --listen-address 192.168.122.1\
diff --git a/tests/networkxml2argvtest.c b/tests/networkxml2argvtest.c
index 2dd9b7f..f2e9086 100644
--- a/tests/networkxml2argvtest.c
+++ b/tests/networkxml2argvtest.c
@@ -15,6 +15,36 @@
 #include "memory.h"
 #include "network/bridge_driver.h"
 
+/* Replace all occurrences of @token in @buf by @replacement and adjust size of
+ * @buf accordingly. Returns 0 on success and -1 on out-of-memory errors. */
+static int replaceTokens(char **buf, const char *token, const char *replacement) {
+    char *token_start, *token_end;
+    size_t buf_len, rest_len;
+    const size_t token_len = strlen(token);
+    const size_t replacement_len = strlen(replacement);
+    const int diff = replacement_len - token_len;
+
+    buf_len = rest_len = strlen(*buf) + 1;
+    token_end = *buf;
+    for (;;) {
+        token_start = strstr(token_end, token);
+        if (token_start == NULL)
+            break;
+        rest_len -= token_start + token_len - token_end;
+        token_end = token_start + token_len;
+        buf_len += diff;
+        if (diff > 0)
+            if (VIR_REALLOC_N(*buf, buf_len) < 0)
+                return -1;
+        if (diff != 0)
+            memmove(token_end + diff, token_end, rest_len);
+        memcpy(token_start, replacement, replacement_len);
+        token_end += diff;
+    }
+    /* if diff < 0, we could shrinkt the buffer here... */
+    return 0;
+}
+
 static int testCompareXMLToArgvFiles(const char *inxml, const char *outargv) {
     char *inXmlData = NULL;
     char *outArgvData = NULL;
@@ -32,6 +62,9 @@ static int testCompareXMLToArgvFiles(const char *inxml, const char *outargv) {
     if (virtTestLoadFile(outargv, &outArgvData) < 0)
         goto fail;
 
+    if (replaceTokens(&outArgvData, "@DNSMASQ@", DNSMASQ))
+        goto fail;
+
     if (!(dev = virNetworkDefParseString(inXmlData)))
         goto fail;
 
-- 
1.7.1




More information about the libvir-list mailing list