[PATCH libevdev 2/6] test: add uinput creation tests

Peter Hutterer peter.hutterer at who-t.net
Wed Aug 14 15:03:30 PDT 2013


On Wed, Aug 14, 2013 at 02:52:52PM +0200, Benjamin Tissoires wrote:
> On Tue, Aug 13, 2013 at 12:39 PM, Peter Hutterer
> <peter.hutterer at who-t.net> wrote:
> > Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> > ---
> >  test/Makefile.am   |   1 +
> >  test/test-main.c   |   2 +
> >  test/test-uinput.c | 176 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 179 insertions(+)
> >  create mode 100644 test/test-uinput.c
> >
> > diff --git a/test/Makefile.am b/test/Makefile.am
> > index 8cad6c7..cabd1bf 100644

[...]

> > +START_TEST(test_uinput_check_syspath_time)
> > +{
> > +       struct libevdev *dev;
> > +       struct libevdev_uinput *uidev, *uidev2;
> > +       const char *syspath, *syspath2;
> > +       int fd, fd2;
> > +       int rc;
> > +
> > +       dev = libevdev_new();
> > +       ck_assert(dev != NULL);
> > +       libevdev_set_name(dev, TEST_DEVICE_NAME);
> > +       libevdev_enable_event_type(dev, EV_SYN);
> > +       libevdev_enable_event_type(dev, EV_REL);
> > +       libevdev_enable_event_code(dev, EV_REL, REL_X, NULL);
> > +       libevdev_enable_event_code(dev, EV_REL, REL_Y, NULL);
> > +
> > +       fd = open(UINPUT_NODE, O_RDWR);
> > +       ck_assert_int_gt(fd, -1);
> > +       fd2 = open(UINPUT_NODE, O_RDWR);
> > +       ck_assert_int_gt(fd2, -1);
> > +
> > +       rc = libevdev_uinput_create_from_device(dev, fd, &uidev);
> > +       ck_assert_int_eq(rc, 0);
> > +
> > +       /* sleep for 1.5 seconds so syspath gives us something useful */
> 
> I would have said that the function
> libevdev_uinput_create_from_device() blocks until the input device is
> registered. So either the usleep is not required, either the comment
> is not very helpful (I can understand that this will help having
> different file stats for different calls, but this should be explicit
> IMO)
> 
> > +       usleep(1500000);
> > +
> > +       /* create a second one to stress the syspath filtering code */
> 
> waiting for 1.5 sec between the two call will not stress the syspath
> filtering code :)

well, in this case it does though 'stress' is probably the wrong word.
ctime is taken before and after UI_DEV_CREATE, but since it's in seconds the
two will almost always be the same. The first check the syspath filtering
code does is check for time less/greater than the two ctimes.

that low resolution also means if we start up two devices with the same
name within the same second, we can't differentiate between the two. that's
what the wait is for, it's between two libevdev_uinput_create_from_device()
calls. that way the ctime of the second device is definitely higher than the
ctime of the first device.

how about this diff then:

diff --git a/test/test-uinput.c b/test/test-uinput.c
index 449099f..9d7fa85 100644
--- a/test/test-uinput.c
+++ b/test/test-uinput.c
@@ -110,10 +110,15 @@ START_TEST(test_uinput_check_syspath_time)
 	rc = libevdev_uinput_create_from_device(dev, fd, &uidev);
 	ck_assert_int_eq(rc, 0);
 
-	/* sleep for 1.5 seconds so syspath gives us something useful */
+	/* sleep for 1.5 seconds. sysfs resolution is 1 second, so
+	   creating both devices without delay means
+	   libevdev_uinput_get_syspath can't actually differ between
+	   them. By waiting, we get different ctime for uidev and uidev2,
+	   and exercise that part of the code.
+	 */
 	usleep(1500000);
 
-	/* create a second one to stress the syspath filtering code */
+	/* create a second one to test the syspath time filtering code */
 	rc = libevdev_uinput_create_from_device(dev, fd2, &uidev2);
 	ck_assert_int_eq(rc, 0);
 


Cheers,
   Peter

> > +       rc = libevdev_uinput_create_from_device(dev, fd2, &uidev2);
> > +       ck_assert_int_eq(rc, 0);
> > +
> > +       syspath = libevdev_uinput_get_syspath(uidev);
> > +       ck_assert(syspath != NULL);
> > +
> > +       /* get syspath twice returns same pointer */
> > +       syspath2 = libevdev_uinput_get_syspath(uidev);
> > +       ck_assert(syspath == syspath2);
> > +
> > +       /* second dev has different syspath */
> > +       syspath2 = libevdev_uinput_get_syspath(uidev2);
> > +       ck_assert(strcmp(syspath, syspath2) != 0);
> > +
> > +       libevdev_free(dev);
> > +       libevdev_uinput_destroy(uidev);
> > +       libevdev_uinput_destroy(uidev2);
> > +
> > +       close(fd);
> > +       close(fd2);
> > +}
> > +END_TEST
> > +
> > +START_TEST(test_uinput_check_syspath_name)
> > +{
> > +       struct libevdev *dev;
> > +       struct libevdev_uinput *uidev, *uidev2;
> > +       const char *syspath, *syspath2;
> > +       int fd, fd2;
> > +       int rc;
> > +
> > +       dev = libevdev_new();
> > +       ck_assert(dev != NULL);
> > +       libevdev_set_name(dev, TEST_DEVICE_NAME);
> > +       libevdev_enable_event_type(dev, EV_SYN);
> > +       libevdev_enable_event_type(dev, EV_REL);
> > +       libevdev_enable_event_code(dev, EV_REL, REL_X, NULL);
> > +       libevdev_enable_event_code(dev, EV_REL, REL_Y, NULL);
> > +
> > +       fd = open(UINPUT_NODE, O_RDWR);
> > +       ck_assert_int_gt(fd, -1);
> > +       fd2 = open(UINPUT_NODE, O_RDWR);
> > +       ck_assert_int_gt(fd2, -1);
> > +
> > +       rc = libevdev_uinput_create_from_device(dev, fd, &uidev);
> > +       ck_assert_int_eq(rc, 0);
> > +
> > +       /* create a second one to stress the syspath filtering code */
> > +       libevdev_set_name(dev, TEST_DEVICE_NAME " 2");
> > +       rc = libevdev_uinput_create_from_device(dev, fd2, &uidev2);
> > +       ck_assert_int_eq(rc, 0);
> > +
> > +       syspath = libevdev_uinput_get_syspath(uidev);
> > +       ck_assert(syspath != NULL);
> > +
> > +       /* get syspath twice returns same pointer */
> > +       syspath2 = libevdev_uinput_get_syspath(uidev);
> > +       ck_assert(syspath == syspath2);
> > +
> > +       /* second dev has different syspath */
> > +       syspath2 = libevdev_uinput_get_syspath(uidev2);
> > +       ck_assert(strcmp(syspath, syspath2) != 0);
> > +
> > +       libevdev_free(dev);
> > +       libevdev_uinput_destroy(uidev);
> > +       libevdev_uinput_destroy(uidev2);
> > +
> > +       close(fd);
> > +       close(fd2);
> > +}
> > +END_TEST
> > +
> > +Suite *
> > +uinput_suite(void)
> > +{
> > +       Suite *s = suite_create("libevdev uinput device tests");
> > +
> > +       TCase *tc = tcase_create("device creation");
> > +       tcase_add_test(tc, test_uinput_create_device);
> > +       tcase_add_test(tc, test_uinput_check_syspath_time);
> > +       tcase_add_test(tc, test_uinput_check_syspath_name);
> > +       suite_add_tcase(s, tc);
> > +
> > +       return s;
> > +}
> > --
> > 1.8.2.1
> >
> > _______________________________________________
> > Input-tools mailing list
> > Input-tools at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/input-tools
> 


More information about the Input-tools mailing list