[PATCH libinput] test: add an extra loop for slow udev initialization

Peter Hutterer peter.hutterer at who-t.net
Mon May 25 19:56:19 PDT 2015


On slower machines, e.g. VMs, udev isn't fast enough to get the properties set
up by the time we're trying to get the device going. This fails when we try to
add the device with libinput_path_add_device().

We know that all litest devices will have ID_INPUT set, so check for that
before we continue.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
If anyone has any better ideas here, I'm all ears.

 test/litest.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/test/litest.c b/test/litest.c
index fbbdaeb..d9cf452 100644
--- a/test/litest.c
+++ b/test/litest.c
@@ -985,6 +985,32 @@ 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, 300);
+
+		udev_device_unref(device);
+		msleep(2);
+		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,
@@ -1012,6 +1038,8 @@ 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);
-- 
2.4.1



More information about the wayland-devel mailing list