diff --git a/tests/virpcitest.c b/tests/virpcitest.c index cfd5cce519..994b30036d 100644 --- a/tests/virpcitest.c +++ b/tests/virpcitest.c @@ -258,6 +258,37 @@ cleanup: return ret; } +static int +testVirPCIDeviceDetachFail(const void *opaque) +{ + const struct testPCIDevData *data = opaque; + int ret = -1; + virPCIDevicePtr dev; + + dev = virPCIDeviceNew(data->domain, data->bus, data->slot, data->function); + if (!dev) + goto cleanup; + + if (virPCIDeviceSetStubDriver(dev, "vfio-pci") < 0) + goto cleanup; + + if (virPCIDeviceDetach(dev, NULL, NULL) < 0) { + if (virTestGetVerbose() || virTestGetDebug()) + virDispatchError(NULL); + virResetLastError(); + ret = 0; + } else { + virReportError(VIR_ERR_INTERNAL_ERROR, + "Attaching device %s to %s should have failed", + virPCIDeviceGetName(dev), + virPCIDeviceGetStubDriver(dev)); + } + +cleanup: + virPCIDeviceFree(dev); + return ret; +} + static int testVirPCIDeviceReattachSingle(const void *opaque) { @@ -390,6 +421,8 @@ mymain(void) DO_TEST_PCI(testVirPCIDeviceIsAssignable, 5, 0x90, 1, 0); DO_TEST_PCI(testVirPCIDeviceIsAssignable, 1, 1, 0, 0); + DO_TEST_PCI(testVirPCIDeviceDetachFail, 0, 0x0a, 1, 0); + /* Reattach a device already bound to non-stub a driver */ DO_TEST_PCI_DRIVER(0, 0x0a, 1, 0, "i915"); DO_TEST_PCI(testVirPCIDeviceReattachSingle, 0, 0x0a, 1, 0);