From d90877f7eb9854e6ec2f7bd508fb0f4571639f2a Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Mon, 25 Apr 2016 14:20:58 +0200 Subject: [PATCH] tests: Refactor domaincapstest The test was just a big mess passing callbacks and their data through data for another callback. Signed-off-by: Jiri Denemark --- tests/domaincapstest.c | 176 ++++++++++++++++++++++------------------- 1 file changed, 93 insertions(+), 83 deletions(-) diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c index b6f6ac87f5..bfe66b4c7d 100644 --- a/tests/domaincapstest.c +++ b/tests/domaincapstest.c @@ -56,8 +56,7 @@ fillStringValues(virDomainCapsStringValuesPtr values, ...) } static int -fillAll(virDomainCapsPtr domCaps, - void *opaque ATTRIBUTE_UNUSED) +fillAllCaps(virDomainCapsPtr domCaps) { virDomainCapsOSPtr os = &domCaps->os; virDomainCapsLoaderPtr loader = &os->loader; @@ -90,26 +89,27 @@ fillAll(virDomainCapsPtr domCaps, } -#ifdef WITH_QEMU +#if WITH_QEMU # include "testutilsqemu.h" -struct fillQemuCapsData { - virQEMUCapsPtr qemuCaps; - virQEMUDriverConfigPtr cfg; -}; - static int fillQemuCaps(virDomainCapsPtr domCaps, - void *opaque) + const char *name, + virQEMUDriverConfigPtr cfg) { - struct fillQemuCapsData *data = (struct fillQemuCapsData *) opaque; - virQEMUCapsPtr qemuCaps = data->qemuCaps; - virQEMUDriverConfigPtr cfg = data->cfg; + int ret = -1; + char *path = NULL; + virQEMUCapsPtr qemuCaps = NULL; virDomainCapsLoaderPtr loader = &domCaps->os.loader; + if (virAsprintf(&path, "%s/qemucapabilitiesdata/%s.caps", + abs_srcdir, name) < 0 || + !(qemuCaps = qemuTestParseCapabilities(path))) + goto cleanup; + if (virQEMUCapsFillDomainCaps(domCaps, qemuCaps, cfg->loader, cfg->nloader) < 0) - return -1; + goto cleanup; /* The function above tries to query host's KVM & VFIO capabilities by * calling qemuHostdevHostSupportsPassthroughLegacy() and @@ -121,8 +121,8 @@ fillQemuCaps(virDomainCapsPtr domCaps, VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM, VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO); - /* Moreover, as of f05b6a918e28 we are expecting to see - * OVMF_CODE.fd file which may not exists everywhere. */ + /* As of f05b6a918e28 we are expecting to see OVMF_CODE.fd file which + * may not exists everywhere. */ while (loader->values.nvalues) VIR_FREE(loader->values.values[--loader->values.nvalues]); @@ -130,65 +130,68 @@ fillQemuCaps(virDomainCapsPtr domCaps, "/usr/share/AAVMF/AAVMF_CODE.fd", "/usr/share/OVMF/OVMF_CODE.fd", NULL) < 0) - return -1; - - return 0; -} -#endif /* WITH_QEMU */ - - -static virDomainCapsPtr -buildVirDomainCaps(const char *emulatorbin, - const char *machine, - virArch arch, - virDomainVirtType type, - virDomainCapsFill fillFunc, - void *opaque) -{ - virDomainCapsPtr domCaps, ret = NULL; - - if (!(domCaps = virDomainCapsNew(emulatorbin, machine, arch, type))) goto cleanup; - if (fillFunc && fillFunc(domCaps, opaque) < 0) { - virObjectUnref(domCaps); - domCaps = NULL; - } - - ret = domCaps; + ret = 0; cleanup: + virObjectUnref(qemuCaps); + VIR_FREE(path); return ret; } +#endif /* WITH_QEMU */ + + +enum testCapsType { + CAPS_NONE, + CAPS_ALL, + CAPS_QEMU, +}; -struct test_virDomainCapsFormatData { - const char *filename; - const char *emulatorbin; +struct testData { + const char *name; + const char *emulator; const char *machine; virArch arch; virDomainVirtType type; - virDomainCapsFill fillFunc; - void *opaque; + enum testCapsType capsType; + const char *capsName; + void *capsOpaque; }; static int test_virDomainCapsFormat(const void *opaque) { - struct test_virDomainCapsFormatData *data = - (struct test_virDomainCapsFormatData *) opaque; + const struct testData *data = opaque; virDomainCapsPtr domCaps = NULL; char *path = NULL; char *domCapsXML = NULL; int ret = -1; if (virAsprintf(&path, "%s/domaincapsschemadata/domaincaps-%s.xml", - abs_srcdir, data->filename) < 0) + abs_srcdir, data->name) < 0) goto cleanup; - if (!(domCaps = buildVirDomainCaps(data->emulatorbin, data->machine, - data->arch, data->type, - data->fillFunc, data->opaque))) + if (!(domCaps = virDomainCapsNew(data->emulator, data->machine, data->arch, + data->type))) goto cleanup; + switch (data->capsType) { + case CAPS_NONE: + break; + + case CAPS_ALL: + if (fillAllCaps(domCaps) < 0) + goto cleanup; + break; + + case CAPS_QEMU: +#if WITH_QEMU + if (fillQemuCaps(domCaps, data->capsName, data->capsOpaque) < 0) + goto cleanup; +#endif + break; + } + if (!(domCapsXML = virDomainCapsFormat(domCaps))) goto cleanup; @@ -208,47 +211,54 @@ mymain(void) { int ret = 0; -#define DO_TEST(Filename, Emulatorbin, Machine, Arch, Type, ...) \ - do { \ - struct test_virDomainCapsFormatData data = {.filename = Filename, \ - .emulatorbin = Emulatorbin, .machine = Machine, .arch = Arch, \ - .type = Type, __VA_ARGS__}; \ - if (virtTestRun(Filename, test_virDomainCapsFormat, &data) < 0) \ - ret = -1; \ - } while (0) - - DO_TEST("basic", "/bin/emulatorbin", "my-machine-type", - VIR_ARCH_X86_64, VIR_DOMAIN_VIRT_UML); - DO_TEST("full", "/bin/emulatorbin", "my-machine-type", - VIR_ARCH_X86_64, VIR_DOMAIN_VIRT_KVM, .fillFunc = fillAll); - -#ifdef WITH_QEMU - +#if WITH_QEMU virQEMUDriverConfigPtr cfg = virQEMUDriverConfigNew(false); if (!cfg) return EXIT_FAILURE; +#endif + +#define DO_TEST(Name, Emulator, Machine, Arch, Type, CapsType) \ + do { \ + struct testData data = { \ + .name = Name, \ + .emulator = Emulator, \ + .machine = Machine, \ + .arch = Arch, \ + .type = Type, \ + .capsType = CapsType, \ + }; \ + if (virtTestRun(Name, test_virDomainCapsFormat, &data) < 0) \ + ret = -1; \ + } while (0) -# define DO_TEST_QEMU(Filename, QemuCapsFile, Emulatorbin, Machine, Arch, Type, ...) \ - do { \ - const char *capsPath = abs_srcdir "/qemucapabilitiesdata/" QemuCapsFile ".caps"; \ - virQEMUCapsPtr qemuCaps = qemuTestParseCapabilities(capsPath); \ - struct fillQemuCapsData fillData = {.qemuCaps = qemuCaps, .cfg = cfg}; \ - struct test_virDomainCapsFormatData data = {.filename = Filename, \ - .emulatorbin = Emulatorbin, .machine = Machine, .arch = Arch, \ - .type = Type, .fillFunc = fillQemuCaps, .opaque = &fillData}; \ - if (!qemuCaps) { \ - fprintf(stderr, "Unable to build qemu caps from %s\n", capsPath); \ - ret = -1; \ - } else if (virtTestRun(Filename, test_virDomainCapsFormat, &data) < 0) \ - ret = -1; \ - virObjectUnref(qemuCaps); \ +#define DO_TEST_QEMU(Name, CapsName, Emulator, Machine, Arch, Type) \ + do { \ + struct testData data = { \ + .name = Name, \ + .emulator = Emulator, \ + .machine = Machine, \ + .arch = Arch, \ + .type = Type, \ + .capsType = CAPS_QEMU, \ + .capsName = CapsName, \ + .capsOpaque = cfg, \ + }; \ + if (virtTestRun(Name, test_virDomainCapsFormat, &data) < 0) \ + ret = -1; \ } while (0) - DO_TEST_QEMU("qemu_1.6.50-1", "caps_1.6.50-1", "/usr/bin/qemu-system-x86_64", - "pc-1.2", VIR_ARCH_X86_64, VIR_DOMAIN_VIRT_KVM); + DO_TEST("basic", "/bin/emulatorbin", "my-machine-type", + VIR_ARCH_X86_64, VIR_DOMAIN_VIRT_UML, CAPS_NONE); + DO_TEST("full", "/bin/emulatorbin", "my-machine-type", + VIR_ARCH_X86_64, VIR_DOMAIN_VIRT_KVM, CAPS_ALL); + +#if WITH_QEMU + + DO_TEST_QEMU("qemu_1.6.50-1", "caps_1.6.50-1", + "/usr/bin/qemu-system-x86_64", "pc-1.2", VIR_ARCH_X86_64, + VIR_DOMAIN_VIRT_KVM); - virObjectUnref(cfg); #endif /* WITH_QEMU */ return ret; -- GitLab