From 02bf6568f4aaa595336f70d697b65e7c4f1c37a7 Mon Sep 17 00:00:00 2001 From: John Ferlan Date: Wed, 29 Jan 2014 18:33:42 -0500 Subject: [PATCH] tests: Add test for new virkmod functions Adding tests for new virKMod{Config|Load|Unload}() API's. A test for virKModIsBlacklisted() would require some setup which cannot be assumed. --- .gitignore | 1 + tests/Makefile.am | 5 ++ tests/virkmodtest.c | 183 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 189 insertions(+) create mode 100644 tests/virkmodtest.c diff --git a/.gitignore b/.gitignore index a3d4eca4f9..757dfedd71 100644 --- a/.gitignore +++ b/.gitignore @@ -202,6 +202,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 91c385ec3a..30cdd1d70b 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -143,6 +143,7 @@ test_programs = virshtest sockettest \ sysinfotest \ virstoragetest \ virnetdevbandwidthtest \ + virkmodtest \ $(NULL) if WITH_REMOTE @@ -660,6 +661,10 @@ virnetdevbandwidthtest_SOURCES = \ virnetdevbandwidthtest.c testutils.h testutils.c virnetdevbandwidthtest_LDADD = $(LDADDS) $(LIBXML_LIBS) +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 0000000000..c6f5a728a0 --- /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 + * . + */ + +#include + +#include "testutils.h" + +#ifdef __linux__ + +# include +# 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, 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; + +} + +VIRT_TEST_MAIN(mymain); +#else +int +main(void) +{ + return EXIT_AM_SKIP; +} +#endif