On Thu, Oct 31, 2013 at 11:23:39AM +0000, Michal Privoznik wrote: > This commit introduces yet another test under virpcitest: > virPCIDeviceDetach. However, in order to be able to do this, the > virpcimock needs to be extended to model the kernel behavior on PCI > device binding and unbinding (create 'driver' symlinks under the device > tree, check for device ID in driver's ID table, etc.) > > Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> > --- > cfg.mk | 2 +- > tests/Makefile.am | 10 +- > tests/virpcimock.c | 603 ++++++++++++++++++++++++++++++++++++++++++++++++++++- > tests/virpcitest.c | 42 ++++ > 4 files changed, 652 insertions(+), 5 deletions(-) > [...] > diff --git a/tests/virpcimock.c b/tests/virpcimock.c > index d545361..2adc337 100644 > --- a/tests/virpcimock.c > +++ b/tests/virpcimock.c > @@ -163,12 +323,367 @@ pci_device_new_from_stub(const struct pciDevice *data) [...] > +static int > +pci_driver_handle_unbind(const char *path) > +{ > + int ret = -1; > + struct pciDevice *dev = pci_device_find_by_content(path); > + > + if (!dev || !dev->driver) { > + /* This should never happen (TM) */ > + errno = ENODEV; > + goto cleanup; > + } > + > + ret = pci_driver_unbind(dev->driver, dev); > +cleanup: > + return ret; > +} One more newline here? I missed that in v1 ;-) > +static int > +pci_driver_handle_new_id(const char *path) > +{ [...] > @@ -195,7 +710,10 @@ init_syms(void) > > LOAD_SYM(access); > LOAD_SYM_ALT(lstat, __lxstat); > + LOAD_SYM_ALT(stat, __xstat); I couldn't find what you need stat() for, but this works and makes no harm. Moreover it makes us sure there won't be any stat() done wrong in the future. [...] > diff --git a/tests/virpcitest.c b/tests/virpcitest.c > index 96f11d6..3eaa469 100644 > --- a/tests/virpcitest.c > +++ b/tests/virpcitest.c > @@ -60,6 +60,47 @@ cleanup: > return ret; > } > > +# define CHECK_LIST_COUNT(list, cnt) \ > + if ((count = virPCIDeviceListCount(list)) != cnt) { \ > + virReportError(VIR_ERR_INTERNAL_ERROR, \ > + "Unexpected count of items in " #list ": %d, " \ > + "expecting " #cnt, count); \ > + goto cleanup; \ > + } > + > +static int > +testVirPCIDeviceDetach(const void *oaque ATTRIBUTE_UNUSED) > +{ > + int ret = -1; > + virPCIDevicePtr dev; > + virPCIDeviceListPtr activeDevs = NULL, inactiveDevs = NULL; > + int count; > + > + if (!(dev = virPCIDeviceNew(0, 0, 1, 0)) || > + !(activeDevs = virPCIDeviceListNew()) || > + !(inactiveDevs = virPCIDeviceListNew())) > + goto cleanup; > + > + CHECK_LIST_COUNT(activeDevs, 0); > + CHECK_LIST_COUNT(inactiveDevs, 0); > + > + if (virPCIDeviceSetStubDriver(dev, "pci-stub") < 0) > + goto cleanup; > + > + if (virPCIDeviceDetach(dev, activeDevs, inactiveDevs) < 0) > + goto cleanup; > + virPCIDeviceDetach() adds a copy, I missed that, thanks. [...] It's almost the same as v1 (with one leak fixed and stat() mocking added), so the same as for v1 applies here. Martin
Attachment:
signature.asc
Description: Digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list