On 01/30/2014 12:50 PM, John Ferlan wrote:
Adding tests for new virKMod{Config|Load|Unload}() API's.
A test for virKModIsBlacklisted() would require some setup which cannot
be assumed.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
.gitignore | 2 +
<...snip...>
diff --git a/tests/virkmodtest.c b/tests/virkmodtest.c
new file mode 100644
index 0000000..6225a9e
--- /dev/null
+++ b/tests/virkmodtest.c
@@ -0,0 +1,183 @@
+/*
+ * 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 "vircommand.h"
+# include "virkmod.h"
+# include "virstring.h"
+
+struct testInfo {
+ const char *module;
+ const char *exp_cmd;
+ bool useBlacklist;
+};
+
+# define VIR_FROM_THIS VIR_FROM_NONE
+
+static int
+testKModConfig(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 = virKModConfig();
+ if (!outbuf) {
+ fprintf(stderr, "Failed to get config\n");
+ goto cleanup;
+ }
+ ret = 0;
+
+cleanup:
+ VIR_FREE(outbuf);
+ return ret;
+}
+
+
+static int
+checkOutput(virBufferPtr buf, const char *exp_cmd)
+{
+ int ret = -1;
+ char *actual_cmd = NULL;
+
+ if (!(actual_cmd = virBufferContentAndReset(buf))) {
+ int err = virBufferError(buf);
+ if (err)
+ fprintf(stderr, "buffer's in error state: %d", err);
+ else
+ fprintf(stderr, "cannot compare buffer to exp: %s", exp_cmd);
+ goto cleanup;
+ }
+
+ if (STRNEQ(exp_cmd, actual_cmd)) {
+ virtTestDifference(stderr, exp_cmd, actual_cmd);
+ goto cleanup;
+ }
+
+ ret = 0;
+
+cleanup:
+ VIR_FREE(actual_cmd);
+ return ret;
+}
+
+
+static int
+testKModLoad(const void *args)
+{
+ int ret = -1;
+ char *errbuf = NULL;
+ const struct testInfo *info = args;
+ const char *module = info->module;
+ bool useBlacklist = info->useBlacklist;
+ virBuffer buf = VIR_BUFFER_INITIALIZER;
+
+ virCommandSetDryRun(&buf);
+
+ errbuf = virKModLoad(module, useBlacklist);
+ if (errbuf) {
+ fprintf(stderr, "Failed to load, error: %s\n", errbuf);
+ goto cleanup;
+ }
+
+ if (checkOutput(&buf, info->exp_cmd) < 0)
+ goto cleanup;
+
+ ret = 0;
+
+cleanup:
+ virCommandSetDryRun(NULL);
+ VIR_FREE(errbuf);
+ return ret;
+}
+
+
+static int
+testKModUnload(const void *args)
+{
+ int ret = -1;
+ char *errbuf = NULL;
+ const struct testInfo *info = args;
+ const char *module = info->module;
+ virBuffer buf = VIR_BUFFER_INITIALIZER;
+
+ virCommandSetDryRun(&buf);
+
+ errbuf = virKModUnload(module);
+ if (errbuf) {
+ fprintf(stderr, "Failed to unload, error: %s\n", errbuf);
+ goto cleanup;
+ }
+
+ if (checkOutput(&buf, info->exp_cmd) < 0)
+ goto cleanup;
+
+ ret = 0;
+
+cleanup:
+ virCommandSetDryRun(NULL);
+ VIR_FREE(errbuf);
+ return ret;
+}
+
+
+static int
+mymain(void)
+{
+ int ret = 0;
+
+ if (virtTestRun("config", testKModConfig, NULL) < 0)
+ ret = -1;
+
+ /* Although we cannot run the command on the host, we can compare
+ * the output of the created command against what we'd expect to be
+ * created. So let's at least do that.
+ */
+# define DO_TEST(_name, _cb, _blkflag, _exp_cmd) \
+ do { \
+ struct testInfo data = {.module = "vfio-pci", \
+ .exp_cmd = _exp_cmd, \
+ .useBlacklist = _blkflag}; \
+ if (virtTestRun(_name, _cb, &data) < 0) \
+ ret = -1; \
+ } while (0)
+
+ DO_TEST("load", testKModLoad, false, "/sbin/modprobe
vfio-pci\n");
+ DO_TEST("unload", testKModUnload, false, "/sbin/rmmod
vfio-pci\n");
+ DO_TEST("blklist", testKModLoad, true, "/sbin/modprobe -b
vfio-pci\n");
+
+ return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;
+
+}
+
+VIRT_TEST_MAIN(mymain);
+#else
+int
+main(void)
+{
+ return EXIT_AM_SKIP;
+}
+#endif
Considering :
http://www.redhat.com/archives/libvir-list/2014-January/msg01556.html
The following is squashed in:
diff --git a/tests/virkmodtest.c b/tests/virkmodtest.c
index 6225a9e..c6f5a72 100644
--- a/tests/virkmodtest.c
+++ b/tests/virkmodtest.c
@@ -165,9 +165,9 @@ mymain(void)
ret = -1; \
} while (0)
- DO_TEST("load", testKModLoad, false, "/sbin/modprobe
vfio-pci\n");
- DO_TEST("unload", testKModUnload, false, "/sbin/rmmod
vfio-pci\n");
- DO_TEST("blklist", testKModLoad, true, "/sbin/modprobe -b
vfio-pci\n");
+ DO_TEST("load", testKModLoad, false, MODPROBE " vfio-pci\n");
+ DO_TEST("unload", testKModUnload, false, RMMOD " vfio-pci\n");
+ DO_TEST("blklist", testKModLoad, true, MODPROBE " -b
vfio-pci\n");
return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;
John