From 94bf0b8fd2a5fbda430476b8cea2246df0fbc3ed Mon Sep 17 00:00:00 2001 Message-Id: <94bf0b8fd2a5fbda430476b8cea2246df0fbc3ed.1391615407.git.jdenemar@redhat.com> From: John Ferlan Date: Tue, 4 Feb 2014 13:34:54 -0500 Subject: [PATCH] tests: Add test for new virkmod functions https://bugzilla.redhat.com/show_bug.cgi?id=1045124 Adding tests for new virKMod{Config|Load|Unload}() API's. A test for virKModIsBlacklisted() would require some setup which cannot be assumed. (cherry picked from commit 02bf6568f4aaa595336f70d697b65e7c4f1c37a7) Conflicts: tests/Makefile.am * Resolved conflict by removing the virnetdevbandwidthtest references * Also needed to add "1" as second parameter to virtTestRun() in order to get things to complile/check Signed-off-by: John Ferlan Signed-off-by: Jiri Denemark --- .gitignore | 1 + tests/Makefile.am | 5 ++ tests/virkmodtest.c | 183 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 189 insertions(+) create mode 100644 tests/virkmodtest.c diff --git a/tests/Makefile.am b/tests/Makefile.am index 4141c47..2ec8ffb 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -133,6 +133,7 @@ test_programs = virshtest sockettest \ virstoragetest \ fdstreamtest \ fchosttest \ + virkmodtest \ $(NULL) if WITH_DBUS @@ -580,6 +581,10 @@ commandhelper_SOURCES = \ commandhelper_LDADD = $(LDADDS) commandhelper_LDFLAGS = -static +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..6569468 --- /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", 1, 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, 1, _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 -- 1.8.5.3