On Fri, Apr 09, 2021 at 05:14:41PM +0200, Peter Krempa wrote:
Hi,
recently I've got very annoyed that we still have a very large amount of
tests in qemuxml2argvtest which use DO_TEST or some other fake-caps
test.
While I can see value of fake-caps test for negative cases (but I'd
prefer actually real-caps with capability masking) I don't think there's
much value in keeping the DO_TEST fake-caps stuff around.
Namely in most cases it doesn't test anything useful which could be
encountered in real world.
I propose that we convert all DO_TEST cases to:
- DO_TEST_CAPS_LATEST
- and possibly a amount of version-bound tests based on:
- oldest supported version?
- versions in popular distros?
- none?
- any ideas?
For the negative cases we can think of the caps masking or other
approach but getting rid of DO_TEST would IMO be a great step forward in
terms of usefullnes of our unit tests.
First off, the goal for the tests is to get the maximum coverage
at the lowest execution time, and lowest number of test data fies.
Much easier said, than done.
We have a massive amount of overlap in tests, as many of the XML
files are very broad. eg almost every test has a <disk>, even if
the test is unrelated to disks.
When considering the capabilities I think we only have a couple
of distinct situations:
1. Capabilities tracking the introduction of a feature.
2. Capabilities tracking changed syntax for configuring a feature
For the first scenario we need a test that is at least as new
as the version where it was introduced.
For the second scenario we need a test that is at least as new
as the version where it was introduced, and also a test that is
at least as old as the version prior to where the syntax changed.
DO_TEST_CAPS_LATEST covers scenario (1) and the first half
of scenario (2). For the second halve of scenario (2) we
also need a DO_TEST_CAPS_VER.
The downside with DO_TEST_CAPS_LATEST though is that any
time the latest caps change, we cause churn over any .args
files that are impacted. This is compounded by the overly
broad XML in many tests - eg watchdog.xml has a <disk>
so its .args file is impacted when disk handling changes,
even though it is a watchdog test.
To get full coverage of the different arg combinations, it
ought to be sufficient to test at the initial transition
point.
eg if we have a disk-cdrom.xml file, we should only need to
test at the oldest caps that we have to cover -drive and
the first caps that introduced -blockdev.
The question is what happens when -blockdev-ng arrives.
We want to have coverage of this new arg.
Using DO_TEST_CAPS_LATEST gets that coverage, but at a quite
large cost. Basically it is a big hammer approach that lets us
ignore what tests are actually needed to get minimal desired
coverage, and instead just test everything.
One thing that is clearly bad with plain DO_TEST() is that
due to the individual listed capability flags, we end up
generating an frankenstein argv that has no relation to a
real world QEMU version.
Also we have _ARCH variants which are arguably redundant.
We can just get the arch from /domain/os/type/@arch after
parsing the XML and use that to find the .args file.
Overall I'd say we should aim to test at the initial
transition points, where a feature is first introduced,
and exclusively use capabilities sets captured from real
QEMU binaries.
Ideally I think we should have a single "DO_TEST" which
just accepts a QEMU version number.
DO_TEST("2.12.0", "disk-cdrom");
DO_TEST("5.0.0", "disk-cdrom");
This gets us coverage of the two different ways disks are
configured, without churn from newer versions. If we did
get a -blockdev-ng, we can add DO_TEST("10.0.0", "disk-cdrom")
and for the few other relevant tests.
Regards,
Daniel
--
|:
https://berrange.com -o-
https://www.flickr.com/photos/dberrange :|
|:
https://libvirt.org -o-
https://fstop138.berrange.com :|
|:
https://entangle-photo.org -o-
https://www.instagram.com/dberrange :|