On 02/27/2014 02:27 PM, Michal Privoznik wrote:
On 26.02.2014 17:54, Ján Tomko wrote:
> Mock the /sys/bus/usb directory and test the finding
> (and not finding) of some USB devices.
> ---
> @@ -815,6 +817,16 @@ virpcimock_la_LIBADD = $(GNULIB_LIBS) \
> virpcimock_la_LDFLAGS = -module -avoid-version \
> -rpath /evil/libtool/hack/to/force/shared/lib/creation
>
> +virusbtest_SOURCES = \
> + virusbtest.c testutils.h testutils.c
> +virusbtest_LDADD = $(LDADDS)
> +
> +virusbmock_la_SOURCES = \
> + virusbtest.c
> +virusbmock_la_CFLAGS = $(AM_CFLAGS) -DMOCK_HELPER=1
> +virusbmock_la_LDFLAGS = -module -avoid-version \
> + -rpath /evil/libtool/hack/to/force/shared/lib/creation
Is there any specific reason why the mock functions are not in a separate
file? We have that pattern already.
This pattern is used by virportallocatortests, which I touched last :)
In both cases, I think the test should only be run on Linux, since Eric showed
that #if HAVE_DLFCN_H is not enough for Cygwin and most of the virusb.c file
is Linux-specific.
> +
> if WITH_DBUS
> virdbustest_SOURCES = \
> virdbustest.c testutils.h testutils.c
> diff --git a/tests/virusbtest.c b/tests/virusbtest.c
> new file mode 100644
> index 0000000..f9104bf
> --- /dev/null
> +++ b/tests/virusbtest.c
> +static int testDeviceFind(const void *opaque)
> +{
> + const struct findTestInfo *info = opaque;
> + int ret = -1;
> + virUSBDevicePtr dev = NULL;
> + virUSBDeviceListPtr devs = NULL;
> + int rv = 0;
> + size_t i, ndevs = 0;
> +
> + switch (info->how) {
> + case FIND_BY_ALL:
> + rv = virUSBDeviceFind(info->vendor, info->product,
> + info->bus, info->devno,
> + info->vroot, info->mandatory, &dev);
> + break;
> + case FIND_BY_VENDOR:
> + rv = virUSBDeviceFindByVendor(info->vendor, info->product,
> + info->vroot, info->mandatory,
&devs);
> + break;
> + case FIND_BY_BUS:
> + rv = virUSBDeviceFindByBus(info->bus, info->devno,
> + info->vroot, info->mandatory, &dev);
> + break;
> + }
> +
> + if (info->expectFailure) {
> + if (rv == 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + "unexpected success");
> + goto cleanup;
> + }
Would it make sense to:
ret = 0;
goto cleanup;
since tesing either an empty device list or NULL dev doesn't make much sense?
I know you're calling FileIterate only when there's something to call it on,
but sill.
Yes, that might look nicer.
> + } else if (rv < 0) {
> + goto cleanup;
> + }
> +
> + if (dev && virUSBDeviceFileIterate(dev, testDeviceFileActor, NULL) <
0)
> + goto cleanup;
> +
> + if (devs)
> + ndevs = virUSBDeviceListCount(devs);
> +
> + for (i = 0; i < ndevs; i++) {
> + virUSBDevicePtr device = virUSBDeviceListGet(devs, i);
> + if (virUSBDeviceFileIterate(device, testDeviceFileActor, NULL) < 0)
> + goto cleanup;
> + }
> +
> + ret = 0;
> +
> +cleanup:
> + virObjectUnref(devs);
> + virUSBDeviceFree(dev);
> + return ret;
> +}
> +
> +++ b/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/serial
> @@ -0,0 +1 @@
> +
Why are you creating these /serial files? They don't seem to be used anywhere,
moreover, they seem to not exists even in real sysfs (at least on my system):
# find /sys/bus/usb/ -name serial | wc -l
0
I was hoping to dig out the patch adding support for specifying USB devices by
serials someday, but they don't really belong in this patch.
Thanks,
Jan