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