[libvirt] [PATCH v2 2/3] tests: Add test for new virkmod functions

John Ferlan jferlan at redhat.com
Thu Jan 30 00:52:44 UTC 2014


Adding tests for new virModprobe{Config|Load|Unload|UseBlacklist} API's.
Other than the virModprobeConfig() calls, the tests require some special
set up and to be run from root.

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 .gitignore          |   2 +
 tests/Makefile.am   |   5 ++
 tests/virkmodtest.c | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 208 insertions(+)
 create mode 100644 tests/virkmodtest.c

diff --git a/.gitignore b/.gitignore
index 96b7211..79437e9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -70,6 +70,7 @@
 /docs/libvirt-refs.xml
 /docs/search.php
 /docs/todo.html.in
+/examples/domain-events/
 /examples/object-events/event-test
 /examples/dominfo/info1
 /examples/domsuspend/suspend
@@ -202,6 +203,7 @@
 /tests/viridentitytest
 /tests/virkeycodetest
 /tests/virkeyfiletest
+/tests/virkmodtest
 /tests/virlockspacetest
 /tests/virlogtest
 /tests/virnet*test
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 0930073..632c953 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -142,6 +142,7 @@ test_programs = virshtest sockettest \
 	sysinfotest \
 	virstoragetest \
 	virnetdevbandwidthtest \
+	virkmodtest \
 	$(NULL)
 
 if WITH_REMOTE
@@ -655,6 +656,10 @@ virnetdevbandwidthtest_SOURCES = \
 	virnetdevbandwidthtest.c testutils.h testutils.c
 virnetdevbandwidthtest_LDADD = $(LDADDS)
 
+virkmodtest_SOURCES = \
+	virkmodtest.c testutils.h testutils.c
+virkmodtest_LDADD = $(LDADDS)
+
 if WITH_LIBVIRTD
 libvirtdconftest_SOURCES = \
 	libvirtdconftest.c testutils.h testutils.c \
diff --git a/tests/virkmodtest.c b/tests/virkmodtest.c
new file mode 100644
index 0000000..8957e2c
--- /dev/null
+++ b/tests/virkmodtest.c
@@ -0,0 +1,201 @@
+/*
+ * 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/>.
+ */
+
+#include <config.h>
+
+#include "testutils.h"
+
+#ifdef __linux__
+
+# include <stdlib.h>
+# include <stdio.h>
+# include <virkmod.h>
+# include <virstring.h>
+
+# define VIR_FROM_THIS VIR_FROM_NONE
+
+/* Defining MODPROBE_CONFIG_VFIO_PCI to 1 will allow this test to run
+ * through the module load, unload, and blacklist check API's. Doing
+ * so assumes that vfio-pci is present and available on your system
+ * and it's been placed on the blacklist. You must also run as root
+ * since the calls use /sbin/modprobe to load/unload a module.
+ *
+ * The load/unload tests should succeed and prove that libvirt wasn't
+ * checking for the blacklist.
+ *
+ * The use blacklist test follows the logic in virPCIProbeStubDriver()
+ * where an attempt to load a blacklist driver will result in the load
+ * appearing to succeed, but then finding the driver on the blacklist.
+ *
+ * To place 'vfio-pci' on the blacklist for a Fedora system create
+ * "/etc/modparams.d/blacklist-vfio-pci.conf" and within the file
+ * add the line "blacklist vfio-pci".
+ */
+# define MODPROBE_CONFIG_VFIO_PCI 0
+
+static int
+testModprobeConfig(const void *args ATTRIBUTE_UNUSED)
+{
+    int ret = -1;
+    char *outbuf = NULL;
+
+    /* This will return the contents of a 'modprobe -c' which can differ
+     * from machine to machine - be happy that we get something.
+     */
+    outbuf = virModprobeConfig();
+    if (!outbuf) {
+        fprintf(stderr, "Failed to get config\n");
+        goto cleanup;
+    }
+    ret = 0;
+
+cleanup:
+    VIR_FREE(outbuf);
+    return ret;
+}
+
+
+# if MODPROBE_CONFIG_VFIO_PCI
+static int
+testModprobeLoad(const void *args)
+{
+    int ret = -1;
+    char *errbuf = NULL;
+    const char *module = args;
+
+    errbuf = virModprobeLoad(module);
+    if (errbuf) {
+        fprintf(stderr, "Failed to load, error: %s\n", errbuf);
+        goto cleanup;
+    }
+
+    ret = 0;
+
+cleanup:
+    VIR_FREE(errbuf);
+    return ret;
+}
+
+
+static int
+testModprobeUnload(const void *args)
+{
+    int ret = -1;
+    char *errbuf = NULL;
+    const char *module = args;
+
+    errbuf = virModprobeUnload(module);
+    if (errbuf) {
+        fprintf(stderr, "Failed to unload, error: %s\n", errbuf);
+        goto cleanup;
+    }
+
+    ret = 0;
+
+cleanup:
+    VIR_FREE(errbuf);
+    return ret;
+}
+
+
+static int
+testModprobeUseBlacklist(const void *args)
+{
+    int ret = -1;
+    size_t i;
+    char *outbuf = NULL;
+    char *errbuf = NULL;
+    char *drvblklst = NULL;
+    const char *module = args;
+
+    errbuf = virModprobeUseBlacklist(module);
+    if (errbuf) {
+        fprintf(stderr, "Failed to load, error: %s\n", errbuf);
+        goto cleanup;
+    }
+
+    /* All error path code - purpose is to determine whether the failure
+     * occurs because device is on blacklist in order to add an error
+     * message to help detect why load failed
+     */
+    if (virAsprintf(&drvblklst, "blacklist %s", module) < 0)
+        goto cleanup;
+
+    /* modprobe will convert all '-' into '_', so we need to as well */
+    for (i = 0; i < drvblklst[i]; i++)
+        if (drvblklst[i] == '-')
+            drvblklst[i] = '_';
+
+    outbuf = virModprobeConfig();
+    if (!outbuf)
+        goto cleanup;
+
+    /* Find module on blacklist? */
+    if (!strstr(outbuf, drvblklst)) {
+        fprintf(stderr, "Failed to find %s on blacklist\n", module);
+        goto cleanup;
+    }
+
+    ret = 0;
+
+cleanup:
+    VIR_FREE(drvblklst);
+    VIR_FREE(outbuf);
+    VIR_FREE(errbuf);
+    if (ret == -1) {
+        errbuf = virModprobeUnload(module);
+        if (errbuf)
+            fprintf(stderr, "Failed to unload, error: %s\n", errbuf);
+        VIR_FREE(errbuf);
+    }
+    return ret;
+}
+# endif /* MODPROBE_CONFIG_VFIO_PCI*/
+
+
+static int
+mymain(void)
+{
+    int ret = 0;
+# if MODPROBE_CONFIG_VFIO_PCI
+    const char *module = "vfio-pci";
+# endif
+
+    if (virtTestRun("modprobe config", testModprobeConfig, NULL) < 0)
+        ret = -1;
+# if MODPROBE_CONFIG_VFIO_PCI
+    if (virtTestRun("modprobe load", testModprobeLoad, module) < 0)
+        ret = -1;
+    if (virtTestRun("modprobe unload", testModprobeUnload, module) < 0)
+        ret = -1;
+    if (virtTestRun("modprobe blacklist", testModprobeUseBlacklist, module) < 0)
+        ret = -1;
+# endif /* MODPROBE_CONFIG_VFIO_PCI */
+
+    return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;
+
+}
+
+VIRT_TEST_MAIN(mymain);
+#else
+int
+main(void)
+{
+    return EXIT_AM_SKIP;
+}
+#endif
-- 
1.8.4.2




More information about the libvir-list mailing list