On Wed, Jan 12, 2022 at 09:47:56AM +0100, Michal Privoznik wrote:
DISCLAIMER: dnsmasq capabilities are empty as of v8.0.0-rc1~145.
In a real environment the dnsmasq capabilities are constructed
using dnsmasqCapsNewFromBinary(). We also have
dnsmasqCapsNewFromBuffer() to bypass checks that real code is
doing and just get capabilities object. The latter is used from
test suite.
However, with a little bit of mocking we can test the real life
code. All that's needed is to simulate dnsmasq's output for
--version and --help and mock a stat() that's done in
dnsmasqCapsRefreshInternal().
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
tests/networkmock.c | 16 ++++++++++++++++
tests/networkxml2conftest.c | 38 ++++++++++++++++++++++++++++++++++++-
2 files changed, 53 insertions(+), 1 deletion(-)
This all works, but I wonder if we couldn't just create a trivial
shell script that behaves minimally the way we expect dnsmasq to, and
change our virFindFileInPath() mock so that it returns the absolute
path to it? That way we wouldn't need to implement any additional
mocking and the code would end up being much simpler. Diff below.
Also note that there is a pre-existing issue with the test, in that
we don't check that the value returned by dnsmasqCapsNewFrom*() is
non-NULL, and as a result if you change the version number in the
test string to something like 0.1 the test will still pass where it
definitely shouldn't.
diff --git a/tests/networkmock.c b/tests/networkmock.c
index a9c13311a6..dc1209a367 100644
--- a/tests/networkmock.c
+++ b/tests/networkmock.c
@@ -23,7 +23,7 @@ char *
virFindFileInPath(const char *file)
{
if (file && g_strrstr(file, "dnsmasq"))
- return g_strdup(file);
+ return g_strdup_printf("%s/virdnsmasqmock.sh", abs_srcdir);
/* We should not need any other binaries so return NULL. */
return NULL;
diff --git a/tests/networkxml2conftest.c b/tests/networkxml2conftest.c
index 8a6657654a..fd2116756e 100644
--- a/tests/networkxml2conftest.c
+++ b/tests/networkxml2conftest.c
@@ -114,7 +114,7 @@ mymain(void)
int ret = 0;
g_autoptr(dnsmasqCaps) full = NULL;
- full = dnsmasqCapsNewFromBuffer("Dnsmasq version
2.67\n--bind-dynamic\n--ra-param");
+ full = dnsmasqCapsNewFromBinary();
#define DO_TEST(xname, xcaps) \
do { \
diff --git a/tests/virdnsmasqmock.sh b/tests/virdnsmasqmock.sh
new file mode 100755
index 0000000000..faaa94268c
--- /dev/null
+++ b/tests/virdnsmasqmock.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+case "$1" in
+ "--version")
+ echo "Dnsmasq version 2.67"
+ ;;
+ "--help")
+ echo "--bind-dynamic"
+ echo "--ra-param"
+ ;;
+ *)
+ exit 1
+ ;;
+esac
+
+exit 0
--
Andrea Bolognani / Red Hat / Virtualization