[libvirt] [PATCH 00/12] tests/domaincaps: Use testQemuCapsIterate()

I finally got annoyed enough by the fact that this test program, unlike qemucapabilitiestest and qemucaps2xmltest, is not self-maintaining. The series, as posted to the list, is heavily snipped: grab the full version with $ git fetch https://gitlab.com/abologna/libvirt.git domaincapstest Andrea Bolognani (12): tests/qemucapabilities: Separate inputDir and outputDir tests: testQemuCapsIterate: Don't ignore malformed file names tests: testQemuCapsIterate: Validate suffix tests: testQemuCapsIterate: Pass inputDir to callback tests: testQemuCapsIterate: Pass suffix to callback tests: testQemuCapsIterate: Pass prefix and version to callback tests: Rename domaincapsschemadata/ -> domaincapsdata/ tests/domaincaps: Don't mess with test name tests/domaincaps: Move most of DO_TEST_QEMU() into a function tests/domaincaps: Don't require redundant information tests/domaincaps: Make test matrix programmatic tests/domaincaps: Use testQemuCapsIterate() tests/Makefile.am | 2 +- .../bhyve_basic.x86_64.xml | 0 .../bhyve_fbuf.x86_64.xml | 0 .../bhyve_uefi.x86_64.xml | 0 .../empty.xml | 0 .../libxl-xenfv.xml | 0 .../libxl-xenpv.xml | 0 .../qemu_1.5.3-q35.x86_64.xml} | 4 +- .../qemu_1.5.3-tcg.x86_64.xml} | 6 +- .../qemu_1.5.3.x86_64.xml} | 2 +- .../qemu_1.6.0-q35.x86_64.xml} | 4 +- .../qemu_1.6.0-tcg.x86_64.xml} | 6 +- .../qemu_1.6.0.x86_64.xml} | 2 +- .../qemu_1.7.0-q35.x86_64.xml} | 4 +- .../qemu_1.7.0-tcg.x86_64.xml} | 4 +- .../qemu_1.7.0.x86_64.xml | 0 .../qemu_2.1.1-q35.x86_64.xml} | 7 +- .../qemu_2.1.1-tcg.x86_64.xml} | 9 +- .../qemu_2.1.1.x86_64.xml} | 5 +- .../qemu_2.10.0-q35.x86_64.xml} | 21 +- .../qemu_2.10.0-tcg.x86_64.xml} | 3 +- .../qemu_2.10.0-virt.aarch64.xml} | 3 +- .../qemu_2.10.0.aarch64.xml} | 1 + .../qemu_2.10.0.ppc64.xml} | 2 +- .../qemu_2.10.0.s390x.xml} | 110 ++++----- .../qemu_2.10.0.x86_64.xml} | 21 +- .../qemu_2.11.0-q35.x86_64.xml} | 7 +- .../qemu_2.11.0-tcg.x86_64.xml} | 34 ++- .../qemu_2.11.0.s390x.xml} | 11 +- .../qemu_2.11.0.x86_64.xml} | 7 +- .../qemu_2.12.0-q35.x86_64.xml} | 6 +- .../qemu_2.12.0-tcg.x86_64.xml} | 50 ++-- .../qemu_2.12.0-virt.aarch64.xml | 0 .../qemu_2.12.0.aarch64.xml} | 5 +- .../qemu_2.12.0.ppc64.xml | 0 .../qemu_2.12.0.s390x.xml | 0 .../qemu_2.12.0.x86_64.xml | 0 .../qemu_2.4.0-q35.x86_64.xml} | 4 +- .../qemu_2.4.0-tcg.x86_64.xml} | 6 +- .../qemu_2.4.0.x86_64.xml} | 2 +- .../qemu_2.5.0-q35.x86_64.xml} | 4 +- .../qemu_2.5.0-tcg.x86_64.xml} | 6 +- .../qemu_2.5.0.x86_64.xml} | 2 +- .../qemu_2.6.0-q35.x86_64.xml} | 4 +- .../qemu_2.6.0-tcg.x86_64.xml} | 4 +- .../qemu_2.6.0-virt.aarch64.xml | 0 .../qemu_2.6.0.aarch64.xml | 0 .../qemu_2.6.0.ppc64.xml | 0 .../qemu_2.6.0.x86_64.xml | 0 .../qemu_2.7.0-q35.x86_64.xml} | 5 +- .../qemu_2.7.0-tcg.x86_64.xml} | 7 +- .../qemu_2.7.0.s390x.xml | 0 .../qemu_2.7.0.x86_64.xml} | 3 +- .../qemu_2.8.0-q35.x86_64.xml} | 6 +- .../qemu_2.8.0-tcg.x86_64.xml | 0 .../qemu_2.8.0.s390x.xml | 0 .../qemu_2.8.0.x86_64.xml | 0 .../qemu_2.9.0-q35.x86_64.xml | 0 .../qemu_2.9.0-tcg.x86_64.xml | 0 .../qemu_2.9.0.ppc64.xml} | 2 +- .../qemu_2.9.0.s390x.xml} | 7 +- .../qemu_2.9.0.x86_64.xml | 0 .../qemu_3.0.0-q35.x86_64.xml} | 11 +- .../qemu_3.0.0-tcg.x86_64.xml} | 52 +++-- .../qemu_3.0.0.ppc64.xml} | 3 +- .../qemu_3.0.0.s390x.xml | 0 .../qemu_3.0.0.x86_64.xml} | 7 +- .../qemu_3.1.0-q35.x86_64.xml} | 6 +- .../qemu_3.1.0-tcg.x86_64.xml} | 55 +++-- .../qemu_3.1.0.ppc64.xml} | 3 +- .../qemu_3.1.0.x86_64.xml | 0 .../qemu_4.0.0-q35.x86_64.xml} | 6 +- .../qemu_4.0.0-tcg.x86_64.xml} | 55 +++-- .../qemu_4.0.0-virt.aarch64.xml} | 16 +- .../qemu_4.0.0.aarch64.xml} | 2 +- .../qemu_4.0.0.ppc64.xml} | 2 +- .../qemu_4.0.0.s390x.xml | 0 .../qemu_4.0.0.x86_64.xml | 0 .../qemu_4.1.0-q35.x86_64.xml} | 6 +- .../qemu_4.1.0-tcg.x86_64.xml} | 59 +++-- .../qemu_4.1.0.x86_64.xml | 0 .../qemu_4.2.0-q35.x86_64.xml} | 6 +- .../qemu_4.2.0-tcg.x86_64.xml} | 59 +++-- .../qemu_4.2.0-virt.aarch64.xml} | 14 +- .../qemu_4.2.0.aarch64.xml | 0 .../qemu_4.2.0.ppc64.xml | 0 .../qemu_4.2.0.x86_64.xml | 0 tests/domaincapstest.c | 221 ++++++++---------- .../caps_1.5.3.x86_64.xml | 2 +- .../caps_1.6.0.x86_64.xml | 2 +- .../caps_1.7.0.x86_64.xml | 2 +- .../caps_2.1.1.x86_64.xml | 2 +- .../caps_2.10.0.aarch64.xml | 2 +- .../caps_2.10.0.ppc64.xml | 2 +- .../caps_2.10.0.s390x.xml | 2 +- .../caps_2.10.0.x86_64.xml | 2 +- .../caps_2.11.0.s390x.xml | 2 +- .../caps_2.11.0.x86_64.xml | 2 +- .../caps_2.12.0.aarch64.xml | 2 +- .../caps_2.12.0.ppc64.xml | 2 +- .../caps_2.12.0.s390x.xml | 2 +- .../caps_2.12.0.x86_64.xml | 2 +- .../caps_2.4.0.x86_64.xml | 2 +- .../caps_2.5.0.x86_64.xml | 2 +- .../caps_2.6.0.aarch64.xml | 2 +- .../qemucapabilitiesdata/caps_2.6.0.ppc64.xml | 2 +- .../caps_2.6.0.x86_64.xml | 2 +- .../qemucapabilitiesdata/caps_2.7.0.s390x.xml | 2 +- .../caps_2.7.0.x86_64.xml | 2 +- .../qemucapabilitiesdata/caps_2.8.0.s390x.xml | 2 +- .../caps_2.8.0.x86_64.xml | 2 +- .../qemucapabilitiesdata/caps_2.9.0.ppc64.xml | 2 +- .../qemucapabilitiesdata/caps_2.9.0.s390x.xml | 2 +- .../caps_2.9.0.x86_64.xml | 2 +- .../qemucapabilitiesdata/caps_3.0.0.ppc64.xml | 2 +- .../qemucapabilitiesdata/caps_3.0.0.s390x.xml | 2 +- .../caps_3.0.0.x86_64.xml | 2 +- .../qemucapabilitiesdata/caps_3.1.0.ppc64.xml | 2 +- .../caps_3.1.0.x86_64.xml | 2 +- .../caps_4.0.0.aarch64.xml | 2 +- .../qemucapabilitiesdata/caps_4.0.0.ppc64.xml | 2 +- .../qemucapabilitiesdata/caps_4.0.0.s390x.xml | 2 +- .../caps_4.0.0.x86_64.xml | 2 +- .../caps_4.1.0.x86_64.xml | 2 +- .../caps_4.2.0.aarch64.xml | 2 +- .../qemucapabilitiesdata/caps_4.2.0.ppc64.xml | 2 +- .../caps_4.2.0.x86_64.xml | 2 +- tests/qemucapabilitiestest.c | 40 ++-- tests/qemucaps2xmltest.c | 22 +- tests/testutilsqemu.c | 41 +++- tests/testutilsqemu.h | 5 +- tests/virschematest.c | 2 +- 132 files changed, 645 insertions(+), 524 deletions(-) rename tests/{domaincapsschemadata => domaincapsdata}/bhyve_basic.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/bhyve_fbuf.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/bhyve_uefi.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/empty.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/libxl-xenfv.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/libxl-xenpv.xml (100%) copy tests/{domaincapsschemadata/qemu_1.7.0.x86_64.xml => domaincapsdata/qemu_1.5.3-q35.x86_64.xml} (98%) copy tests/{domaincapsschemadata/qemu_1.7.0.x86_64.xml => domaincapsdata/qemu_1.5.3-tcg.x86_64.xml} (97%) copy tests/{domaincapsschemadata/qemu_1.7.0.x86_64.xml => domaincapsdata/qemu_1.5.3.x86_64.xml} (99%) copy tests/{domaincapsschemadata/qemu_1.7.0.x86_64.xml => domaincapsdata/qemu_1.6.0-q35.x86_64.xml} (98%) copy tests/{domaincapsschemadata/qemu_1.7.0.x86_64.xml => domaincapsdata/qemu_1.6.0-tcg.x86_64.xml} (97%) copy tests/{domaincapsschemadata/qemu_1.7.0.x86_64.xml => domaincapsdata/qemu_1.6.0.x86_64.xml} (99%) copy tests/{domaincapsschemadata/qemu_1.7.0.x86_64.xml => domaincapsdata/qemu_1.7.0-q35.x86_64.xml} (98%) copy tests/{domaincapsschemadata/qemu_1.7.0.x86_64.xml => domaincapsdata/qemu_1.7.0-tcg.x86_64.xml} (98%) copy tests/{domaincapsschemadata => domaincapsdata}/qemu_1.7.0.x86_64.xml (100%) copy tests/{domaincapsschemadata/qemu_1.7.0.x86_64.xml => domaincapsdata/qemu_2.1.1-q35.x86_64.xml} (96%) copy tests/{domaincapsschemadata/qemu_1.7.0.x86_64.xml => domaincapsdata/qemu_2.1.1-tcg.x86_64.xml} (95%) rename tests/{domaincapsschemadata/qemu_1.7.0.x86_64.xml => domaincapsdata/qemu_2.1.1.x86_64.xml} (97%) copy tests/{domaincapsschemadata/qemu_2.9.0-q35.x86_64.xml => domaincapsdata/qemu_2.10.0-q35.x86_64.xml} (87%) copy tests/{domaincapsschemadata/qemu_2.9.0-tcg.x86_64.xml => domaincapsdata/qemu_2.10.0-tcg.x86_64.xml} (98%) copy tests/{domaincapsschemadata/qemu_2.6.0-virt.aarch64.xml => domaincapsdata/qemu_2.10.0-virt.aarch64.xml} (98%) copy tests/{domaincapsschemadata/qemu_2.6.0.aarch64.xml => domaincapsdata/qemu_2.10.0.aarch64.xml} (98%) copy tests/{domaincapsschemadata/qemu_2.12.0.ppc64.xml => domaincapsdata/qemu_2.10.0.ppc64.xml} (98%) copy tests/{domaincapsschemadata/qemu_2.12.0.s390x.xml => domaincapsdata/qemu_2.10.0.s390x.xml} (96%) copy tests/{domaincapsschemadata/qemu_2.9.0.x86_64.xml => domaincapsdata/qemu_2.10.0.x86_64.xml} (87%) copy tests/{domaincapsschemadata/qemu_2.9.0-q35.x86_64.xml => domaincapsdata/qemu_2.11.0-q35.x86_64.xml} (95%) copy tests/{domaincapsschemadata/qemu_2.9.0-tcg.x86_64.xml => domaincapsdata/qemu_2.11.0-tcg.x86_64.xml} (84%) copy tests/{domaincapsschemadata/qemu_2.12.0.s390x.xml => domaincapsdata/qemu_2.11.0.s390x.xml} (97%) copy tests/{domaincapsschemadata/qemu_2.9.0.x86_64.xml => domaincapsdata/qemu_2.11.0.x86_64.xml} (95%) copy tests/{domaincapsschemadata/qemu_2.12.0.x86_64.xml => domaincapsdata/qemu_2.12.0-q35.x86_64.xml} (98%) copy tests/{domaincapsschemadata/qemu_2.9.0-tcg.x86_64.xml => domaincapsdata/qemu_2.12.0-tcg.x86_64.xml} (78%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.12.0-virt.aarch64.xml (100%) copy tests/{domaincapsschemadata/qemu_2.6.0.aarch64.xml => domaincapsdata/qemu_2.12.0.aarch64.xml} (95%) copy tests/{domaincapsschemadata => domaincapsdata}/qemu_2.12.0.ppc64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.12.0.s390x.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.12.0.x86_64.xml (100%) copy tests/{domaincapsschemadata/qemu_2.6.0.x86_64.xml => domaincapsdata/qemu_2.4.0-q35.x86_64.xml} (98%) copy tests/{domaincapsschemadata/qemu_2.6.0.x86_64.xml => domaincapsdata/qemu_2.4.0-tcg.x86_64.xml} (97%) copy tests/{domaincapsschemadata/qemu_2.6.0.x86_64.xml => domaincapsdata/qemu_2.4.0.x86_64.xml} (99%) copy tests/{domaincapsschemadata/qemu_2.6.0.x86_64.xml => domaincapsdata/qemu_2.5.0-q35.x86_64.xml} (98%) copy tests/{domaincapsschemadata/qemu_2.6.0.x86_64.xml => domaincapsdata/qemu_2.5.0-tcg.x86_64.xml} (97%) copy tests/{domaincapsschemadata/qemu_2.6.0.x86_64.xml => domaincapsdata/qemu_2.5.0.x86_64.xml} (99%) copy tests/{domaincapsschemadata/qemu_2.6.0.x86_64.xml => domaincapsdata/qemu_2.6.0-q35.x86_64.xml} (98%) copy tests/{domaincapsschemadata/qemu_2.6.0.x86_64.xml => domaincapsdata/qemu_2.6.0-tcg.x86_64.xml} (98%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.6.0-virt.aarch64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.6.0.aarch64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.6.0.ppc64.xml (100%) copy tests/{domaincapsschemadata => domaincapsdata}/qemu_2.6.0.x86_64.xml (100%) copy tests/{domaincapsschemadata/qemu_2.6.0.x86_64.xml => domaincapsdata/qemu_2.7.0-q35.x86_64.xml} (97%) copy tests/{domaincapsschemadata/qemu_2.6.0.x86_64.xml => domaincapsdata/qemu_2.7.0-tcg.x86_64.xml} (96%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.7.0.s390x.xml (100%) rename tests/{domaincapsschemadata/qemu_2.6.0.x86_64.xml => domaincapsdata/qemu_2.7.0.x86_64.xml} (97%) copy tests/{domaincapsschemadata/qemu_2.8.0.x86_64.xml => domaincapsdata/qemu_2.8.0-q35.x86_64.xml} (98%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.8.0-tcg.x86_64.xml (100%) copy tests/{domaincapsschemadata => domaincapsdata}/qemu_2.8.0.s390x.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.8.0.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.9.0-q35.x86_64.xml (100%) copy tests/{domaincapsschemadata => domaincapsdata}/qemu_2.9.0-tcg.x86_64.xml (100%) copy tests/{domaincapsschemadata/qemu_2.12.0.ppc64.xml => domaincapsdata/qemu_2.9.0.ppc64.xml} (98%) rename tests/{domaincapsschemadata/qemu_2.8.0.s390x.xml => domaincapsdata/qemu_2.9.0.s390x.xml} (97%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.9.0.x86_64.xml (100%) copy tests/{domaincapsschemadata/qemu_4.0.0.x86_64.xml => domaincapsdata/qemu_3.0.0-q35.x86_64.xml} (95%) copy tests/{domaincapsschemadata/qemu_2.9.0-tcg.x86_64.xml => domaincapsdata/qemu_3.0.0-tcg.x86_64.xml} (78%) rename tests/{domaincapsschemadata/qemu_2.12.0.ppc64.xml => domaincapsdata/qemu_3.0.0.ppc64.xml} (97%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_3.0.0.s390x.xml (100%) copy tests/{domaincapsschemadata/qemu_4.0.0.x86_64.xml => domaincapsdata/qemu_3.0.0.x86_64.xml} (95%) copy tests/{domaincapsschemadata/qemu_3.1.0.x86_64.xml => domaincapsdata/qemu_3.1.0-q35.x86_64.xml} (98%) copy tests/{domaincapsschemadata/qemu_2.9.0-tcg.x86_64.xml => domaincapsdata/qemu_3.1.0-tcg.x86_64.xml} (77%) copy tests/{domaincapsschemadata/qemu_4.2.0.ppc64.xml => domaincapsdata/qemu_3.1.0.ppc64.xml} (97%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_3.1.0.x86_64.xml (100%) copy tests/{domaincapsschemadata/qemu_4.0.0.x86_64.xml => domaincapsdata/qemu_4.0.0-q35.x86_64.xml} (98%) copy tests/{domaincapsschemadata/qemu_2.9.0-tcg.x86_64.xml => domaincapsdata/qemu_4.0.0-tcg.x86_64.xml} (77%) copy tests/{domaincapsschemadata/qemu_4.2.0.aarch64.xml => domaincapsdata/qemu_4.0.0-virt.aarch64.xml} (95%) copy tests/{domaincapsschemadata/qemu_4.2.0.aarch64.xml => domaincapsdata/qemu_4.0.0.aarch64.xml} (100%) copy tests/{domaincapsschemadata/qemu_4.2.0.ppc64.xml => domaincapsdata/qemu_4.0.0.ppc64.xml} (98%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_4.0.0.s390x.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_4.0.0.x86_64.xml (100%) copy tests/{domaincapsschemadata/qemu_4.1.0.x86_64.xml => domaincapsdata/qemu_4.1.0-q35.x86_64.xml} (98%) copy tests/{domaincapsschemadata/qemu_2.9.0-tcg.x86_64.xml => domaincapsdata/qemu_4.1.0-tcg.x86_64.xml} (75%) copy tests/{domaincapsschemadata => domaincapsdata}/qemu_4.1.0.x86_64.xml (100%) rename tests/{domaincapsschemadata/qemu_4.1.0.x86_64.xml => domaincapsdata/qemu_4.2.0-q35.x86_64.xml} (98%) rename tests/{domaincapsschemadata/qemu_2.9.0-tcg.x86_64.xml => domaincapsdata/qemu_4.2.0-tcg.x86_64.xml} (75%) copy tests/{domaincapsschemadata/qemu_4.2.0.aarch64.xml => domaincapsdata/qemu_4.2.0-virt.aarch64.xml} (95%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_4.2.0.aarch64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_4.2.0.ppc64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_4.2.0.x86_64.xml (100%) -- 2.21.0

We'll need this later. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- tests/qemucapabilitiestest.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/qemucapabilitiestest.c b/tests/qemucapabilitiestest.c index a9a1e75587..bb4ce74a29 100644 --- a/tests/qemucapabilitiestest.c +++ b/tests/qemucapabilitiestest.c @@ -35,7 +35,8 @@ typedef struct _testQemuData testQemuData; typedef testQemuData *testQemuDataPtr; struct _testQemuData { virQEMUDriver driver; - const char *dataDir; + const char *inputDir; + const char *outputDir; const char *archName; const char *base; int ret; @@ -48,7 +49,8 @@ testQemuDataInit(testQemuDataPtr data) if (qemuTestDriverInit(&data->driver) < 0) return -1; - data->dataDir = TEST_QEMU_CAPS_PATH; + data->inputDir = TEST_QEMU_CAPS_PATH; + data->outputDir = TEST_QEMU_CAPS_PATH; data->ret = 0; @@ -77,9 +79,9 @@ testQemuCaps(const void *opaque) const char *p; if (virAsprintf(&repliesFile, "%s/%s.%s.replies", - data->dataDir, data->base, data->archName) < 0 || + data->inputDir, data->base, data->archName) < 0 || virAsprintf(&capsFile, "%s/%s.%s.xml", - data->dataDir, data->base, data->archName) < 0) + data->outputDir, data->base, data->archName) < 0) goto cleanup; if (!(mon = qemuMonitorTestNewFromFileFull(repliesFile, &data->driver, NULL, @@ -146,7 +148,7 @@ testQemuCapsCopy(const void *opaque) char *actual = NULL; if (virAsprintf(&capsFile, "%s/%s.%s.xml", - data->dataDir, data->base, data->archName) < 0) + data->outputDir, data->base, data->archName) < 0) goto cleanup; if (!(caps = virCapabilitiesNew(virArchFromString(data->archName), -- 2.21.0

If files whose name doesn't follow the expected format are added to the repository, it's better to make the test suite fail than to silently ignore them. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- tests/testutilsqemu.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index 0faa9cb84a..7a2ea3bf4e 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -910,7 +910,7 @@ testQemuCapsIterate(const char *suffix, goto cleanup; while ((rc = virDirRead(dir, &ent, TEST_QEMU_CAPS_PATH)) > 0) { - char *tmp = ent->d_name; + g_autofree char *tmp = g_strdup(ent->d_name); char *base = NULL; char *archName = NULL; @@ -918,9 +918,11 @@ testQemuCapsIterate(const char *suffix, if (!virStringStripSuffix(tmp, suffix)) continue; - /* Find the last dot, moving on if none is present */ - if (!(archName = strrchr(tmp, '.'))) - continue; + /* Find the last dot */ + if (!(archName = strrchr(tmp, '.'))) { + VIR_TEST_VERBOSE("malformed file name '%s'", ent->d_name); + goto cleanup; + } /* The base name is everything before the last dot, and * the architecture name everything after it */ -- 2.21.0

We're going to depend on the fact that the suffix starts with a dot later on, so we better ensure that it does. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- tests/testutilsqemu.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index 7a2ea3bf4e..c602255149 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -906,6 +906,12 @@ testQemuCapsIterate(const char *suffix, if (!callback) return 0; + /* Validate suffix */ + if (!STRPREFIX(suffix, ".")) { + VIR_TEST_VERBOSE("malformed suffix '%s'", suffix); + goto cleanup; + } + if (virDirOpen(&dir, TEST_QEMU_CAPS_PATH) < 0) goto cleanup; -- 2.21.0

Right now users need to know input file live inside TEST_QEMU_CAPS_PATH, which is bad layering. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- tests/qemucapabilitiestest.c | 5 +++-- tests/qemucaps2xmltest.c | 5 +++-- tests/testutilsqemu.c | 2 +- tests/testutilsqemu.h | 3 ++- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/qemucapabilitiestest.c b/tests/qemucapabilitiestest.c index bb4ce74a29..6b8d2676e3 100644 --- a/tests/qemucapabilitiestest.c +++ b/tests/qemucapabilitiestest.c @@ -49,7 +49,6 @@ testQemuDataInit(testQemuDataPtr data) if (qemuTestDriverInit(&data->driver) < 0) return -1; - data->inputDir = TEST_QEMU_CAPS_PATH; data->outputDir = TEST_QEMU_CAPS_PATH; data->ret = 0; @@ -180,7 +179,8 @@ testQemuCapsCopy(const void *opaque) static int -doCapsTest(const char *base, +doCapsTest(const char *inputDir, + const char *base, const char *archName, void *opaque) { @@ -193,6 +193,7 @@ doCapsTest(const char *base, return -1; } + data->inputDir = inputDir; data->base = base; data->archName = archName; diff --git a/tests/qemucaps2xmltest.c b/tests/qemucaps2xmltest.c index f5aecaa391..8985b20ac6 100644 --- a/tests/qemucaps2xmltest.c +++ b/tests/qemucaps2xmltest.c @@ -39,7 +39,6 @@ struct _testQemuData { static int testQemuDataInit(testQemuDataPtr data) { - data->inputDir = TEST_QEMU_CAPS_PATH; data->outputDir = abs_srcdir "/qemucaps2xmloutdata"; data->ret = 0; @@ -174,7 +173,8 @@ testQemuCapsXML(const void *opaque) } static int -doCapsTest(const char *base, +doCapsTest(const char *inputDir, + const char *base, const char *archName, void *opaque) { @@ -184,6 +184,7 @@ doCapsTest(const char *base, if (virAsprintf(&title, "%s (%s)", base, archName) < 0) return -1; + data->inputDir = inputDir; data->base = base; data->archName = archName; diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index c602255149..75c8180c7a 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -937,7 +937,7 @@ testQemuCapsIterate(const char *suffix, archName++; /* Run the user-provided callback */ - if (callback(base, archName, opaque) < 0) + if (callback(TEST_QEMU_CAPS_PATH, base, archName, opaque) < 0) goto cleanup; } diff --git a/tests/testutilsqemu.h b/tests/testutilsqemu.h index a2f7bfcc26..07373f8ce6 100644 --- a/tests/testutilsqemu.h +++ b/tests/testutilsqemu.h @@ -96,7 +96,8 @@ char *testQemuGetLatestCapsForArch(const char *arch, const char *suffix); virHashTablePtr testQemuGetLatestCaps(void); -typedef int (*testQemuCapsIterateCallback)(const char *base, +typedef int (*testQemuCapsIterateCallback)(const char *inputDir, + const char *base, const char *archName, void *opaque); int testQemuCapsIterate(const char *suffix, -- 2.21.0

Right now users need to hardcode the suffix, which is not a big deal since they're the ones who passed it to testQemuCapsIterate() in the first place; however, since we're already passing most of the information to the callback and we're going to add more later on, it makes sense to be consistent and pass the suffix too. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- tests/qemucapabilitiestest.c | 8 ++++++-- tests/qemucaps2xmltest.c | 8 ++++++-- tests/testutilsqemu.c | 11 +++++++++-- tests/testutilsqemu.h | 1 + 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/tests/qemucapabilitiestest.c b/tests/qemucapabilitiestest.c index 6b8d2676e3..cc2242df50 100644 --- a/tests/qemucapabilitiestest.c +++ b/tests/qemucapabilitiestest.c @@ -38,6 +38,7 @@ struct _testQemuData { const char *inputDir; const char *outputDir; const char *archName; + const char *suffix; const char *base; int ret; }; @@ -77,8 +78,9 @@ testQemuCaps(const void *opaque) unsigned int fakeMicrocodeVersion = 0; const char *p; - if (virAsprintf(&repliesFile, "%s/%s.%s.replies", - data->inputDir, data->base, data->archName) < 0 || + if (virAsprintf(&repliesFile, "%s/%s.%s.%s", + data->inputDir, data->base, + data->archName, data->suffix) < 0 || virAsprintf(&capsFile, "%s/%s.%s.xml", data->outputDir, data->base, data->archName) < 0) goto cleanup; @@ -182,6 +184,7 @@ static int doCapsTest(const char *inputDir, const char *base, const char *archName, + const char *suffix, void *opaque) { testQemuDataPtr data = (testQemuDataPtr) opaque; @@ -196,6 +199,7 @@ doCapsTest(const char *inputDir, data->inputDir = inputDir; data->base = base; data->archName = archName; + data->suffix = suffix; if (virTestRun(title, testQemuCaps, data) < 0) data->ret = -1; diff --git a/tests/qemucaps2xmltest.c b/tests/qemucaps2xmltest.c index 8985b20ac6..7a41e9cdd3 100644 --- a/tests/qemucaps2xmltest.c +++ b/tests/qemucaps2xmltest.c @@ -33,6 +33,7 @@ struct _testQemuData { const char *outputDir; const char *base; const char *archName; + const char *suffix; int ret; }; @@ -145,8 +146,9 @@ testQemuCapsXML(const void *opaque) data->outputDir, data->archName) < 0) goto cleanup; - if (virAsprintf(&capsFile, "%s/%s.%s.xml", - data->inputDir, data->base, data->archName) < 0) + if (virAsprintf(&capsFile, "%s/%s.%s.%s", + data->inputDir, data->base, + data->archName, data->suffix) < 0) goto cleanup; if (virTestLoadFile(capsFile, &capsData) < 0) @@ -176,6 +178,7 @@ static int doCapsTest(const char *inputDir, const char *base, const char *archName, + const char *suffix, void *opaque) { testQemuDataPtr data = (testQemuDataPtr) opaque; @@ -187,6 +190,7 @@ doCapsTest(const char *inputDir, data->inputDir = inputDir; data->base = base; data->archName = archName; + data->suffix = suffix; if (virTestRun(title, testQemuCapsXML, data) < 0) data->ret = -1; diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index 75c8180c7a..1f0270f488 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -936,9 +936,16 @@ testQemuCapsIterate(const char *suffix, archName[0] = '\0'; archName++; - /* Run the user-provided callback */ - if (callback(TEST_QEMU_CAPS_PATH, base, archName, opaque) < 0) + /* Run the user-provided callback. + * + * We skip the dot that, as verified earlier, starts the suffix + * to make it nicer to rebuild the original file name from inside + * the callback. + */ + if (callback(TEST_QEMU_CAPS_PATH, base, + archName, suffix + 1, opaque) < 0) { goto cleanup; + } } if (rc < 0) diff --git a/tests/testutilsqemu.h b/tests/testutilsqemu.h index 07373f8ce6..2c8c4960e9 100644 --- a/tests/testutilsqemu.h +++ b/tests/testutilsqemu.h @@ -99,6 +99,7 @@ virHashTablePtr testQemuGetLatestCaps(void); typedef int (*testQemuCapsIterateCallback)(const char *inputDir, const char *base, const char *archName, + const char *suffix, void *opaque); int testQemuCapsIterate(const char *suffix, testQemuCapsIterateCallback callback, -- 2.21.0

Right now we're passing a "base" string that contains both, separated by an underscore. Some changes that we're going to introduce later will require us to have the version number on its own, and instead of delegating the task of splitting the two apart to the callback it make more sense to perform it upfront. This change results in quite a bit of churn because we're now using the version number only, without the prefix, to calculate the dummy microcodeVersion. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- .../caps_1.5.3.x86_64.xml | 2 +- .../caps_1.6.0.x86_64.xml | 2 +- .../caps_1.7.0.x86_64.xml | 2 +- .../caps_2.1.1.x86_64.xml | 2 +- .../caps_2.10.0.aarch64.xml | 2 +- .../caps_2.10.0.ppc64.xml | 2 +- .../caps_2.10.0.s390x.xml | 2 +- .../caps_2.10.0.x86_64.xml | 2 +- .../caps_2.11.0.s390x.xml | 2 +- .../caps_2.11.0.x86_64.xml | 2 +- .../caps_2.12.0.aarch64.xml | 2 +- .../caps_2.12.0.ppc64.xml | 2 +- .../caps_2.12.0.s390x.xml | 2 +- .../caps_2.12.0.x86_64.xml | 2 +- .../caps_2.4.0.x86_64.xml | 2 +- .../caps_2.5.0.x86_64.xml | 2 +- .../caps_2.6.0.aarch64.xml | 2 +- .../qemucapabilitiesdata/caps_2.6.0.ppc64.xml | 2 +- .../caps_2.6.0.x86_64.xml | 2 +- .../qemucapabilitiesdata/caps_2.7.0.s390x.xml | 2 +- .../caps_2.7.0.x86_64.xml | 2 +- .../qemucapabilitiesdata/caps_2.8.0.s390x.xml | 2 +- .../caps_2.8.0.x86_64.xml | 2 +- .../qemucapabilitiesdata/caps_2.9.0.ppc64.xml | 2 +- .../qemucapabilitiesdata/caps_2.9.0.s390x.xml | 2 +- .../caps_2.9.0.x86_64.xml | 2 +- .../qemucapabilitiesdata/caps_3.0.0.ppc64.xml | 2 +- .../qemucapabilitiesdata/caps_3.0.0.s390x.xml | 2 +- .../caps_3.0.0.x86_64.xml | 2 +- .../qemucapabilitiesdata/caps_3.1.0.ppc64.xml | 2 +- .../caps_3.1.0.x86_64.xml | 2 +- .../caps_4.0.0.aarch64.xml | 2 +- .../qemucapabilitiesdata/caps_4.0.0.ppc64.xml | 2 +- .../qemucapabilitiesdata/caps_4.0.0.s390x.xml | 2 +- .../caps_4.0.0.x86_64.xml | 2 +- .../caps_4.1.0.x86_64.xml | 2 +- .../caps_4.2.0.aarch64.xml | 2 +- .../qemucapabilitiesdata/caps_4.2.0.ppc64.xml | 2 +- .../caps_4.2.0.x86_64.xml | 2 +- tests/qemucapabilitiestest.c | 29 +++++++++++-------- tests/qemucaps2xmltest.c | 15 ++++++---- tests/testutilsqemu.c | 16 ++++++---- tests/testutilsqemu.h | 3 +- 43 files changed, 78 insertions(+), 63 deletions(-) diff --git a/tests/qemucapabilitiesdata/caps_1.5.3.x86_64.xml b/tests/qemucapabilitiesdata/caps_1.5.3.x86_64.xml index 780d75a513..8b573070d5 100644 --- a/tests/qemucapabilitiesdata/caps_1.5.3.x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_1.5.3.x86_64.xml @@ -85,7 +85,7 @@ <flag name='mch'/> <version>1005003</version> <kvmVersion>0</kvmVersion> - <microcodeVersion>43100763</microcodeVersion> + <microcodeVersion>43100245</microcodeVersion> <package></package> <arch>x86_64</arch> <cpu type='kvm' name='Opteron_G5'/> [... many more changes exactly like this one ...] diff --git a/tests/qemucapabilitiestest.c b/tests/qemucapabilitiestest.c index cc2242df50..8fa4104f20 100644 --- a/tests/qemucapabilitiestest.c +++ b/tests/qemucapabilitiestest.c @@ -37,9 +37,10 @@ struct _testQemuData { virQEMUDriver driver; const char *inputDir; const char *outputDir; + const char *prefix; + const char *version; const char *archName; const char *suffix; - const char *base; int ret; }; @@ -78,11 +79,12 @@ testQemuCaps(const void *opaque) unsigned int fakeMicrocodeVersion = 0; const char *p; - if (virAsprintf(&repliesFile, "%s/%s.%s.%s", - data->inputDir, data->base, + if (virAsprintf(&repliesFile, "%s/%s_%s.%s.%s", + data->inputDir, data->prefix, data->version, data->archName, data->suffix) < 0 || - virAsprintf(&capsFile, "%s/%s.%s.xml", - data->outputDir, data->base, data->archName) < 0) + virAsprintf(&capsFile, "%s/%s_%s.%s.xml", + data->outputDir, data->prefix, data->version, + data->archName) < 0) goto cleanup; if (!(mon = qemuMonitorTestNewFromFileFull(repliesFile, &data->driver, NULL, @@ -114,7 +116,7 @@ testQemuCaps(const void *opaque) fakeMicrocodeVersion *= 100000; - for (p = data->base; *p; p++) + for (p = data->version; *p; p++) fakeMicrocodeVersion += *p; virQEMUCapsSetMicrocodeVersion(capsActual, fakeMicrocodeVersion); @@ -148,8 +150,9 @@ testQemuCapsCopy(const void *opaque) virQEMUCapsPtr copy = NULL; char *actual = NULL; - if (virAsprintf(&capsFile, "%s/%s.%s.xml", - data->outputDir, data->base, data->archName) < 0) + if (virAsprintf(&capsFile, "%s/%s_%s.%s.xml", + data->outputDir, data->prefix, data->version, + data->archName) < 0) goto cleanup; if (!(caps = virCapabilitiesNew(virArchFromString(data->archName), @@ -182,7 +185,8 @@ testQemuCapsCopy(const void *opaque) static int doCapsTest(const char *inputDir, - const char *base, + const char *prefix, + const char *version, const char *archName, const char *suffix, void *opaque) @@ -191,13 +195,14 @@ doCapsTest(const char *inputDir, g_autofree char *title = NULL; g_autofree char *copyTitle = NULL; - if (virAsprintf(&title, "%s (%s)", base, archName) < 0 || - virAsprintf(©Title, "copy %s (%s)", base, archName) < 0) { + if (virAsprintf(&title, "%s (%s)", version, archName) < 0 || + virAsprintf(©Title, "copy %s (%s)", version, archName) < 0) { return -1; } data->inputDir = inputDir; - data->base = base; + data->prefix = prefix; + data->version = version; data->archName = archName; data->suffix = suffix; diff --git a/tests/qemucaps2xmltest.c b/tests/qemucaps2xmltest.c index 7a41e9cdd3..365efbe4b1 100644 --- a/tests/qemucaps2xmltest.c +++ b/tests/qemucaps2xmltest.c @@ -31,7 +31,8 @@ typedef testQemuData *testQemuDataPtr; struct _testQemuData { const char *inputDir; const char *outputDir; - const char *base; + const char *prefix; + const char *version; const char *archName; const char *suffix; int ret; @@ -146,8 +147,8 @@ testQemuCapsXML(const void *opaque) data->outputDir, data->archName) < 0) goto cleanup; - if (virAsprintf(&capsFile, "%s/%s.%s.%s", - data->inputDir, data->base, + if (virAsprintf(&capsFile, "%s/%s_%s.%s.%s", + data->inputDir, data->prefix, data->version, data->archName, data->suffix) < 0) goto cleanup; @@ -176,7 +177,8 @@ testQemuCapsXML(const void *opaque) static int doCapsTest(const char *inputDir, - const char *base, + const char *prefix, + const char *version, const char *archName, const char *suffix, void *opaque) @@ -184,11 +186,12 @@ doCapsTest(const char *inputDir, testQemuDataPtr data = (testQemuDataPtr) opaque; g_autofree char *title = NULL; - if (virAsprintf(&title, "%s (%s)", base, archName) < 0) + if (virAsprintf(&title, "%s (%s)", version, archName) < 0) return -1; data->inputDir = inputDir; - data->base = base; + data->prefix = prefix; + data->version = version; data->archName = archName; data->suffix = suffix; diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c index 1f0270f488..54d6b1a0ac 100644 --- a/tests/testutilsqemu.c +++ b/tests/testutilsqemu.c @@ -917,22 +917,28 @@ testQemuCapsIterate(const char *suffix, while ((rc = virDirRead(dir, &ent, TEST_QEMU_CAPS_PATH)) > 0) { g_autofree char *tmp = g_strdup(ent->d_name); - char *base = NULL; + char *version = NULL; char *archName = NULL; /* Strip the trailing suffix, moving on if it's not present */ if (!virStringStripSuffix(tmp, suffix)) continue; + /* Strip the leading prefix */ + if (!(version = STRSKIP(tmp, "caps_"))) { + VIR_TEST_VERBOSE("malformed file name '%s'", ent->d_name); + goto cleanup; + } + /* Find the last dot */ if (!(archName = strrchr(tmp, '.'))) { VIR_TEST_VERBOSE("malformed file name '%s'", ent->d_name); goto cleanup; } - /* The base name is everything before the last dot, and - * the architecture name everything after it */ - base = tmp; + /* The version number and the architecture name are separated by + * a dot: overwriting that dot with \0 results in both being usable + * as independent, null-terminated strings */ archName[0] = '\0'; archName++; @@ -942,7 +948,7 @@ testQemuCapsIterate(const char *suffix, * to make it nicer to rebuild the original file name from inside * the callback. */ - if (callback(TEST_QEMU_CAPS_PATH, base, + if (callback(TEST_QEMU_CAPS_PATH, "caps", version, archName, suffix + 1, opaque) < 0) { goto cleanup; } diff --git a/tests/testutilsqemu.h b/tests/testutilsqemu.h index 2c8c4960e9..714a95bb7a 100644 --- a/tests/testutilsqemu.h +++ b/tests/testutilsqemu.h @@ -97,7 +97,8 @@ char *testQemuGetLatestCapsForArch(const char *arch, virHashTablePtr testQemuGetLatestCaps(void); typedef int (*testQemuCapsIterateCallback)(const char *inputDir, - const char *base, + const char *prefix, + const char *version, const char *archName, const char *suffix, void *opaque); -- 2.21.0

The usual convention is to use ${foo}test.c for the test program itself and either ${foo}data/ or ${foo}outdata/, depending on whether it contains both input and output files or only the latter, for the corresponding data directory. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- tests/Makefile.am | 2 +- .../bhyve_basic.x86_64.xml | 0 .../bhyve_fbuf.x86_64.xml | 0 .../bhyve_uefi.x86_64.xml | 0 tests/{domaincapsschemadata => domaincapsdata}/empty.xml | 0 tests/{domaincapsschemadata => domaincapsdata}/libxl-xenfv.xml | 0 tests/{domaincapsschemadata => domaincapsdata}/libxl-xenpv.xml | 0 .../qemu_1.7.0.x86_64.xml | 0 .../qemu_2.12.0-virt.aarch64.xml | 0 .../qemu_2.12.0.ppc64.xml | 0 .../qemu_2.12.0.s390x.xml | 0 .../qemu_2.12.0.x86_64.xml | 0 .../qemu_2.6.0-virt.aarch64.xml | 0 .../qemu_2.6.0.aarch64.xml | 0 .../qemu_2.6.0.ppc64.xml | 0 .../qemu_2.6.0.x86_64.xml | 0 .../qemu_2.7.0.s390x.xml | 0 .../qemu_2.8.0-tcg.x86_64.xml | 0 .../qemu_2.8.0.s390x.xml | 0 .../qemu_2.8.0.x86_64.xml | 0 .../qemu_2.9.0-q35.x86_64.xml | 0 .../qemu_2.9.0-tcg.x86_64.xml | 0 .../qemu_2.9.0.x86_64.xml | 0 .../qemu_3.0.0.s390x.xml | 0 .../qemu_3.1.0.x86_64.xml | 0 .../qemu_4.0.0.s390x.xml | 0 .../qemu_4.0.0.x86_64.xml | 0 .../qemu_4.1.0.x86_64.xml | 0 .../qemu_4.2.0.aarch64.xml | 0 .../qemu_4.2.0.ppc64.xml | 0 .../qemu_4.2.0.x86_64.xml | 0 tests/domaincapstest.c | 2 +- tests/virschematest.c | 2 +- 33 files changed, 3 insertions(+), 3 deletions(-) rename tests/{domaincapsschemadata => domaincapsdata}/bhyve_basic.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/bhyve_fbuf.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/bhyve_uefi.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/empty.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/libxl-xenfv.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/libxl-xenpv.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_1.7.0.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.12.0-virt.aarch64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.12.0.ppc64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.12.0.s390x.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.12.0.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.6.0-virt.aarch64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.6.0.aarch64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.6.0.ppc64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.6.0.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.7.0.s390x.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.8.0-tcg.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.8.0.s390x.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.8.0.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.9.0-q35.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.9.0-tcg.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_2.9.0.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_3.0.0.s390x.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_3.1.0.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_4.0.0.s390x.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_4.0.0.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_4.1.0.x86_64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_4.2.0.aarch64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_4.2.0.ppc64.xml (100%) rename tests/{domaincapsschemadata => domaincapsdata}/qemu_4.2.0.x86_64.xml (100%) diff --git a/tests/Makefile.am b/tests/Makefile.am index a9acd88670..10a309bd76 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -89,7 +89,7 @@ EXTRA_DIST = \ capabilityschemadata \ commanddata \ cputestdata \ - domaincapsschemadata \ + domaincapsdata \ domainconfdata \ domainschemadata \ fchostdata \ diff --git a/tests/domaincapsschemadata/bhyve_basic.x86_64.xml b/tests/domaincapsdata/bhyve_basic.x86_64.xml similarity index 100% rename from tests/domaincapsschemadata/bhyve_basic.x86_64.xml rename to tests/domaincapsdata/bhyve_basic.x86_64.xml [... many more files get moved ...] diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c index 61bc019671..7a69543a45 100644 --- a/tests/domaincapstest.c +++ b/tests/domaincapstest.c @@ -217,7 +217,7 @@ test_virDomainCapsFormat(const void *opaque) char *domCapsXML = NULL; int ret = -1; - if (virAsprintf(&path, "%s/domaincapsschemadata/%s.xml", + if (virAsprintf(&path, "%s/domaincapsdata/%s.xml", abs_srcdir, data->name) < 0) goto cleanup; diff --git a/tests/virschematest.c b/tests/virschematest.c index dabbc02163..050da0c972 100644 --- a/tests/virschematest.c +++ b/tests/virschematest.c @@ -221,7 +221,7 @@ mymain(void) "lxcxml2xmloutdata", "bhyvexml2argvdata", "genericxml2xmlindata", "genericxml2xmloutdata", "xlconfigdata", "libxlxml2domconfigdata", "qemuhotplugtestdomains"); - DO_TEST_DIR("domaincaps.rng", "domaincapsschemadata"); + DO_TEST_DIR("domaincaps.rng", "domaincapsdata"); DO_TEST_DIR("domaincheckpoint.rng", "qemudomaincheckpointxml2xmlin", "qemudomaincheckpointxml2xmlout"); DO_TEST_DIR("domainsnapshot.rng", "qemudomainsnapshotxml2xmlin", -- 2.21.0

Requiring the user to provide the final string themselves will make subsequent changes easier to implement. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- tests/domaincapstest.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c index 7a69543a45..f38f5fb047 100644 --- a/tests/domaincapstest.c +++ b/tests/domaincapstest.c @@ -299,9 +299,8 @@ mymain(void) #define DO_TEST_QEMU(Name, CapsName, Emulator, Machine, Arch, Type) \ do { \ char *name = NULL; \ - if (virAsprintf(&name, "qemu_%s%s%s.%s", \ + if (virAsprintf(&name, "qemu_%s.%s", \ Name, \ - Machine ? "-" : "", Machine ? Machine : "", \ Arch) < 0) { \ ret = -1; \ break; \ @@ -387,7 +386,7 @@ mymain(void) "/usr/bin/qemu-system-x86_64", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.9.0", "caps_2.9.0", + DO_TEST_QEMU("2.9.0-q35", "caps_2.9.0", "/usr/bin/qemu-system-x86_64", "q35", "x86_64", VIR_DOMAIN_VIRT_KVM); @@ -403,11 +402,11 @@ mymain(void) "/usr/bin/qemu-system-aarch64", NULL, "aarch64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.6.0", "caps_2.6.0", + DO_TEST_QEMU("2.6.0-virt", "caps_2.6.0", "/usr/bin/qemu-system-aarch64", "virt", "aarch64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.12.0", "caps_2.12.0", + DO_TEST_QEMU("2.12.0-virt", "caps_2.12.0", "/usr/bin/qemu-system-aarch64", "virt", "aarch64", VIR_DOMAIN_VIRT_KVM); -- 2.21.0

Macros become less and less appealing the more work you perform inside them: DO_TEST_QEMU() has arguably already crossed that threshold, and we're going to add even more code later on. While factoring the code out of the macro, convert it to use the GLib string manipulation functions and take advantage of autofree. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- tests/domaincapstest.c | 50 ++++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c index f38f5fb047..e35eddc659 100644 --- a/tests/domaincapstest.c +++ b/tests/domaincapstest.c @@ -266,6 +266,36 @@ test_virDomainCapsFormat(const void *opaque) return ret; } +static int +doTestQemu(const char *partialName, + const char *capsName, + const char *emulator, + const char *machine, + const char *arch, + virDomainVirtType type, + void *opaque) +{ + g_autofree char *name = NULL; + + name = g_strdup_printf("qemu_%s.%s", partialName, arch); + + struct testData data = { + .name = name, + .emulator = emulator, + .machine = machine, + .arch = arch, + .type = type, + .capsType = CAPS_QEMU, + .capsName = capsName, + .capsOpaque = opaque, + }; + + if (virTestRun(name, test_virDomainCapsFormat, &data) < 0) + return -1; + + return 0; +} + static int mymain(void) { @@ -298,26 +328,8 @@ mymain(void) #define DO_TEST_QEMU(Name, CapsName, Emulator, Machine, Arch, Type) \ do { \ - char *name = NULL; \ - if (virAsprintf(&name, "qemu_%s.%s", \ - Name, \ - Arch) < 0) { \ + if (doTestQemu(Name, CapsName, Emulator, Machine, Arch, Type, cfg) < 0) \ ret = -1; \ - break; \ - } \ - struct testData data = { \ - .name = name, \ - .emulator = Emulator, \ - .machine = Machine, \ - .arch = Arch, \ - .type = Type, \ - .capsType = CAPS_QEMU, \ - .capsName = CapsName, \ - .capsOpaque = cfg, \ - }; \ - if (virTestRun(name, test_virDomainCapsFormat, &data) < 0) \ - ret = -1; \ - VIR_FREE(name); \ } while (0) #define DO_TEST_LIBXL(Name, Emulator, Machine, Arch, Type) \ -- 2.21.0

The full name of the test case, as well as the name of the QEMU binary and corresponding capabilities file, can all be derived from other information passed to the test, so there's no point in asking the user to provide them. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- tests/domaincapstest.c | 127 ++++++++++++----------------------------- 1 file changed, 36 insertions(+), 91 deletions(-) diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c index e35eddc659..e3329ef1ff 100644 --- a/tests/domaincapstest.c +++ b/tests/domaincapstest.c @@ -267,17 +267,23 @@ test_virDomainCapsFormat(const void *opaque) } static int -doTestQemu(const char *partialName, - const char *capsName, - const char *emulator, +doTestQemu(const char *version, const char *machine, const char *arch, virDomainVirtType type, void *opaque) { g_autofree char *name = NULL; + g_autofree char *capsName = NULL; + g_autofree char *emulator = NULL; - name = g_strdup_printf("qemu_%s.%s", partialName, arch); + name = g_strdup_printf("qemu_%s%s%s%s.%s", + version, + (type == VIR_DOMAIN_VIRT_QEMU ? "-tcg" : ""), + (machine ? "-" : ""), (machine ? machine : ""), + arch); + capsName = g_strdup_printf("caps_%s", version); + emulator = g_strdup_printf("/usr/bin/qemu-system-%s", arch); struct testData data = { .name = name, @@ -326,9 +332,9 @@ mymain(void) ret = -1; \ } while (0) -#define DO_TEST_QEMU(Name, CapsName, Emulator, Machine, Arch, Type) \ +#define DO_TEST_QEMU(Version, Machine, Arch, Type) \ do { \ - if (doTestQemu(Name, CapsName, Emulator, Machine, Arch, Type, cfg) < 0) \ + if (doTestQemu(Version, Machine, Arch, Type, cfg) < 0) \ ret = -1; \ } while (0) @@ -378,101 +384,40 @@ mymain(void) virFileWrapperAddPrefix("/home/user/.config/qemu/firmware", abs_srcdir "/qemufirmwaredata/home/user/.config/qemu/firmware"); - DO_TEST_QEMU("1.7.0", "caps_1.7.0", - "/usr/bin/qemu-system-x86_64", NULL, - "x86_64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("1.7.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.6.0", "caps_2.6.0", - "/usr/bin/qemu-system-x86_64", NULL, - "x86_64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("2.6.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("2.6.0", NULL, "aarch64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("2.6.0", "virt", "aarch64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("2.6.0", NULL, "ppc64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.8.0", "caps_2.8.0", - "/usr/bin/qemu-system-x86_64", NULL, - "x86_64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("2.7.0", NULL, "s390x", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.8.0-tcg", "caps_2.8.0", - "/usr/bin/qemu-system-x86_64", NULL, - "x86_64", VIR_DOMAIN_VIRT_QEMU); + DO_TEST_QEMU("2.8.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("2.8.0", NULL, "x86_64", VIR_DOMAIN_VIRT_QEMU); + DO_TEST_QEMU("2.8.0", NULL, "s390x", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.9.0", "caps_2.9.0", - "/usr/bin/qemu-system-x86_64", NULL, - "x86_64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("2.9.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("2.9.0", "q35", "x86_64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("2.9.0", NULL, "x86_64", VIR_DOMAIN_VIRT_QEMU); - DO_TEST_QEMU("2.9.0-q35", "caps_2.9.0", - "/usr/bin/qemu-system-x86_64", "q35", - "x86_64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("2.12.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("2.12.0", "virt", "aarch64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("2.12.0", NULL, "ppc64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("2.12.0", NULL, "s390x", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.9.0-tcg", "caps_2.9.0", - "/usr/bin/qemu-system-x86_64", NULL, - "x86_64", VIR_DOMAIN_VIRT_QEMU); + DO_TEST_QEMU("3.0.0", NULL, "s390x", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.12.0", "caps_2.12.0", - "/usr/bin/qemu-system-x86_64", NULL, - "x86_64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("3.1.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.6.0", "caps_2.6.0", - "/usr/bin/qemu-system-aarch64", NULL, - "aarch64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("4.0.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("4.0.0", NULL, "s390x", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.6.0-virt", "caps_2.6.0", - "/usr/bin/qemu-system-aarch64", "virt", - "aarch64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("4.1.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.12.0-virt", "caps_2.12.0", - "/usr/bin/qemu-system-aarch64", "virt", - "aarch64", VIR_DOMAIN_VIRT_KVM); - - DO_TEST_QEMU("2.6.0", "caps_2.6.0", - "/usr/bin/qemu-system-ppc64", NULL, - "ppc64", VIR_DOMAIN_VIRT_KVM); - - DO_TEST_QEMU("2.12.0", "caps_2.12.0", - "/usr/bin/qemu-system-ppc64", NULL, - "ppc64", VIR_DOMAIN_VIRT_KVM); - - DO_TEST_QEMU("2.7.0", "caps_2.7.0", - "/usr/bin/qemu-system-s390x", NULL, - "s390x", VIR_DOMAIN_VIRT_KVM); - - DO_TEST_QEMU("2.8.0", "caps_2.8.0", - "/usr/bin/qemu-system-s390x", NULL, - "s390x", VIR_DOMAIN_VIRT_KVM); - - DO_TEST_QEMU("2.12.0", "caps_2.12.0", - "/usr/bin/qemu-system-s390x", NULL, - "s390x", VIR_DOMAIN_VIRT_KVM); - - DO_TEST_QEMU("3.0.0", "caps_3.0.0", - "/usr/bin/qemu-system-s390x", NULL, - "s390x", VIR_DOMAIN_VIRT_KVM); - - DO_TEST_QEMU("3.1.0", "caps_3.1.0", - "/usr/bin/qemu-system-x86_64", NULL, - "x86_64", VIR_DOMAIN_VIRT_KVM); - - DO_TEST_QEMU("4.0.0", "caps_4.0.0", - "/usr/bin/qemu-system-x86_64", NULL, - "x86_64", VIR_DOMAIN_VIRT_KVM); - - DO_TEST_QEMU("4.0.0", "caps_4.0.0", - "/usr/bin/qemu-system-s390x", NULL, - "s390x", VIR_DOMAIN_VIRT_KVM); - - DO_TEST_QEMU("4.1.0", "caps_4.1.0", - "/usr/bin/qemu-system-x86_64", NULL, - "x86_64", VIR_DOMAIN_VIRT_KVM); - - DO_TEST_QEMU("4.2.0", "caps_4.2.0", - "/usr/bin/qemu-system-x86_64", NULL, - "x86_64", VIR_DOMAIN_VIRT_KVM); - - DO_TEST_QEMU("4.2.0", "caps_4.2.0", - "/usr/bin/qemu-system-ppc64", NULL, - "ppc64", VIR_DOMAIN_VIRT_KVM); - - DO_TEST_QEMU("4.2.0", "caps_4.2.0", - "/usr/bin/qemu-system-aarch64", NULL, - "aarch64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("4.2.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("4.2.0", NULL, "ppc64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("4.2.0", NULL, "aarch64", VIR_DOMAIN_VIRT_KVM); virObjectUnref(cfg); -- 2.21.0

For each QEMU version there are usually several different, architecture-dependedn scenarios that we're interested in testing; however, since the test matrix has to be explicitly created by calling DO_TEST_QEMU() multiple times with different arguments, we end up with spotty coverage. Fix this by implementing the arch-specific rules in code, which result in the full coverage for a (version, arch) combo being automatically achieved with a single call to DO_TEST_QEMU(). Unsurprisingly, this change results in a bunch of extra output files being created. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- .../domaincapsdata/qemu_1.7.0-q35.x86_64.xml | 134 +++++++++++++ .../domaincapsdata/qemu_1.7.0-tcg.x86_64.xml | 134 +++++++++++++ .../domaincapsdata/qemu_2.12.0-q35.x86_64.xml | 172 ++++++++++++++++ .../domaincapsdata/qemu_2.12.0-tcg.x86_64.xml | 186 +++++++++++++++++ tests/domaincapsdata/qemu_2.12.0.aarch64.xml | 138 +++++++++++++ .../domaincapsdata/qemu_2.6.0-q35.x86_64.xml | 143 ++++++++++++++ .../domaincapsdata/qemu_2.6.0-tcg.x86_64.xml | 143 ++++++++++++++ .../domaincapsdata/qemu_2.8.0-q35.x86_64.xml | 144 ++++++++++++++ .../domaincapsdata/qemu_3.1.0-q35.x86_64.xml | 172 ++++++++++++++++ .../domaincapsdata/qemu_3.1.0-tcg.x86_64.xml | 187 ++++++++++++++++++ .../domaincapsdata/qemu_4.0.0-q35.x86_64.xml | 172 ++++++++++++++++ .../domaincapsdata/qemu_4.0.0-tcg.x86_64.xml | 187 ++++++++++++++++++ .../domaincapsdata/qemu_4.1.0-q35.x86_64.xml | 176 +++++++++++++++++ .../domaincapsdata/qemu_4.1.0-tcg.x86_64.xml | 187 ++++++++++++++++++ .../domaincapsdata/qemu_4.2.0-q35.x86_64.xml | 176 +++++++++++++++++ .../domaincapsdata/qemu_4.2.0-tcg.x86_64.xml | 187 ++++++++++++++++++ .../qemu_4.2.0-virt.aarch64.xml | 150 ++++++++++++++ tests/domaincapstest.c | 102 +++++++--- 18 files changed, 2859 insertions(+), 31 deletions(-) create mode 100644 tests/domaincapsdata/qemu_1.7.0-q35.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_1.7.0-tcg.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.12.0-q35.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.12.0-tcg.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.12.0.aarch64.xml create mode 100644 tests/domaincapsdata/qemu_2.6.0-q35.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.6.0-tcg.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.8.0-q35.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_3.1.0-q35.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_3.1.0-tcg.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_4.0.0-q35.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_4.0.0-tcg.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_4.1.0-q35.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_4.1.0-tcg.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_4.2.0-q35.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_4.2.0-tcg.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_4.2.0-virt.aarch64.xml diff --git a/tests/domaincapsdata/qemu_1.7.0-q35.x86_64.xml b/tests/domaincapsdata/qemu_1.7.0-q35.x86_64.xml new file mode 100644 index 0000000000..79b753fa09 --- /dev/null +++ b/tests/domaincapsdata/qemu_1.7.0-q35.x86_64.xml @@ -0,0 +1,134 @@ +<domainCapabilities> + <path>/usr/bin/qemu-system-x86_64</path> + <domain>kvm</domain> + <machine>pc-q35-1.7</machine> + <arch>x86_64</arch> + <vcpu max='255'/> + <iothreads supported='no'/> + <os supported='yes'> + <enum name='firmware'> + <value>bios</value> + <value>efi</value> + </enum> + <loader supported='yes'> + <value>/usr/share/AAVMF/AAVMF_CODE.fd</value> + <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value> + <value>/usr/share/OVMF/OVMF_CODE.fd</value> + <enum name='type'> + <value>rom</value> + <value>pflash</value> + </enum> + <enum name='readonly'> + <value>yes</value> + <value>no</value> + </enum> + <enum name='secure'> + <value>yes</value> + <value>no</value> + </enum> + </loader> + </os> + <cpu> + <mode name='host-passthrough' supported='yes'/> + <mode name='host-model' supported='yes'> + <model fallback='allow'>Broadwell</model> + </mode> + <mode name='custom' supported='yes'> + <model usable='unknown'>Opteron_G5</model> + <model usable='unknown'>Opteron_G4</model> + <model usable='unknown'>Opteron_G3</model> + <model usable='unknown'>Opteron_G2</model> + <model usable='unknown'>Opteron_G1</model> + <model usable='unknown'>Haswell</model> + <model usable='unknown'>SandyBridge</model> + <model usable='unknown'>Westmere</model> + <model usable='unknown'>Nehalem</model> + <model usable='unknown'>Penryn</model> + <model usable='unknown'>Conroe</model> + <model usable='unknown'>n270</model> + <model usable='unknown'>athlon</model> + <model usable='unknown'>pentium3</model> + <model usable='unknown'>pentium2</model> + <model usable='unknown'>pentium</model> + <model usable='unknown'>486</model> + <model usable='unknown'>coreduo</model> + <model usable='unknown'>kvm32</model> + <model usable='unknown'>qemu32</model> + <model usable='unknown'>kvm64</model> + <model usable='unknown'>core2duo</model> + <model usable='unknown'>phenom</model> + <model usable='unknown'>qemu64</model> + </mode> + </cpu> + <devices> + <disk supported='yes'> + <enum name='diskDevice'> + <value>disk</value> + <value>cdrom</value> + <value>floppy</value> + <value>lun</value> + </enum> + <enum name='bus'> + <value>fdc</value> + <value>scsi</value> + <value>virtio</value> + <value>usb</value> + <value>sata</value> + </enum> + <enum name='model'> + <value>virtio</value> + </enum> + </disk> + <graphics supported='yes'> + <enum name='type'> + <value>sdl</value> + <value>vnc</value> + <value>spice</value> + </enum> + </graphics> + <video supported='yes'> + <enum name='modelType'> + <value>vga</value> + <value>cirrus</value> + <value>vmvga</value> + <value>qxl</value> + </enum> + </video> + <hostdev supported='yes'> + <enum name='mode'> + <value>subsystem</value> + </enum> + <enum name='startupPolicy'> + <value>default</value> + <value>mandatory</value> + <value>requisite</value> + <value>optional</value> + </enum> + <enum name='subsysType'> + <value>usb</value> + <value>pci</value> + <value>scsi</value> + </enum> + <enum name='capsType'/> + <enum name='pciBackend'> + <value>default</value> + <value>vfio</value> + </enum> + </hostdev> + <rng supported='yes'> + <enum name='model'> + <value>virtio</value> + </enum> + <enum name='backendModel'> + <value>random</value> + <value>egd</value> + </enum> + </rng> + </devices> + <features> + <gic supported='no'/> + <vmcoreinfo supported='no'/> + <genid supported='no'/> + <sev supported='no'/> + </features> +</domainCapabilities> [... many more files like this one get generated ...] diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c index e3329ef1ff..4476423228 100644 --- a/tests/domaincapstest.c +++ b/tests/domaincapstest.c @@ -267,11 +267,11 @@ test_virDomainCapsFormat(const void *opaque) } static int -doTestQemu(const char *version, - const char *machine, - const char *arch, - virDomainVirtType type, - void *opaque) +doTestQemuInternal(const char *version, + const char *machine, + const char *arch, + virDomainVirtType type, + void *opaque) { g_autofree char *name = NULL; g_autofree char *capsName = NULL; @@ -302,6 +302,50 @@ doTestQemu(const char *version, return 0; } +static int +doTestQemu(const char *version, + const char *arch, + void *opaque) +{ + if (STREQ(arch, "x86_64")) { + /* For x86_64 we test three combinations: + * + * - KVM with default machine + * - KVM with Q35 machine + * - TCG with default machine + */ + if (doTestQemuInternal(version, NULL, arch, + VIR_DOMAIN_VIRT_KVM, opaque) < 0 || + doTestQemuInternal(version, "q35", arch, + VIR_DOMAIN_VIRT_KVM, opaque) < 0 || + doTestQemuInternal(version, NULL, arch, + VIR_DOMAIN_VIRT_QEMU, opaque) < 0) { + return -1; + } + } else if (STREQ(arch, "aarch64")) { + /* For aarch64 we test two combinations: + * + * - KVM with default machine + * - KVM with virt machine + */ + if (doTestQemuInternal(version, NULL, arch, + VIR_DOMAIN_VIRT_KVM, opaque) < 0 || + doTestQemuInternal(version, "virt", arch, + VIR_DOMAIN_VIRT_KVM, opaque) < 0) { + return -1; + } + } else if (STRPREFIX(arch, "riscv")) { + /* Unfortunately we have to skip RISC-V at the moment */ + return 0; + } else { + if (doTestQemuInternal(version, NULL, arch, + VIR_DOMAIN_VIRT_KVM, opaque) < 0) + return -1; + } + + return 0; +} + static int mymain(void) { @@ -332,9 +376,9 @@ mymain(void) ret = -1; \ } while (0) -#define DO_TEST_QEMU(Version, Machine, Arch, Type) \ +#define DO_TEST_QEMU(Version, Arch) \ do { \ - if (doTestQemu(Version, Machine, Arch, Type, cfg) < 0) \ + if (doTestQemu(Version, Arch, cfg) < 0) \ ret = -1; \ } while (0) @@ -384,40 +428,36 @@ mymain(void) virFileWrapperAddPrefix("/home/user/.config/qemu/firmware", abs_srcdir "/qemufirmwaredata/home/user/.config/qemu/firmware"); - DO_TEST_QEMU("1.7.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("1.7.0", "x86_64"); - DO_TEST_QEMU("2.6.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.6.0", NULL, "aarch64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.6.0", "virt", "aarch64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.6.0", NULL, "ppc64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("2.6.0", "x86_64"); + DO_TEST_QEMU("2.6.0", "aarch64"); + DO_TEST_QEMU("2.6.0", "ppc64"); - DO_TEST_QEMU("2.7.0", NULL, "s390x", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("2.7.0", "s390x"); - DO_TEST_QEMU("2.8.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.8.0", NULL, "x86_64", VIR_DOMAIN_VIRT_QEMU); - DO_TEST_QEMU("2.8.0", NULL, "s390x", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("2.8.0", "x86_64"); + DO_TEST_QEMU("2.8.0", "s390x"); - DO_TEST_QEMU("2.9.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.9.0", "q35", "x86_64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.9.0", NULL, "x86_64", VIR_DOMAIN_VIRT_QEMU); + DO_TEST_QEMU("2.9.0", "x86_64"); - DO_TEST_QEMU("2.12.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.12.0", "virt", "aarch64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.12.0", NULL, "ppc64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("2.12.0", NULL, "s390x", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("2.12.0", "x86_64"); + DO_TEST_QEMU("2.12.0", "aarch64"); + DO_TEST_QEMU("2.12.0", "ppc64"); + DO_TEST_QEMU("2.12.0", "s390x"); - DO_TEST_QEMU("3.0.0", NULL, "s390x", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("3.0.0", "s390x"); - DO_TEST_QEMU("3.1.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("3.1.0", "x86_64"); - DO_TEST_QEMU("4.0.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("4.0.0", NULL, "s390x", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("4.0.0", "x86_64"); + DO_TEST_QEMU("4.0.0", "s390x"); - DO_TEST_QEMU("4.1.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("4.1.0", "x86_64"); - DO_TEST_QEMU("4.2.0", NULL, "x86_64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("4.2.0", NULL, "ppc64", VIR_DOMAIN_VIRT_KVM); - DO_TEST_QEMU("4.2.0", NULL, "aarch64", VIR_DOMAIN_VIRT_KVM); + DO_TEST_QEMU("4.2.0", "x86_64"); + DO_TEST_QEMU("4.2.0", "ppc64"); + DO_TEST_QEMU("4.2.0", "aarch64"); virObjectUnref(cfg); -- 2.21.0

Now that the only data we need for fully testing a QEMU binary is the (version, arch) combo, we can stop providing that information ourselves and instead rely on testQemuCapsIterate() automatically picking up new input files as they are added to the repository, the same way the qemucapabilities and qemucaps2xml tests already behave. Unsurprisingly, this change results in a bunch of extra output files being created, significantly expanding our test coverage. Signed-off-by: Andrea Bolognani <abologna@redhat.com> --- .../domaincapsdata/qemu_1.5.3-q35.x86_64.xml | 134 ++++++++++++ .../domaincapsdata/qemu_1.5.3-tcg.x86_64.xml | 134 ++++++++++++ tests/domaincapsdata/qemu_1.5.3.x86_64.xml | 134 ++++++++++++ .../domaincapsdata/qemu_1.6.0-q35.x86_64.xml | 134 ++++++++++++ .../domaincapsdata/qemu_1.6.0-tcg.x86_64.xml | 134 ++++++++++++ tests/domaincapsdata/qemu_1.6.0.x86_64.xml | 134 ++++++++++++ .../domaincapsdata/qemu_2.1.1-q35.x86_64.xml | 135 ++++++++++++ .../domaincapsdata/qemu_2.1.1-tcg.x86_64.xml | 135 ++++++++++++ tests/domaincapsdata/qemu_2.1.1.x86_64.xml | 135 ++++++++++++ .../domaincapsdata/qemu_2.10.0-q35.x86_64.xml | 158 ++++++++++++++ .../domaincapsdata/qemu_2.10.0-tcg.x86_64.xml | 177 ++++++++++++++++ .../qemu_2.10.0-virt.aarch64.xml | 142 +++++++++++++ tests/domaincapsdata/qemu_2.10.0.aarch64.xml | 136 ++++++++++++ tests/domaincapsdata/qemu_2.10.0.ppc64.xml | 108 ++++++++++ tests/domaincapsdata/qemu_2.10.0.s390x.xml | 198 ++++++++++++++++++ tests/domaincapsdata/qemu_2.10.0.x86_64.xml | 158 ++++++++++++++ .../domaincapsdata/qemu_2.11.0-q35.x86_64.xml | 156 ++++++++++++++ .../domaincapsdata/qemu_2.11.0-tcg.x86_64.xml | 172 +++++++++++++++ tests/domaincapsdata/qemu_2.11.0.s390x.xml | 197 +++++++++++++++++ tests/domaincapsdata/qemu_2.11.0.x86_64.xml | 156 ++++++++++++++ .../domaincapsdata/qemu_2.4.0-q35.x86_64.xml | 143 +++++++++++++ .../domaincapsdata/qemu_2.4.0-tcg.x86_64.xml | 143 +++++++++++++ tests/domaincapsdata/qemu_2.4.0.x86_64.xml | 143 +++++++++++++ .../domaincapsdata/qemu_2.5.0-q35.x86_64.xml | 143 +++++++++++++ .../domaincapsdata/qemu_2.5.0-tcg.x86_64.xml | 143 +++++++++++++ tests/domaincapsdata/qemu_2.5.0.x86_64.xml | 143 +++++++++++++ .../domaincapsdata/qemu_2.7.0-q35.x86_64.xml | 144 +++++++++++++ .../domaincapsdata/qemu_2.7.0-tcg.x86_64.xml | 144 +++++++++++++ tests/domaincapsdata/qemu_2.7.0.x86_64.xml | 144 +++++++++++++ tests/domaincapsdata/qemu_2.9.0.ppc64.xml | 108 ++++++++++ tests/domaincapsdata/qemu_2.9.0.s390x.xml | 183 ++++++++++++++++ .../domaincapsdata/qemu_3.0.0-q35.x86_64.xml | 169 +++++++++++++++ .../domaincapsdata/qemu_3.0.0-tcg.x86_64.xml | 184 ++++++++++++++++ tests/domaincapsdata/qemu_3.0.0.ppc64.xml | 109 ++++++++++ tests/domaincapsdata/qemu_3.0.0.x86_64.xml | 169 +++++++++++++++ tests/domaincapsdata/qemu_3.1.0.ppc64.xml | 110 ++++++++++ .../qemu_4.0.0-virt.aarch64.xml | 150 +++++++++++++ tests/domaincapsdata/qemu_4.0.0.aarch64.xml | 144 +++++++++++++ tests/domaincapsdata/qemu_4.0.0.ppc64.xml | 111 ++++++++++ tests/domaincapstest.c | 57 ++--- 40 files changed, 5715 insertions(+), 36 deletions(-) create mode 100644 tests/domaincapsdata/qemu_1.5.3-q35.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_1.5.3-tcg.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_1.5.3.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_1.6.0-q35.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_1.6.0-tcg.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_1.6.0.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.1.1-q35.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.1.1-tcg.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.1.1.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.10.0-q35.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.10.0-tcg.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.10.0-virt.aarch64.xml create mode 100644 tests/domaincapsdata/qemu_2.10.0.aarch64.xml create mode 100644 tests/domaincapsdata/qemu_2.10.0.ppc64.xml create mode 100644 tests/domaincapsdata/qemu_2.10.0.s390x.xml create mode 100644 tests/domaincapsdata/qemu_2.10.0.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.11.0-q35.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.11.0-tcg.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.11.0.s390x.xml create mode 100644 tests/domaincapsdata/qemu_2.11.0.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.4.0-q35.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.4.0-tcg.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.4.0.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.5.0-q35.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.5.0-tcg.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.5.0.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.7.0-q35.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.7.0-tcg.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.7.0.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_2.9.0.ppc64.xml create mode 100644 tests/domaincapsdata/qemu_2.9.0.s390x.xml create mode 100644 tests/domaincapsdata/qemu_3.0.0-q35.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_3.0.0-tcg.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_3.0.0.ppc64.xml create mode 100644 tests/domaincapsdata/qemu_3.0.0.x86_64.xml create mode 100644 tests/domaincapsdata/qemu_3.1.0.ppc64.xml create mode 100644 tests/domaincapsdata/qemu_4.0.0-virt.aarch64.xml create mode 100644 tests/domaincapsdata/qemu_4.0.0.aarch64.xml create mode 100644 tests/domaincapsdata/qemu_4.0.0.ppc64.xml diff --git a/tests/domaincapsdata/qemu_1.5.3-q35.x86_64.xml b/tests/domaincapsdata/qemu_1.5.3-q35.x86_64.xml new file mode 100644 index 0000000000..c6b090ed06 --- /dev/null +++ b/tests/domaincapsdata/qemu_1.5.3-q35.x86_64.xml @@ -0,0 +1,134 @@ +<domainCapabilities> + <path>/usr/bin/qemu-system-x86_64</path> + <domain>kvm</domain> + <machine>pc-q35-1.5</machine> + <arch>x86_64</arch> + <vcpu max='255'/> + <iothreads supported='no'/> + <os supported='yes'> + <enum name='firmware'> + <value>bios</value> + <value>efi</value> + </enum> + <loader supported='yes'> + <value>/usr/share/AAVMF/AAVMF_CODE.fd</value> + <value>/usr/share/AAVMF/AAVMF32_CODE.fd</value> + <value>/usr/share/OVMF/OVMF_CODE.fd</value> + <enum name='type'> + <value>rom</value> + <value>pflash</value> + </enum> + <enum name='readonly'> + <value>yes</value> + <value>no</value> + </enum> + <enum name='secure'> + <value>yes</value> + <value>no</value> + </enum> + </loader> + </os> + <cpu> + <mode name='host-passthrough' supported='yes'/> + <mode name='host-model' supported='yes'> + <model fallback='allow'>Broadwell</model> + </mode> + <mode name='custom' supported='yes'> + <model usable='unknown'>Opteron_G5</model> + <model usable='unknown'>Opteron_G4</model> + <model usable='unknown'>Opteron_G3</model> + <model usable='unknown'>Opteron_G2</model> + <model usable='unknown'>Opteron_G1</model> + <model usable='unknown'>Haswell</model> + <model usable='unknown'>SandyBridge</model> + <model usable='unknown'>Westmere</model> + <model usable='unknown'>Nehalem</model> + <model usable='unknown'>Penryn</model> + <model usable='unknown'>Conroe</model> + <model usable='unknown'>n270</model> + <model usable='unknown'>athlon</model> + <model usable='unknown'>pentium3</model> + <model usable='unknown'>pentium2</model> + <model usable='unknown'>pentium</model> + <model usable='unknown'>486</model> + <model usable='unknown'>coreduo</model> + <model usable='unknown'>kvm32</model> + <model usable='unknown'>qemu32</model> + <model usable='unknown'>kvm64</model> + <model usable='unknown'>core2duo</model> + <model usable='unknown'>phenom</model> + <model usable='unknown'>qemu64</model> + </mode> + </cpu> + <devices> + <disk supported='yes'> + <enum name='diskDevice'> + <value>disk</value> + <value>cdrom</value> + <value>floppy</value> + <value>lun</value> + </enum> + <enum name='bus'> + <value>fdc</value> + <value>scsi</value> + <value>virtio</value> + <value>usb</value> + <value>sata</value> + </enum> + <enum name='model'> + <value>virtio</value> + </enum> + </disk> + <graphics supported='yes'> + <enum name='type'> + <value>sdl</value> + <value>vnc</value> + <value>spice</value> + </enum> + </graphics> + <video supported='yes'> + <enum name='modelType'> + <value>vga</value> + <value>cirrus</value> + <value>vmvga</value> + <value>qxl</value> + </enum> + </video> + <hostdev supported='yes'> + <enum name='mode'> + <value>subsystem</value> + </enum> + <enum name='startupPolicy'> + <value>default</value> + <value>mandatory</value> + <value>requisite</value> + <value>optional</value> + </enum> + <enum name='subsysType'> + <value>usb</value> + <value>pci</value> + <value>scsi</value> + </enum> + <enum name='capsType'/> + <enum name='pciBackend'> + <value>default</value> + <value>vfio</value> + </enum> + </hostdev> + <rng supported='yes'> + <enum name='model'> + <value>virtio</value> + </enum> + <enum name='backendModel'> + <value>random</value> + <value>egd</value> + </enum> + </rng> + </devices> + <features> + <gic supported='no'/> + <vmcoreinfo supported='no'/> + <genid supported='no'/> + <sev supported='no'/> + </features> +</domainCapabilities> [... many more files like this one get generated ...] diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c index 4476423228..0197c61c8a 100644 --- a/tests/domaincapstest.c +++ b/tests/domaincapstest.c @@ -303,8 +303,11 @@ doTestQemuInternal(const char *version, } static int -doTestQemu(const char *version, +doTestQemu(const char *inputDir G_GNUC_UNUSED, + const char *prefix G_GNUC_UNUSED, + const char *version, const char *arch, + const char *suffix G_GNUC_UNUSED, void *opaque) { if (STREQ(arch, "x86_64")) { @@ -376,12 +379,6 @@ mymain(void) ret = -1; \ } while (0) -#define DO_TEST_QEMU(Version, Arch) \ - do { \ - if (doTestQemu(Version, Arch, cfg) < 0) \ - ret = -1; \ - } while (0) - #define DO_TEST_LIBXL(Name, Emulator, Machine, Arch, Type) \ do { \ struct testData data = { \ @@ -428,36 +425,24 @@ mymain(void) virFileWrapperAddPrefix("/home/user/.config/qemu/firmware", abs_srcdir "/qemufirmwaredata/home/user/.config/qemu/firmware"); - DO_TEST_QEMU("1.7.0", "x86_64"); - - DO_TEST_QEMU("2.6.0", "x86_64"); - DO_TEST_QEMU("2.6.0", "aarch64"); - DO_TEST_QEMU("2.6.0", "ppc64"); - - DO_TEST_QEMU("2.7.0", "s390x"); - - DO_TEST_QEMU("2.8.0", "x86_64"); - DO_TEST_QEMU("2.8.0", "s390x"); - - DO_TEST_QEMU("2.9.0", "x86_64"); - - DO_TEST_QEMU("2.12.0", "x86_64"); - DO_TEST_QEMU("2.12.0", "aarch64"); - DO_TEST_QEMU("2.12.0", "ppc64"); - DO_TEST_QEMU("2.12.0", "s390x"); - - DO_TEST_QEMU("3.0.0", "s390x"); - - DO_TEST_QEMU("3.1.0", "x86_64"); - - DO_TEST_QEMU("4.0.0", "x86_64"); - DO_TEST_QEMU("4.0.0", "s390x"); - - DO_TEST_QEMU("4.1.0", "x86_64"); + if (testQemuCapsIterate(".xml", doTestQemu, cfg) < 0) + return EXIT_FAILURE; - DO_TEST_QEMU("4.2.0", "x86_64"); - DO_TEST_QEMU("4.2.0", "ppc64"); - DO_TEST_QEMU("4.2.0", "aarch64"); + /* + * Run "tests/qemucapsprobe /path/to/qemu/binary >foo.replies" + * to generate updated or new *.replies data files. + * + * If you manually edit replies files you can run + * "tests/qemucapsfixreplies foo.replies" to fix the replies ids. + * + * Once a replies file has been generated and tweaked if necessary, + * you can drop it into tests/qemucapabilitiesdata/ (with a sensible + * name - look at what's already there for inspiration) and test + * programs will automatically pick it up. + * + * To generate the corresponding output files after a new replies + * file has been added, run "VIR_TEST_REGENERATE_OUTPUT=1 make check". + */ virObjectUnref(cfg); -- 2.21.0

On Wed, Oct 23, 2019 at 12:43:02 +0200, Andrea Bolognani wrote:
Now that the only data we need for fully testing a QEMU binary is the (version, arch) combo, we can stop providing that information ourselves and instead rely on testQemuCapsIterate() automatically picking up new input files as they are added to the repository, the same way the qemucapabilities and qemucaps2xml tests already behave.
Unsurprisingly, this change results in a bunch of extra output files being created, significantly expanding our test coverage.
Signed-off-by: Andrea Bolognani <abologna@redhat.com> ... + /* + * Run "tests/qemucapsprobe /path/to/qemu/binary >foo.replies" + * to generate updated or new *.replies data files. + * + * If you manually edit replies files you can run + * "tests/qemucapsfixreplies foo.replies" to fix the replies ids. + * + * Once a replies file has been generated and tweaked if necessary, + * you can drop it into tests/qemucapabilitiesdata/ (with a sensible + * name - look at what's already there for inspiration) and test + * programs will automatically pick it up. + * + * To generate the corresponding output files after a new replies + * file has been added, run "VIR_TEST_REGENERATE_OUTPUT=1 make check". + */
I'd just suggest running VIR_TEST_REGENERATE_OUTPUT=1 tests/qemucapabilitiestest followed by VIR_TEST_REGENERATE_OUTPUT=1 tests/domaincapstest For the whole series: Reviewed-by: Jiri Denemark <jdenemar@redhat.com>

On Thu, 2019-10-24 at 16:37 +0200, Jiri Denemark wrote:
On Wed, Oct 23, 2019 at 12:43:02 +0200, Andrea Bolognani wrote:
+ /* + * Run "tests/qemucapsprobe /path/to/qemu/binary >foo.replies" + * to generate updated or new *.replies data files. + * + * If you manually edit replies files you can run + * "tests/qemucapsfixreplies foo.replies" to fix the replies ids. + * + * Once a replies file has been generated and tweaked if necessary, + * you can drop it into tests/qemucapabilitiesdata/ (with a sensible + * name - look at what's already there for inspiration) and test + * programs will automatically pick it up. + * + * To generate the corresponding output files after a new replies + * file has been added, run "VIR_TEST_REGENERATE_OUTPUT=1 make check". + */
I'd just suggest running
VIR_TEST_REGENERATE_OUTPUT=1 tests/qemucapabilitiestest
followed by
VIR_TEST_REGENERATE_OUTPUT=1 tests/domaincapstest
The comment is the same as qemucapabilitiestest and qemucaps2xmltest, so we'd have to update those as well... On the other hand, the actual problem is arguably the fact that we have replicated it in the first place. I'll try to come up with a better solution and post a separate patch addressing this issue; in the meantime, I've pushed the series as posted on the list. Thanks for your review! :) -- Andrea Bolognani / Red Hat / Virtualization
participants (2)
-
Andrea Bolognani
-
Jiri Denemark