[PATCH libinput 1/3] test: wait for the uinput_monitor on test devices

Hans de Goede hdegoede at redhat.com
Thu Jul 2 04:44:15 PDT 2015


Hi,

On 02-07-15 09:46, Peter Hutterer wrote:
> Set up a udev_monitor before each device creation and wait for the monitor to
> notify us of the newly created device. This should take the place of the
> various sleep loops  we currently have sprinkled around the code and provide a
> reliability when testing.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

The entire series LGTM: Reviewed-by: Hans de Goede <hdegoede at redhat.com>

Regards,

Hans


> ---
>   test/litest.c | 96 ++++++++++++++++++++++++++++++++++++-----------------------
>   1 file changed, 58 insertions(+), 38 deletions(-)
>
> diff --git a/test/litest.c b/test/litest.c
> index 0c5eedb..a5eeb5a 100644
> --- a/test/litest.c
> +++ b/test/litest.c
> @@ -44,6 +44,7 @@
>   #include <sys/sendfile.h>
>   #include <sys/timerfd.h>
>   #include <sys/wait.h>
> +#include <libudev.h>
>
>   #include "litest.h"
>   #include "litest-int.h"
> @@ -1079,32 +1080,6 @@ litest_restore_log_handler(struct libinput *libinput)
>   	libinput_log_set_handler(libinput, litest_log_handler);
>   }
>
> -static inline void
> -litest_wait_for_udev(int fd)
> -{
> -	struct udev *udev;
> -	struct udev_device *device;
> -	struct stat st;
> -	int loop_count = 0;
> -
> -	litest_assert_int_ge(fstat(fd, &st), 0);
> -
> -	udev = udev_new();
> -	device = udev_device_new_from_devnum(udev, 'c', st.st_rdev);
> -	litest_assert_ptr_notnull(device);
> -	while (device && !udev_device_get_property_value(device, "ID_INPUT")) {
> -		loop_count++;
> -		litest_assert_int_lt(loop_count, 200);
> -
> -		udev_device_unref(device);
> -		msleep(10);
> -		device = udev_device_new_from_devnum(udev, 'c', st.st_rdev);
> -	}
> -
> -	udev_device_unref(device);
> -	udev_unref(udev);
> -}
> -
>   struct litest_device *
>   litest_add_device_with_overrides(struct libinput *libinput,
>   				 enum litest_device_type which,
> @@ -1132,8 +1107,6 @@ litest_add_device_with_overrides(struct libinput *libinput,
>   	rc = libevdev_new_from_fd(fd, &d->evdev);
>   	litest_assert_int_eq(rc, 0);
>
> -	litest_wait_for_udev(fd);
> -
>   	d->libinput = libinput;
>   	d->libinput_device = libinput_path_add_device(d->libinput, path);
>   	litest_assert(d->libinput_device != NULL);
> @@ -1220,11 +1193,6 @@ litest_delete_device(struct litest_device *d)
>   	free(d->private);
>   	memset(d,0, sizeof(*d));
>   	free(d);
> -
> -	/* zzz so udev can catch up with things, so we don't accidentally open
> -	 * an old device in the next test and then get all upset when things blow
> -	 * up */
> -	msleep(10);
>   }
>
>   void
> @@ -1756,11 +1724,11 @@ litest_assert_empty_queue(struct libinput *li)
>   	litest_assert(empty_queue);
>   }
>
> -struct libevdev_uinput *
> -litest_create_uinput_device_from_description(const char *name,
> -					     const struct input_id *id,
> -					     const struct input_absinfo *abs_info,
> -					     const int *events)
> +static struct libevdev_uinput *
> +litest_create_uinput(const char *name,
> +		     const struct input_id *id,
> +		     const struct input_absinfo *abs_info,
> +		     const int *events)
>   {
>   	struct libevdev_uinput *uinput;
>   	struct libevdev *dev;
> @@ -1848,6 +1816,58 @@ litest_create_uinput_device_from_description(const char *name,
>   	return uinput;
>   }
>
> +struct libevdev_uinput *
> +litest_create_uinput_device_from_description(const char *name,
> +					     const struct input_id *id,
> +					     const struct input_absinfo *abs_info,
> +					     const int *events)
> +{
> +	struct libevdev_uinput *uinput;
> +	const char *syspath;
> +
> +	struct udev *udev;
> +	struct udev_monitor *udev_monitor;
> +	struct udev_device *udev_device;
> +	const char *udev_action;
> +	const char *udev_syspath;
> +
> +	udev = udev_new();
> +	litest_assert_notnull(udev);
> +	udev_monitor = udev_monitor_new_from_netlink(udev, "udev");
> +	litest_assert_notnull(udev_monitor);
> +	udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "input",
> +							NULL);
> +	/* remove O_NONBLOCK */
> +	fcntl(udev_monitor_get_fd(udev_monitor), F_SETFL, 0);
> +	litest_assert_int_eq(udev_monitor_enable_receiving(udev_monitor),
> +			     0);
> +
> +	uinput = litest_create_uinput(name, id, abs_info, events);
> +
> +	syspath = libevdev_uinput_get_syspath(uinput);
> +
> +	/* blocking, we don't want to continue until udev is ready */
> +	do {
> +		udev_device = udev_monitor_receive_device(udev_monitor);
> +		litest_assert_notnull(udev_device);
> +		udev_action = udev_device_get_action(udev_device);
> +		if (strcmp(udev_action, "add") != 0) {
> +			udev_device_unref(udev_device);
> +			continue;
> +		}
> +
> +		udev_syspath = udev_device_get_syspath(udev_device);
> +	} while (!udev_syspath || strcmp(udev_syspath, syspath) != 0);
> +
> +	litest_assert(udev_device_get_property_value(udev_device, "ID_INPUT"));
> +
> +	udev_device_unref(udev_device);
> +	udev_monitor_unref(udev_monitor);
> +	udev_unref(udev);
> +
> +	return uinput;
> +}
> +
>   static struct libevdev_uinput *
>   litest_create_uinput_abs_device_v(const char *name,
>   				  struct input_id *id,
>


More information about the wayland-devel mailing list