On 6/26/25 10:47, Daniel P. Berrangé via Devel wrote:
From: Daniel P. Berrangé <berrange(a)redhat.com>
The USB vendor/product is usually translated into a device/bus at
startup using the hostdev logic. We don't run the latter in the
unit test suite, but we can fake it by hardcoding a translation.
This demonstrates that we format the command line with the normal
device/bus properties, even when vendor/product is set.
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
...tdev-usb-vendor-product.x86_64-latest.args | 35 +++++++++++++++
...stdev-usb-vendor-product.x86_64-latest.xml | 44 +++++++++++++++++++
.../hostdev-usb-vendor-product.xml | 36 +++++++++++++++
tests/qemuxmlconftest.c | 18 ++++++++
4 files changed, 133 insertions(+)
create mode 100644 tests/qemuxmlconfdata/hostdev-usb-vendor-product.x86_64-latest.args
create mode 100644 tests/qemuxmlconfdata/hostdev-usb-vendor-product.x86_64-latest.xml
create mode 100644 tests/qemuxmlconfdata/hostdev-usb-vendor-product.xml
Kudos for these test XMLs, but ...
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
index f74bd2bb7a..fe90f029d9 100644
--- a/tests/qemuxmlconftest.c
+++ b/tests/qemuxmlconftest.c
@@ -474,6 +474,23 @@ testCompareXMLToArgvCreateArgs(virQEMUDriver *drv,
}
}
+ for (i = 0; i < vm->def->nhostdevs; i++) {
+ virDomainHostdevDef *hostdev = vm->def->hostdevs[i];
+
+ if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
+ hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) {
+ virDomainHostdevSubsysUSB *usb = &hostdev->source.subsys.u.usb;
+ if (!usb->device && !usb->bus) {
+ if (usb->vendor == 0x1234 && usb->product == 0x4321) {
+ usb->bus = 42;
+ usb->device = 0x1234;
+ } else {
+ g_assert_not_reached();
+ }
+ }
+ }
+ }
+
.. for this I think we can do a bit better. We already have virusbmock
which would handle looking up USB devices in our fake USBSYS structure
(tests/virusbtestdata/). But for that we would need slightly more code,
so lets merge this and I'll post patches that use mocking.
BTW: if anybody will want to try that on their own, they'll need the
following patch to make chaining of our mocks actually work:
https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/message/B...
if (flags & FLAG_SLIRP_HELPER) {
for (i = 0; i < vm->def->nnets; i++) {
virDomainNetDef *net = vm->def->nets[i];
@@ -2118,6 +2135,7 @@ mymain(void)
DO_TEST_CAPS_LATEST("hostdev-usb-address-device");
DO_TEST_CAPS_LATEST("hostdev-usb-address-device-boot");
DO_TEST_CAPS_LATEST_PARSE_ERROR("hostdev-usb-duplicate");
+ DO_TEST_CAPS_LATEST("hostdev-usb-vendor-product");
DO_TEST_CAPS_LATEST("hostdev-pci-address");
DO_TEST_CAPS_LATEST("hostdev-pci-address-device");
DO_TEST_CAPS_LATEST_PARSE_ERROR("hostdev-pci-duplicate");
Reviewed-by: Michal Privoznik <mprivozn(a)redhat.com>
Michal