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@xxxxxxxxxx> --- .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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list