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(a)redhat.com>
---
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