From 753cb25abb4c52135b88d2bf44d0dc9073552abf Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 25 May 2015 20:44:16 -0400 Subject: [PATCH] test: add an extra loop for slow udev initialization 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 Reviewed-by: Hans de Goede --- test/litest.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/test/litest.c b/test/litest.c index 8221a7a..96ea4ec 100644 --- a/test/litest.c +++ b/test/litest.c @@ -977,6 +977,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, @@ -1004,6 +1030,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.7.4