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@xxxxxxxxxx> --- .gitignore | 2 + tests/Makefile.am | 5 ++ tests/virkmodtest.c | 183 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 190 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..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 -- 1.8.4.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list