[libvirt] [PATCH v3 2/3] tests: Add test for new virkmod functions
John Ferlan
jferlan at redhat.com
Fri Jan 31 15:01:27 UTC 2014
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 at redhat.com>
> ---
> .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
More information about the libvir-list
mailing list