[libvirt] [PATCH 1/2] Add tests for virUSBDeviceFind functions

Michal Privoznik mprivozn at redhat.com
Thu Feb 27 13:27:42 UTC 2014


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.
> ---
>   .gitignore                                         |   1 +
>   cfg.mk                                             |   3 +-
>   tests/Makefile.am                                  |  12 +
>   tests/virusbtest.c                                 | 268 +++++++++++++++++++++
>   .../sys_bus_usb/devices/1-1.5.3.1/devnum           |   1 +
>   .../sys_bus_usb/devices/1-1.5.3.1/idProduct        |   1 +
>   .../sys_bus_usb/devices/1-1.5.3.1/idVendor         |   1 +
>   .../sys_bus_usb/devices/1-1.5.3.1/serial           |   1 +
>   .../sys_bus_usb/devices/1-1.5.3.3/devnum           |   1 +
>   .../sys_bus_usb/devices/1-1.5.3.3/idProduct        |   1 +
>   .../sys_bus_usb/devices/1-1.5.3.3/idVendor         |   1 +
>   .../sys_bus_usb/devices/1-1.5.3.3/serial           |   1 +
>   .../sys_bus_usb/devices/1-1.5.3/devnum             |   1 +
>   .../sys_bus_usb/devices/1-1.5.3/idProduct          |   1 +
>   .../sys_bus_usb/devices/1-1.5.3/idVendor           |   1 +
>   .../sys_bus_usb/devices/1-1.5.3/serial             |   1 +
>   .../sys_bus_usb/devices/1-1.5.4/devnum             |   1 +
>   .../sys_bus_usb/devices/1-1.5.4/idProduct          |   1 +
>   .../sys_bus_usb/devices/1-1.5.4/idVendor           |   1 +
>   .../sys_bus_usb/devices/1-1.5.4/serial             |   1 +
>   .../sys_bus_usb/devices/1-1.5.5/devnum             |   1 +
>   .../sys_bus_usb/devices/1-1.5.5/idProduct          |   1 +
>   .../sys_bus_usb/devices/1-1.5.5/idVendor           |   1 +
>   .../sys_bus_usb/devices/1-1.5.5/serial             |   1 +
>   .../sys_bus_usb/devices/1-1.5.6/devnum             |   1 +
>   .../sys_bus_usb/devices/1-1.5.6/idProduct          |   1 +
>   .../sys_bus_usb/devices/1-1.5.6/idVendor           |   1 +
>   .../sys_bus_usb/devices/1-1.5.6/serial             |   1 +
>   .../sys_bus_usb/devices/1-1.5/devnum               |   1 +
>   .../sys_bus_usb/devices/1-1.5/idProduct            |   1 +
>   .../sys_bus_usb/devices/1-1.5/idVendor             |   1 +
>   .../sys_bus_usb/devices/1-1.5/serial               |   1 +
>   .../sys_bus_usb/devices/1-1.6/devnum               |   1 +
>   .../sys_bus_usb/devices/1-1.6/idProduct            |   1 +
>   .../sys_bus_usb/devices/1-1.6/idVendor             |   1 +
>   .../sys_bus_usb/devices/1-1.6/serial               |   1 +
>   .../virusbtestdata/sys_bus_usb/devices/1-1/devnum  |   1 +
>   .../sys_bus_usb/devices/1-1/idProduct              |   1 +
>   .../sys_bus_usb/devices/1-1/idVendor               |   1 +
>   .../virusbtestdata/sys_bus_usb/devices/1-1/serial  |   1 +
>   .../sys_bus_usb/devices/2-1.2/devnum               |   1 +
>   .../sys_bus_usb/devices/2-1.2/idProduct            |   1 +
>   .../sys_bus_usb/devices/2-1.2/idVendor             |   1 +
>   .../sys_bus_usb/devices/2-1.2/serial               |   1 +
>   .../virusbtestdata/sys_bus_usb/devices/2-1/devnum  |   1 +
>   .../sys_bus_usb/devices/2-1/idProduct              |   1 +
>   .../sys_bus_usb/devices/2-1/idVendor               |   1 +
>   .../virusbtestdata/sys_bus_usb/devices/2-1/serial  |   1 +
>   .../virusbtestdata/sys_bus_usb/devices/usb1/devnum |   1 +
>   .../sys_bus_usb/devices/usb1/idProduct             |   1 +
>   .../sys_bus_usb/devices/usb1/idVendor              |   1 +
>   .../virusbtestdata/sys_bus_usb/devices/usb1/serial |   1 +
>   .../virusbtestdata/sys_bus_usb/devices/usb2/devnum |   1 +
>   .../sys_bus_usb/devices/usb2/idProduct             |   1 +
>   .../sys_bus_usb/devices/usb2/idVendor              |   1 +
>   .../virusbtestdata/sys_bus_usb/devices/usb2/serial |   1 +
>   .../virusbtestdata/sys_bus_usb/devices/usb3/devnum |   1 +
>   .../sys_bus_usb/devices/usb3/idProduct             |   1 +
>   .../sys_bus_usb/devices/usb3/idVendor              |   1 +
>   .../virusbtestdata/sys_bus_usb/devices/usb3/serial |   1 +
>   .../virusbtestdata/sys_bus_usb/devices/usb4/devnum |   1 +
>   .../sys_bus_usb/devices/usb4/idProduct             |   1 +
>   .../sys_bus_usb/devices/usb4/idVendor              |   1 +
>   .../virusbtestdata/sys_bus_usb/devices/usb4/serial |   1 +
>   64 files changed, 343 insertions(+), 1 deletion(-)
>   create mode 100644 tests/virusbtest.c
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/devnum
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/idProduct
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/idVendor
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/serial
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.3/devnum
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.3/idProduct
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.3/idVendor
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.3/serial
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3/devnum
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3/idProduct
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3/idVendor
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3/serial
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.4/devnum
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.4/idProduct
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.4/idVendor
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.4/serial
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.5/devnum
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.5/idProduct
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.5/idVendor
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.5/serial
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.6/devnum
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.6/idProduct
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.6/idVendor
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5.6/serial
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5/devnum
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5/idProduct
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5/idVendor
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.5/serial
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.6/devnum
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.6/idProduct
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.6/idVendor
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1.6/serial
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1/devnum
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1/idProduct
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1/idVendor
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/1-1/serial
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/2-1.2/devnum
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/2-1.2/idProduct
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/2-1.2/idVendor
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/2-1.2/serial
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/2-1/devnum
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/2-1/idProduct
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/2-1/idVendor
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/2-1/serial
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb1/devnum
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb1/idProduct
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb1/idVendor
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb1/serial
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb2/devnum
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb2/idProduct
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb2/idVendor
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb2/serial
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb3/devnum
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb3/idProduct
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb3/idVendor
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb3/serial
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb4/devnum
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb4/idProduct
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb4/idVendor
>   create mode 100644 tests/virusbtestdata/sys_bus_usb/devices/usb4/serial
>
> diff --git a/.gitignore b/.gitignore
> index 69c81df..f6dc440 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -218,6 +218,7 @@
>   /tests/virsystemdtest
>   /tests/virtimetest
>   /tests/viruritest
> +/tests/virusbtest
>   /tests/vmwarevertest
>   /tests/vmx2xmltest
>   /tests/xencapstest
> diff --git a/cfg.mk b/cfg.mk
> index fa2638f..ff889b9 100644
> --- a/cfg.mk
> +++ b/cfg.mk
> @@ -941,7 +941,8 @@ exclude_file_name_regexp--sc_bindtextdomain = ^(tests|examples)/
>   exclude_file_name_regexp--sc_copyright_usage = \
>     ^COPYING(|\.LESSER)$$
>
> -exclude_file_name_regexp--sc_flags_usage = ^(docs/|src/util/virnetdevtap\.c$$|tests/vir(cgroup|pci)mock\.c$$)
> +exclude_file_name_regexp--sc_flags_usage = \
> +  ^(docs/|src/util/virnetdevtap\.c$$|tests/vir(cgroup|pci)mock\.c$$|tests/virusbtest\.c$$)
>
>   exclude_file_name_regexp--sc_libvirt_unmarked_diagnostics = \
>     ^(src/rpc/gendispatch\.pl$$|tests/)
> diff --git a/tests/Makefile.am b/tests/Makefile.am
> index c374f14..3ce1c2c 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -149,6 +149,7 @@ test_programs = virshtest sockettest \
>   	virkmodtest \
>   	vircapstest \
>   	domainconftest \
> +	virusbtest \
>   	$(NULL)
>
>   if WITH_REMOTE
> @@ -330,6 +331,7 @@ EXTRA_DIST += $(test_scripts)
>
>   test_libraries = libshunload.la \
>   		libvirportallocatormock.la \
> +		virusbmock.la \
>   		virnetserverclientmock.la \
>   		vircgroupmock.la \
>   		virpcimock.la \
> @@ -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.

> +
>   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.

> +    } 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;
> +}
> +

> diff --git a/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/devnum b/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/devnum
> new file mode 100644
> index 0000000..98d9bcb
> --- /dev/null
> +++ b/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/devnum
> @@ -0,0 +1 @@
> +17
> diff --git a/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/idProduct b/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/idProduct
> new file mode 100644
> index 0000000..211990d
> --- /dev/null
> +++ b/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/idProduct
> @@ -0,0 +1 @@
> +301b
> diff --git a/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/idVendor b/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/idVendor
> new file mode 100644
> index 0000000..489f206
> --- /dev/null
> +++ b/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/idVendor
> @@ -0,0 +1 @@
> +04b3
> diff --git a/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/serial b/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.1/serial
> new file mode 100644
> index 0000000..8b13789
> --- /dev/null
> +++ 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


> diff --git a/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.3/devnum b/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.3/devnum
> new file mode 100644
> index 0000000..3c03207
> --- /dev/null
> +++ b/tests/virusbtestdata/sys_bus_usb/devices/1-1.5.3.3/devnum
> @@ -0,0 +1 @@
> +18

Okay, devnum is nowhere too:

# find /sys/bus/usb/ -name devnum | wc -l
0

But apartently we are accessing it in virUSBDeviceSearch().

Michal




More information about the libvir-list mailing list