mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 17:34:18 +03:00
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.
This commit is contained in:
parent
4a2179ea92
commit
02bf6568f4
1
.gitignore
vendored
1
.gitignore
vendored
@ -202,6 +202,7 @@
|
||||
/tests/viridentitytest
|
||||
/tests/virkeycodetest
|
||||
/tests/virkeyfiletest
|
||||
/tests/virkmodtest
|
||||
/tests/virlockspacetest
|
||||
/tests/virlogtest
|
||||
/tests/virnet*test
|
||||
|
@ -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 \
|
||||
|
183
tests/virkmodtest.c
Normal file
183
tests/virkmodtest.c
Normal file
@ -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, 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
|
Loading…
Reference in New Issue
Block a user