[PATCH libevdev 5/6] test: add test for sending uinput events
Peter Hutterer
peter.hutterer at who-t.net
Wed Aug 14 16:45:58 PDT 2013
On Wed, Aug 14, 2013 at 03:40:50PM +0200, Benjamin Tissoires wrote:
> On Wed, Aug 14, 2013 at 3:28 PM, David Herrmann <dh.herrmann at gmail.com> wrote:
> > Hi
> >
> > On Wed, Aug 14, 2013 at 3:21 PM, Benjamin Tissoires
> > <benjamin.tissoires at gmail.com> 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/test-uinput.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >>> 1 file changed, 64 insertions(+)
> >>>
> >>> diff --git a/test/test-uinput.c b/test/test-uinput.c
> >>> index de5f3f8..c1ffc3a 100644
> >>> --- a/test/test-uinput.c
> >>> +++ b/test/test-uinput.c
> >>> @@ -25,6 +25,7 @@
> >>> #include <linux/input.h>
> >>> #include <errno.h>
> >>> #include <unistd.h>
> >>> +#include <stdlib.h>
> >>> #include <fcntl.h>
> >>> #include <libevdev/libevdev-uinput.h>
> >>>
> >>> @@ -161,6 +162,65 @@ START_TEST(test_uinput_check_syspath_name)
> >>> }
> >>> END_TEST
> >>>
> >>> +START_TEST(test_uinput_events)
> >>> +{
> >>> + struct libevdev *dev;
> >>> + struct libevdev_uinput *uidev;
> >>> + int fd, fd2;
> >>> + int rc;
> >>> + char *devnode;
> >>> + int i;
> >>> + const int nevents = 5;
> >>> + struct input_event events[] = { {{0, 0}, EV_REL, REL_X, 1},
> >>> + {{0, 0}, EV_REL, REL_Y, -1},
> >>> + {{0, 0}, EV_SYN, SYN_REPORT, 0},
> >>> + {{0, 0}, EV_KEY, BTN_LEFT, 1},
> >>> + {{0, 0}, EV_SYN, SYN_REPORT, 0}};
> >>> + struct input_event events_read[nevents];
> >>> +
> >>> + 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_type(dev, EV_KEY);
> >>> + libevdev_enable_event_code(dev, EV_REL, REL_X, NULL);
> >>> + libevdev_enable_event_code(dev, EV_REL, REL_Y, NULL);
> >>> + libevdev_enable_event_code(dev, EV_KEY, BTN_LEFT, NULL);
> >>> +
> >>> + fd = open(UINPUT_NODE, O_RDWR);
> >>> + ck_assert_int_gt(fd, -1);
> >>> +
> >>> + rc = libevdev_uinput_create_from_device(dev, fd, &uidev);
> >>> + ck_assert_int_eq(rc, 0);
> >>> + ck_assert(uidev != NULL);
> >>> +
> >>> + devnode = uinput_devnode_from_syspath(libevdev_uinput_get_syspath(uidev));
> >>
> >> this makes me think that this function (retrieve the devnode of a
> >> uinput device, should be in the libevdev_uinput API, rather than in
> >> test-commons).
> >
> > This would add a udev dependency. I think we don't have that yet, do
>
> no, we don't :) But I think we could bypass this dependency because
> uinput_devnode_from_syspath will just transform
> "/sys/devices/virtual/input/input235/event21" into
> "/dev/input/event21" for instance. And I can not recall any evdev
> device which is not in /dev/input/eventX, so, maybe we could just drop
> the elegant way and hardcode this path in the lib.
>
> > we? Besides, it's a pretty small helper and as mentioned on github,
> > real uinput drivers don't need it. It's only useful for uinput tests
> > as they need access to both, uinput and /dev/input/eventX.
> >
>
> I'm pretty sure we will need this at some point:
> - for instance, evemu-play relies on the created devnode, instead of
> the uinput fd. I know it's bad, but this is how it works, and it
> allows cross-process accessing the same virtual input device (which is
> bad too :-P ).
> - also, I can easily imagine this devnode to be used as a debug
> information in XIT, to compare if the new device appears in the X.org
> logs...
XIT already has almost the same code to guess the dev node. unfortunately
evemu_create() takes a const argument so we can't store it there - XIT works
around this by guessing it after device creation. in fact, this code was
originally copied from there and then adjusted.
Cheers,
Peter
More information about the Input-tools
mailing list