2 * Copyright © 2013 Red Hat, Inc.
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that copyright
7 * notice and this permission notice appear in supporting documentation, and
8 * that the name of the copyright holders not be used in advertising or
9 * publicity pertaining to distribution of the software without specific,
10 * written prior permission. The copyright holders make no representations
11 * about the suitability of this software for any purpose. It is provided "as
12 * is" without express or implied warranty.
14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
24 #include <linux/input.h>
30 #include "test-common.h"
32 START_TEST(test_next_event)
34 struct uinput_device* uidev;
37 struct input_event ev;
39 rc = test_create_device(&uidev, &dev,
44 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
46 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
47 ck_assert_int_eq(rc, -EAGAIN);
49 uinput_device_event(uidev, EV_KEY, BTN_LEFT, 1);
50 uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
51 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
52 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SUCCESS);
53 ck_assert_int_eq(ev.type, EV_KEY);
54 ck_assert_int_eq(ev.code, BTN_LEFT);
55 ck_assert_int_eq(ev.value, 1);
58 uinput_device_free(uidev);
63 START_TEST(test_syn_dropped_event)
65 struct uinput_device* uidev;
68 struct input_event ev;
71 rc = test_create_device(&uidev, &dev,
78 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
80 /* This is a bit complicated:
81 we can't get SYN_DROPPED through uinput, so we push two events down
82 uinput, and fetch one off libevdev (reading in the other one on the
83 way). Then write a SYN_DROPPED on a pipe, switch the fd and read
84 one event off the wire (but returning the second event from
85 before). Switch back, so that when we do read off the SYN_DROPPED
86 we have the fd back on the device and the ioctls work.
88 uinput_device_event(uidev, EV_KEY, BTN_LEFT, 1);
89 uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
90 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
91 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SUCCESS);
92 ck_assert_int_eq(ev.type, EV_KEY);
93 ck_assert_int_eq(ev.code, BTN_LEFT);
94 rc = pipe2(pipefd, O_NONBLOCK);
95 ck_assert_int_eq(rc, 0);
97 libevdev_change_fd(dev, pipefd[0]);
99 ev.code = SYN_DROPPED;
101 rc = write(pipefd[1], &ev, sizeof(ev));
102 ck_assert_int_eq(rc, sizeof(ev));
103 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
105 libevdev_change_fd(dev, uinput_device_get_fd(uidev));
107 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SUCCESS);
108 ck_assert_int_eq(ev.type, EV_SYN);
109 ck_assert_int_eq(ev.code, SYN_REPORT);
110 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
111 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
112 ck_assert_int_eq(ev.type, EV_SYN);
113 ck_assert_int_eq(ev.code, SYN_DROPPED);
115 /* only check for the rc, nothing actually changed on the device */
118 uinput_device_free(uidev);
126 void double_syn_dropped_logfunc(enum libevdev_log_priority priority,
128 const char *file, int line,
130 const char *format, va_list args)
132 unsigned int *hit = data;
136 START_TEST(test_double_syn_dropped_event)
138 struct uinput_device* uidev;
139 struct libevdev *dev;
141 struct input_event ev;
143 unsigned int logfunc_hit = 0;
145 rc = test_create_device(&uidev, &dev,
152 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
154 libevdev_set_log_function(double_syn_dropped_logfunc, &logfunc_hit);
156 /* This is a bit complicated:
157 we can't get SYN_DROPPED through uinput, so we push two events down
158 uinput, and fetch one off libevdev (reading in the other one on the
159 way). Then write a SYN_DROPPED on a pipe, switch the fd and read
160 one event off the wire (but returning the second event from
161 before). Switch back, so that when we do read off the SYN_DROPPED
162 we have the fd back on the device and the ioctls work.
164 uinput_device_event(uidev, EV_KEY, BTN_LEFT, 1);
165 uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
166 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
167 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SUCCESS);
168 ck_assert_int_eq(ev.type, EV_KEY);
169 ck_assert_int_eq(ev.code, BTN_LEFT);
170 rc = pipe2(pipefd, O_NONBLOCK);
171 ck_assert_int_eq(rc, 0);
173 libevdev_change_fd(dev, pipefd[0]);
175 ev.code = SYN_DROPPED;
177 rc = write(pipefd[1], &ev, sizeof(ev));
178 ck_assert_int_eq(rc, sizeof(ev));
179 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
181 /* sneak in a button change event while we're not looking, this way
182 * the sync queue contains 2 events: BTN_LEFT and SYN_REPORT. */
183 uinput_device_event(uidev, EV_KEY, BTN_LEFT, 0);
184 read(pipefd[0], &ev, sizeof(ev));
186 libevdev_change_fd(dev, uinput_device_get_fd(uidev));
188 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SUCCESS);
189 ck_assert_int_eq(ev.type, EV_SYN);
190 ck_assert_int_eq(ev.code, SYN_REPORT);
191 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
192 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
193 ck_assert_int_eq(ev.type, EV_SYN);
194 ck_assert_int_eq(ev.code, SYN_DROPPED);
196 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
197 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
198 ck_assert_int_eq(ev.type, EV_KEY);
199 ck_assert_int_eq(ev.code, BTN_LEFT);
200 ck_assert_int_eq(ev.value, 0);
202 /* now write the second SYN_DROPPED on the pipe so we pick it up
203 * before we finish syncing. */
204 libevdev_change_fd(dev, pipefd[0]);
206 ev.code = SYN_DROPPED;
208 rc = write(pipefd[1], &ev, sizeof(ev));
209 ck_assert_int_eq(rc, sizeof(ev));
211 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
212 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
213 ck_assert_int_eq(ev.type, EV_SYN);
214 ck_assert_int_eq(ev.code, SYN_REPORT);
215 ck_assert_int_eq(ev.value, 0);
217 /* back to enable the ioctls again */
218 libevdev_change_fd(dev, uinput_device_get_fd(uidev));
220 ck_assert_int_eq(logfunc_hit, 1);
223 uinput_device_free(uidev);
228 libevdev_set_log_function(test_logfunc_abort_on_error, NULL);
232 START_TEST(test_event_type_filtered)
234 struct uinput_device* uidev;
235 struct libevdev *dev;
237 struct input_event ev;
239 rc = test_create_device(&uidev, &dev,
244 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
246 libevdev_disable_event_type(dev, EV_REL);
248 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
249 ck_assert_int_eq(rc, -EAGAIN);
251 uinput_device_event(uidev, EV_REL, REL_X, 1);
252 uinput_device_event(uidev, EV_KEY, REL_Y, 1);
253 uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
254 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
255 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SUCCESS);
256 ck_assert_int_eq(ev.type, EV_SYN);
257 ck_assert_int_eq(ev.code, SYN_REPORT);
259 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
260 ck_assert_int_eq(rc, -EAGAIN);
263 uinput_device_free(uidev);
267 START_TEST(test_event_code_filtered)
269 struct uinput_device* uidev;
270 struct libevdev *dev;
272 struct input_event ev;
274 rc = test_create_device(&uidev, &dev,
279 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
281 libevdev_disable_event_code(dev, EV_REL, REL_X);
283 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
284 ck_assert_int_eq(rc, -EAGAIN);
286 uinput_device_event(uidev, EV_REL, REL_X, 1);
287 uinput_device_event(uidev, EV_REL, REL_Y, 1);
288 uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
289 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
290 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SUCCESS);
291 ck_assert_int_eq(ev.type, EV_REL);
292 ck_assert_int_eq(ev.code, REL_Y);
293 ck_assert_int_eq(ev.value, 1);
295 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
296 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SUCCESS);
297 ck_assert_int_eq(ev.type, EV_SYN);
298 ck_assert_int_eq(ev.code, SYN_REPORT);
300 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
301 ck_assert_int_eq(rc, -EAGAIN);
304 uinput_device_free(uidev);
309 START_TEST(test_has_event_pending)
311 struct uinput_device* uidev;
312 struct libevdev *dev;
314 struct input_event ev;
316 rc = test_create_device(&uidev, &dev,
321 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
323 ck_assert_int_eq(libevdev_has_event_pending(dev), 0);
325 uinput_device_event(uidev, EV_REL, REL_X, 1);
326 uinput_device_event(uidev, EV_REL, REL_Y, 1);
327 uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
329 ck_assert_int_eq(libevdev_has_event_pending(dev), 1);
331 libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
333 ck_assert_int_eq(libevdev_has_event_pending(dev), 1);
335 while ((rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev)) != -EAGAIN)
338 ck_assert_int_eq(libevdev_has_event_pending(dev), 0);
340 libevdev_change_fd(dev, -1);
341 ck_assert_int_eq(libevdev_has_event_pending(dev), -EBADF);
344 uinput_device_free(uidev);
348 START_TEST(test_syn_delta_button)
350 struct uinput_device* uidev;
351 struct libevdev *dev;
353 struct input_event ev;
355 rc = test_create_device(&uidev, &dev,
365 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
367 uinput_device_event(uidev, EV_KEY, BTN_LEFT, 1);
368 uinput_device_event(uidev, EV_KEY, BTN_RIGHT, 1);
369 uinput_device_event(uidev, EV_KEY, KEY_MAX, 1);
370 uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
371 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev);
372 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
374 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
375 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
376 ck_assert_int_eq(ev.type, EV_KEY);
377 ck_assert_int_eq(ev.code, BTN_LEFT);
378 ck_assert_int_eq(ev.value, 1);
379 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
380 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
381 ck_assert_int_eq(ev.type, EV_KEY);
382 ck_assert_int_eq(ev.code, BTN_RIGHT);
383 ck_assert_int_eq(ev.value, 1);
384 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
385 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
386 ck_assert_int_eq(ev.type, EV_KEY);
387 ck_assert_int_eq(ev.code, KEY_MAX);
388 ck_assert_int_eq(ev.value, 1);
389 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
390 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
391 ck_assert_int_eq(ev.type, EV_SYN);
392 ck_assert_int_eq(ev.code, SYN_REPORT);
393 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
394 ck_assert_int_eq(rc, -EAGAIN);
396 ck_assert(libevdev_get_event_value(dev, EV_KEY, BTN_LEFT));
397 ck_assert(libevdev_get_event_value(dev, EV_KEY, BTN_RIGHT));
398 ck_assert(!libevdev_get_event_value(dev, EV_KEY, BTN_MIDDLE));
399 ck_assert(libevdev_get_event_value(dev, EV_KEY, KEY_MAX));
401 uinput_device_free(uidev);
406 START_TEST(test_syn_delta_abs)
408 struct uinput_device* uidev;
409 struct libevdev *dev;
411 struct input_event ev;
412 struct input_absinfo abs[3];
414 memset(abs, 0, sizeof(abs));
415 abs[0].value = ABS_X;
416 abs[0].maximum = 1000;
418 abs[1].value = ABS_Y;
419 abs[1].maximum = 1000;
421 abs[2].value = ABS_MAX;
422 abs[2].maximum = 1000;
424 rc = test_create_abs_device(&uidev, &dev,
432 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
434 uinput_device_event(uidev, EV_ABS, ABS_X, 100);
435 uinput_device_event(uidev, EV_ABS, ABS_Y, 500);
436 uinput_device_event(uidev, EV_ABS, ABS_MAX, 700);
437 uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
438 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev);
439 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
441 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
442 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
443 ck_assert_int_eq(ev.type, EV_ABS);
444 ck_assert_int_eq(ev.code, ABS_X);
445 ck_assert_int_eq(ev.value, 100);
446 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
447 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
448 ck_assert_int_eq(ev.type, EV_ABS);
449 ck_assert_int_eq(ev.code, ABS_Y);
450 ck_assert_int_eq(ev.value, 500);
451 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
452 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
453 ck_assert_int_eq(ev.type, EV_ABS);
454 ck_assert_int_eq(ev.code, ABS_MAX);
455 ck_assert_int_eq(ev.value, 700);
456 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
457 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
458 ck_assert_int_eq(ev.type, EV_SYN);
459 ck_assert_int_eq(ev.code, SYN_REPORT);
460 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
461 ck_assert_int_eq(rc, -EAGAIN);
463 uinput_device_free(uidev);
468 START_TEST(test_syn_delta_mt)
470 struct uinput_device* uidev;
471 struct libevdev *dev;
473 struct input_event ev;
474 struct input_absinfo abs[6];
476 memset(abs, 0, sizeof(abs));
477 abs[0].value = ABS_X;
478 abs[0].maximum = 1000;
479 abs[1].value = ABS_MT_POSITION_X;
480 abs[1].maximum = 1000;
482 abs[2].value = ABS_Y;
483 abs[2].maximum = 1000;
484 abs[3].value = ABS_MT_POSITION_Y;
485 abs[3].maximum = 1000;
488 abs[4].value = ABS_MT_SLOT;
490 abs[5].value = ABS_MT_TRACKING_ID;
494 rc = test_create_abs_device(&uidev, &dev,
498 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
500 uinput_device_event(uidev, EV_ABS, ABS_MT_SLOT, 0);
501 uinput_device_event(uidev, EV_ABS, ABS_X, 100);
502 uinput_device_event(uidev, EV_ABS, ABS_Y, 500);
503 uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_X, 100);
504 uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_Y, 500);
505 uinput_device_event(uidev, EV_ABS, ABS_MT_TRACKING_ID, 1);
506 uinput_device_event(uidev, EV_ABS, ABS_MT_SLOT, 1);
507 uinput_device_event(uidev, EV_ABS, ABS_X, 1);
508 uinput_device_event(uidev, EV_ABS, ABS_Y, 5);
509 uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_X, 1);
510 uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_Y, 5);
511 uinput_device_event(uidev, EV_ABS, ABS_MT_TRACKING_ID, 2);
512 uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
514 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev);
515 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
517 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
518 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
519 ck_assert_int_eq(ev.type, EV_ABS);
520 ck_assert_int_eq(ev.code, ABS_X);
521 ck_assert_int_eq(ev.value, 1);
522 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
523 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
524 ck_assert_int_eq(ev.type, EV_ABS);
525 ck_assert_int_eq(ev.code, ABS_Y);
526 ck_assert_int_eq(ev.value, 5);
527 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
528 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
529 ck_assert_int_eq(ev.type, EV_ABS);
530 ck_assert_int_eq(ev.code, ABS_MT_SLOT);
531 ck_assert_int_eq(ev.value, 0);
532 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
533 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
534 ck_assert_int_eq(ev.type, EV_ABS);
535 ck_assert_int_eq(ev.code, ABS_MT_POSITION_X);
536 ck_assert_int_eq(ev.value, 100);
537 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
538 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
539 ck_assert_int_eq(ev.type, EV_ABS);
540 ck_assert_int_eq(ev.code, ABS_MT_POSITION_Y);
541 ck_assert_int_eq(ev.value, 500);
542 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
543 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
544 ck_assert_int_eq(ev.type, EV_ABS);
545 ck_assert_int_eq(ev.code, ABS_MT_TRACKING_ID);
546 ck_assert_int_eq(ev.value, 1);
547 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
548 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
549 ck_assert_int_eq(ev.type, EV_ABS);
550 ck_assert_int_eq(ev.code, ABS_MT_SLOT);
551 ck_assert_int_eq(ev.value, 1);
552 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
553 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
554 ck_assert_int_eq(ev.type, EV_ABS);
555 ck_assert_int_eq(ev.code, ABS_MT_POSITION_X);
556 ck_assert_int_eq(ev.value, 1);
557 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
558 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
559 ck_assert_int_eq(ev.type, EV_ABS);
560 ck_assert_int_eq(ev.code, ABS_MT_POSITION_Y);
561 ck_assert_int_eq(ev.value, 5);
562 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
563 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
564 ck_assert_int_eq(ev.type, EV_ABS);
565 ck_assert_int_eq(ev.code, ABS_MT_TRACKING_ID);
566 ck_assert_int_eq(ev.value, 2);
568 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
569 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
570 ck_assert_int_eq(ev.type, EV_SYN);
571 ck_assert_int_eq(ev.code, SYN_REPORT);
572 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
573 ck_assert_int_eq(rc, -EAGAIN);
575 uinput_device_free(uidev);
580 START_TEST(test_syn_delta_led)
582 struct uinput_device* uidev;
583 struct libevdev *dev;
585 struct input_event ev;
587 rc = test_create_device(&uidev, &dev,
594 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
596 uinput_device_event(uidev, EV_LED, LED_NUML, 1);
597 uinput_device_event(uidev, EV_LED, LED_CAPSL, 1);
598 uinput_device_event(uidev, EV_LED, LED_MAX, 1);
599 uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
600 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev);
601 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
603 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
604 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
605 ck_assert_int_eq(ev.type, EV_LED);
606 ck_assert_int_eq(ev.code, LED_NUML);
607 ck_assert_int_eq(ev.value, 1);
608 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
609 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
610 ck_assert_int_eq(ev.type, EV_LED);
611 ck_assert_int_eq(ev.code, LED_CAPSL);
612 ck_assert_int_eq(ev.value, 1);
613 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
614 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
615 ck_assert_int_eq(ev.type, EV_LED);
616 ck_assert_int_eq(ev.code, LED_MAX);
617 ck_assert_int_eq(ev.value, 1);
618 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
619 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
620 ck_assert_int_eq(ev.type, EV_SYN);
621 ck_assert_int_eq(ev.code, SYN_REPORT);
622 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
623 ck_assert_int_eq(rc, -EAGAIN);
625 ck_assert_int_eq(libevdev_get_event_value(dev, EV_LED, LED_NUML), 1);
626 ck_assert_int_eq(libevdev_get_event_value(dev, EV_LED, LED_CAPSL), 1);
627 ck_assert_int_eq(libevdev_get_event_value(dev, EV_LED, LED_MAX), 1);
629 uinput_device_free(uidev);
634 START_TEST(test_syn_delta_sw)
636 struct uinput_device* uidev;
637 struct libevdev *dev;
639 struct input_event ev;
641 rc = test_create_device(&uidev, &dev,
645 EV_SW, SW_MICROPHONE_INSERT,
648 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
650 uinput_device_event(uidev, EV_SW, SW_LID, 1);
651 uinput_device_event(uidev, EV_SW, SW_MICROPHONE_INSERT, 1);
652 uinput_device_event(uidev, EV_SW, SW_MAX, 1);
653 uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
654 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev);
655 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
657 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
658 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
659 ck_assert_int_eq(ev.type, EV_SW);
660 ck_assert_int_eq(ev.code, SW_LID);
661 ck_assert_int_eq(ev.value, 1);
662 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
663 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
664 ck_assert_int_eq(ev.type, EV_SW);
665 ck_assert_int_eq(ev.code, SW_MICROPHONE_INSERT);
666 ck_assert_int_eq(ev.value, 1);
667 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
668 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
669 ck_assert_int_eq(ev.type, EV_SW);
670 ck_assert_int_eq(ev.code, SW_MAX);
671 ck_assert_int_eq(ev.value, 1);
672 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
673 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
674 ck_assert_int_eq(ev.type, EV_SYN);
675 ck_assert_int_eq(ev.code, SYN_REPORT);
676 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
677 ck_assert_int_eq(rc, -EAGAIN);
679 ck_assert_int_eq(libevdev_get_event_value(dev, EV_SW, SW_LID), 1);
680 ck_assert_int_eq(libevdev_get_event_value(dev, EV_SW, SW_MICROPHONE_INSERT), 1);
681 ck_assert_int_eq(libevdev_get_event_value(dev, EV_SW, SW_MAX), 1);
683 uinput_device_free(uidev);
688 START_TEST(test_skipped_sync)
690 struct uinput_device* uidev;
691 struct libevdev *dev;
693 struct input_event ev;
694 struct input_absinfo abs[2];
696 memset(abs, 0, sizeof(abs));
697 abs[0].value = ABS_X;
698 abs[0].maximum = 1000;
700 abs[1].value = ABS_Y;
701 abs[1].maximum = 1000;
703 rc = test_create_abs_device(&uidev, &dev,
711 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
713 uinput_device_event(uidev, EV_KEY, BTN_LEFT, 1);
714 uinput_device_event(uidev, EV_ABS, ABS_X, 100);
715 uinput_device_event(uidev, EV_ABS, ABS_Y, 500);
716 uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
717 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev);
718 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
720 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
721 ck_assert_int_eq(rc, -EAGAIN);
723 ck_assert_int_eq(libevdev_get_event_value(dev, EV_KEY, BTN_LEFT), 1);
724 ck_assert_int_eq(libevdev_get_event_value(dev, EV_ABS, ABS_X), 100);
725 ck_assert_int_eq(libevdev_get_event_value(dev, EV_ABS, ABS_Y), 500);
727 uinput_device_free(uidev);
732 START_TEST(test_incomplete_sync)
734 struct uinput_device* uidev;
735 struct libevdev *dev;
737 struct input_event ev;
738 struct input_absinfo abs[2];
740 memset(abs, 0, sizeof(abs));
741 abs[0].value = ABS_X;
742 abs[0].maximum = 1000;
744 abs[1].value = ABS_Y;
745 abs[1].maximum = 1000;
747 rc = test_create_abs_device(&uidev, &dev,
755 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
757 uinput_device_event(uidev, EV_KEY, BTN_LEFT, 1);
758 uinput_device_event(uidev, EV_ABS, ABS_X, 100);
759 uinput_device_event(uidev, EV_ABS, ABS_Y, 500);
760 uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
761 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev);
762 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
764 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
765 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
766 ck_assert_int_eq(ev.type, EV_KEY);
767 ck_assert_int_eq(ev.code, BTN_LEFT);
768 ck_assert_int_eq(ev.value, 1);
770 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
771 ck_assert_int_eq(rc, -EAGAIN);
773 ck_assert_int_eq(libevdev_get_event_value(dev, EV_KEY, BTN_LEFT), 1);
774 ck_assert_int_eq(libevdev_get_event_value(dev, EV_ABS, ABS_X), 100);
775 ck_assert_int_eq(libevdev_get_event_value(dev, EV_ABS, ABS_Y), 500);
777 uinput_device_free(uidev);
782 START_TEST(test_empty_sync)
784 struct uinput_device* uidev;
785 struct libevdev *dev;
787 struct input_event ev;
789 rc = test_create_device(&uidev, &dev,
796 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
798 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev);
799 ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC);
801 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev);
802 ck_assert_int_eq(rc, -EAGAIN);
804 uinput_device_free(uidev);
809 START_TEST(test_event_values)
811 struct uinput_device* uidev;
812 struct libevdev *dev;
814 struct input_event ev;
815 struct input_absinfo abs[2];
818 memset(abs, 0, sizeof(abs));
819 abs[0].value = ABS_X;
820 abs[0].maximum = 1000;
822 abs[1].value = ABS_Y;
823 abs[1].maximum = 1000;
825 rc = test_create_abs_device(&uidev, &dev,
835 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
837 uinput_device_event(uidev, EV_KEY, BTN_LEFT, 1);
838 uinput_device_event(uidev, EV_ABS, ABS_X, 100);
839 uinput_device_event(uidev, EV_ABS, ABS_Y, 500);
840 uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
842 /* must still be on old values */
843 ck_assert_int_eq(libevdev_get_event_value(dev, EV_KEY, BTN_LEFT), 0);
844 ck_assert_int_eq(libevdev_get_event_value(dev, EV_ABS, ABS_X), 0);
845 ck_assert_int_eq(libevdev_get_event_value(dev, EV_ABS, ABS_Y), 0);
846 ck_assert_int_eq(libevdev_get_event_value(dev, EV_REL, REL_X), 0);
847 ck_assert_int_eq(libevdev_get_event_value(dev, EV_REL, REL_Y), 0);
849 ck_assert_int_eq(libevdev_fetch_event_value(dev, EV_KEY, BTN_LEFT, &value), 1);
850 ck_assert_int_eq(value, 0);
853 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
855 ck_assert_int_eq(rc, -EAGAIN);
857 ck_assert_int_eq(libevdev_get_event_value(dev, EV_KEY, BTN_LEFT), 1);
858 ck_assert_int_eq(libevdev_get_event_value(dev, EV_ABS, ABS_X), 100);
859 ck_assert_int_eq(libevdev_get_event_value(dev, EV_ABS, ABS_Y), 500);
862 ck_assert_int_eq(libevdev_get_event_value(dev, EV_REL, REL_X), 0);
863 ck_assert_int_eq(libevdev_get_event_value(dev, EV_REL, REL_Y), 0);
865 ck_assert_int_eq(libevdev_fetch_event_value(dev, EV_KEY, BTN_LEFT, &value), 1);
866 ck_assert_int_eq(value, 1);
867 ck_assert_int_eq(libevdev_fetch_event_value(dev, EV_ABS, ABS_X, &value), 1);
868 ck_assert_int_eq(value, 100);
869 ck_assert_int_eq(libevdev_fetch_event_value(dev, EV_ABS, ABS_Y, &value), 1);
870 ck_assert_int_eq(value, 500);
872 uinput_device_free(uidev);
879 START_TEST(test_event_values_invalid)
881 struct uinput_device* uidev;
882 struct libevdev *dev;
884 struct input_absinfo abs[2];
887 memset(abs, 0, sizeof(abs));
888 abs[0].value = ABS_X;
889 abs[0].maximum = 1000;
891 abs[1].value = ABS_Y;
892 abs[1].maximum = 1000;
894 rc = test_create_abs_device(&uidev, &dev,
904 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
906 ck_assert_int_eq(libevdev_get_event_value(dev, EV_KEY, BTN_EXTRA), 0);
907 ck_assert_int_eq(libevdev_get_event_value(dev, EV_ABS, ABS_Z), 0);
908 ck_assert_int_eq(libevdev_get_event_value(dev, EV_REL, REL_Z), 0);
911 ck_assert_int_eq(libevdev_fetch_event_value(dev, EV_KEY, BTN_EXTRA, &value), 0);
912 ck_assert_int_eq(value, 0xab);
913 ck_assert_int_eq(libevdev_fetch_event_value(dev, EV_ABS, ABS_Z, &value), 0);
914 ck_assert_int_eq(value, 0xab);
915 ck_assert_int_eq(libevdev_fetch_event_value(dev, EV_REL, REL_Z, &value), 0);
916 ck_assert_int_eq(value, 0xab);
919 uinput_device_free(uidev);
925 START_TEST(test_mt_event_values)
927 struct uinput_device* uidev;
928 struct libevdev *dev;
930 struct input_event ev;
931 struct input_absinfo abs[5];
934 memset(abs, 0, sizeof(abs));
935 abs[0].value = ABS_X;
936 abs[0].maximum = 1000;
937 abs[1].value = ABS_MT_POSITION_X;
938 abs[1].maximum = 1000;
940 abs[2].value = ABS_Y;
941 abs[2].maximum = 1000;
942 abs[3].value = ABS_MT_POSITION_Y;
943 abs[3].maximum = 1000;
945 abs[4].value = ABS_MT_SLOT;
948 rc = test_create_abs_device(&uidev, &dev,
952 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
954 uinput_device_event(uidev, EV_ABS, ABS_MT_SLOT, 0);
955 uinput_device_event(uidev, EV_ABS, ABS_X, 100);
956 uinput_device_event(uidev, EV_ABS, ABS_Y, 500);
957 uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_X, 100);
958 uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_Y, 500);
959 uinput_device_event(uidev, EV_ABS, ABS_MT_SLOT, 1);
960 uinput_device_event(uidev, EV_ABS, ABS_X, 1);
961 uinput_device_event(uidev, EV_ABS, ABS_Y, 5);
962 uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_X, 1);
963 uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_Y, 5);
964 uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
966 /* must still be on old values */
967 ck_assert_int_eq(libevdev_get_current_slot(dev), 0);
968 ck_assert_int_eq(libevdev_get_slot_value(dev, 0, ABS_MT_POSITION_X), 0);
969 ck_assert_int_eq(libevdev_get_slot_value(dev, 0, ABS_MT_POSITION_Y), 0);
970 ck_assert_int_eq(libevdev_get_slot_value(dev, 1, ABS_MT_POSITION_X), 0);
971 ck_assert_int_eq(libevdev_get_slot_value(dev, 1, ABS_MT_POSITION_Y), 0);
974 rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
975 } while (rc == LIBEVDEV_READ_STATUS_SUCCESS);
976 ck_assert_int_eq(rc, -EAGAIN);
978 ck_assert_int_eq(libevdev_get_current_slot(dev), 1);
979 ck_assert_int_eq(libevdev_get_slot_value(dev, 0, ABS_MT_POSITION_X), 100);
980 ck_assert_int_eq(libevdev_get_slot_value(dev, 0, ABS_MT_POSITION_Y), 500);
981 ck_assert_int_eq(libevdev_get_slot_value(dev, 1, ABS_MT_POSITION_X), 1);
982 ck_assert_int_eq(libevdev_get_slot_value(dev, 1, ABS_MT_POSITION_Y), 5);
984 ck_assert_int_eq(libevdev_fetch_slot_value(dev, 0, ABS_MT_POSITION_X, &value), 1);
985 ck_assert_int_eq(value, 100);
986 ck_assert_int_eq(libevdev_fetch_slot_value(dev, 0, ABS_MT_POSITION_Y, &value), 1);
987 ck_assert_int_eq(value, 500);
988 ck_assert_int_eq(libevdev_fetch_slot_value(dev, 1, ABS_MT_POSITION_X, &value), 1);
989 ck_assert_int_eq(value, 1);
990 ck_assert_int_eq(libevdev_fetch_slot_value(dev, 1, ABS_MT_POSITION_Y, &value), 1);
991 ck_assert_int_eq(value, 5);
993 uinput_device_free(uidev);
999 START_TEST(test_mt_event_values_invalid)
1001 struct uinput_device* uidev;
1002 struct libevdev *dev;
1004 struct input_absinfo abs[5];
1007 memset(abs, 0, sizeof(abs));
1008 abs[0].value = ABS_X;
1009 abs[0].maximum = 1000;
1010 abs[1].value = ABS_MT_POSITION_X;
1011 abs[1].maximum = 1000;
1013 abs[2].value = ABS_Y;
1014 abs[2].maximum = 1000;
1015 abs[3].value = ABS_MT_POSITION_Y;
1016 abs[3].maximum = 1000;
1018 abs[4].value = ABS_MT_SLOT;
1021 rc = test_create_abs_device(&uidev, &dev,
1025 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
1027 ck_assert_int_eq(libevdev_get_current_slot(dev), 0);
1028 ck_assert_int_eq(libevdev_get_slot_value(dev, 0, ABS_MT_TOUCH_MINOR), 0);
1030 ck_assert_int_eq(libevdev_fetch_slot_value(dev, 0, ABS_MT_TOUCH_MINOR, &value), 0);
1031 ck_assert_int_eq(value, 0xab);
1033 ck_assert_int_eq(libevdev_get_slot_value(dev, 10, ABS_MT_POSITION_X), 0);
1034 ck_assert_int_eq(libevdev_get_slot_value(dev, 0, ABS_X), 0);
1036 uinput_device_free(uidev);
1041 START_TEST(test_ev_rep_values)
1043 struct uinput_device* uidev;
1044 struct libevdev *dev;
1046 int delay = 500, period = 200;
1047 rc = test_create_device(&uidev, &dev,
1053 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
1055 libevdev_enable_event_code(dev, EV_REP, REP_DELAY, &delay);
1056 libevdev_enable_event_code(dev, EV_REP, REP_PERIOD, &period);
1058 ck_assert_int_eq(libevdev_has_event_type(dev, EV_REP), 1);
1059 ck_assert_int_eq(libevdev_has_event_code(dev, EV_REP, REP_DELAY), 1);
1060 ck_assert_int_eq(libevdev_has_event_code(dev, EV_REP, REP_PERIOD), 1);
1061 ck_assert_int_eq(libevdev_get_event_value(dev, EV_REP, REP_DELAY), 500);
1062 ck_assert_int_eq(libevdev_get_event_value(dev, EV_REP, REP_PERIOD), 200);
1066 START_TEST(test_event_value_setters)
1068 struct uinput_device* uidev;
1069 struct libevdev *dev;
1071 struct input_absinfo abs[2];
1073 memset(abs, 0, sizeof(abs));
1074 abs[0].value = ABS_X;
1075 abs[0].maximum = 1000;
1077 abs[1].value = ABS_Y;
1078 abs[1].maximum = 1000;
1080 rc = test_create_abs_device(&uidev, &dev,
1091 EV_SW, SW_TABLET_MODE,
1093 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
1095 ck_assert_int_eq(libevdev_get_event_value(dev, EV_KEY, BTN_LEFT), 0);
1096 ck_assert_int_eq(libevdev_get_event_value(dev, EV_ABS, ABS_X), 0);
1097 ck_assert_int_eq(libevdev_get_event_value(dev, EV_ABS, ABS_Y), 0);
1098 ck_assert_int_eq(libevdev_get_event_value(dev, EV_REL, REL_X), 0);
1099 ck_assert_int_eq(libevdev_get_event_value(dev, EV_REL, REL_Y), 0);
1101 ck_assert_int_eq(libevdev_set_event_value(dev, EV_KEY, BTN_LEFT, 1), 0);
1102 ck_assert_int_eq(libevdev_set_event_value(dev, EV_KEY, BTN_RIGHT, 1), 0);
1104 ck_assert_int_eq(libevdev_get_event_value(dev, EV_KEY, BTN_LEFT), 1);
1105 ck_assert_int_eq(libevdev_get_event_value(dev, EV_KEY, BTN_RIGHT), 1);
1107 ck_assert_int_eq(libevdev_set_event_value(dev, EV_ABS, ABS_X, 10), 0);
1108 ck_assert_int_eq(libevdev_set_event_value(dev, EV_ABS, ABS_Y, 20), 0);
1110 ck_assert_int_eq(libevdev_get_event_value(dev, EV_ABS, ABS_X), 10);
1111 ck_assert_int_eq(libevdev_get_event_value(dev, EV_ABS, ABS_Y), 20);
1113 ck_assert_int_eq(libevdev_set_event_value(dev, EV_LED, LED_NUML, 1), 0);
1114 ck_assert_int_eq(libevdev_set_event_value(dev, EV_LED, LED_CAPSL, 1), 0);
1116 ck_assert_int_eq(libevdev_get_event_value(dev, EV_LED, LED_NUML), 1);
1117 ck_assert_int_eq(libevdev_get_event_value(dev, EV_LED, LED_CAPSL), 1);
1119 ck_assert_int_eq(libevdev_set_event_value(dev, EV_SW, SW_LID, 1), 0);
1120 ck_assert_int_eq(libevdev_set_event_value(dev, EV_SW, SW_TABLET_MODE, 1), 0);
1122 ck_assert_int_eq(libevdev_get_event_value(dev, EV_SW, SW_LID), 1);
1123 ck_assert_int_eq(libevdev_get_event_value(dev, EV_SW, SW_TABLET_MODE), 1);
1125 uinput_device_free(uidev);
1131 START_TEST(test_event_value_setters_invalid)
1133 struct uinput_device* uidev;
1134 struct libevdev *dev;
1136 struct input_absinfo abs[2];
1138 memset(abs, 0, sizeof(abs));
1139 abs[0].value = ABS_X;
1140 abs[0].maximum = 1000;
1142 abs[1].value = ABS_Y;
1143 abs[1].maximum = 1000;
1145 rc = test_create_abs_device(&uidev, &dev,
1154 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
1156 ck_assert_int_eq(libevdev_set_event_value(dev, EV_REL, REL_X, 1), -1);
1157 ck_assert_int_eq(libevdev_set_event_value(dev, EV_SW, SW_DOCK, 1), -1);
1158 ck_assert_int_eq(libevdev_set_event_value(dev, EV_ABS, ABS_Z, 1), -1);
1159 ck_assert_int_eq(libevdev_set_event_value(dev, EV_MAX + 1, 0, 1), -1);
1160 ck_assert_int_eq(libevdev_set_event_value(dev, EV_SYN, SYN_REPORT, 0), -1);
1162 uinput_device_free(uidev);
1168 START_TEST(test_event_mt_value_setters)
1170 struct uinput_device* uidev;
1171 struct libevdev *dev;
1173 struct input_absinfo abs[5];
1175 memset(abs, 0, sizeof(abs));
1176 abs[0].value = ABS_X;
1177 abs[0].maximum = 1000;
1178 abs[1].value = ABS_MT_POSITION_X;
1179 abs[1].maximum = 1000;
1181 abs[2].value = ABS_Y;
1182 abs[2].maximum = 1000;
1183 abs[3].value = ABS_MT_POSITION_Y;
1184 abs[3].maximum = 1000;
1186 abs[4].value = ABS_MT_SLOT;
1189 rc = test_create_abs_device(&uidev, &dev,
1193 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
1195 ck_assert_int_eq(libevdev_set_slot_value(dev, 1, ABS_MT_POSITION_X, 1), 0);
1196 ck_assert_int_eq(libevdev_set_slot_value(dev, 1, ABS_MT_POSITION_Y, 2), 0);
1197 ck_assert_int_eq(libevdev_set_slot_value(dev, 0, ABS_MT_POSITION_X, 3), 0);
1198 ck_assert_int_eq(libevdev_set_slot_value(dev, 0, ABS_MT_POSITION_Y, 4), 0);
1200 ck_assert_int_eq(libevdev_get_slot_value(dev, 1, ABS_MT_POSITION_X), 1);
1201 ck_assert_int_eq(libevdev_get_slot_value(dev, 1, ABS_MT_POSITION_Y), 2);
1202 ck_assert_int_eq(libevdev_get_slot_value(dev, 0, ABS_MT_POSITION_X), 3);
1203 ck_assert_int_eq(libevdev_get_slot_value(dev, 0, ABS_MT_POSITION_Y), 4);
1205 ck_assert_int_eq(libevdev_set_slot_value(dev, 1, ABS_MT_SLOT, 1), 0);
1206 ck_assert_int_eq(libevdev_get_slot_value(dev, 1, ABS_MT_SLOT), 1);
1207 ck_assert_int_eq(libevdev_get_current_slot(dev), 1);
1209 uinput_device_free(uidev);
1214 START_TEST(test_event_mt_value_setters_invalid)
1216 struct uinput_device* uidev;
1217 struct libevdev *dev;
1219 struct input_absinfo abs[5];
1221 memset(abs, 0, sizeof(abs));
1222 abs[0].value = ABS_X;
1223 abs[0].maximum = 1000;
1224 abs[1].value = ABS_MT_POSITION_X;
1225 abs[1].maximum = 1000;
1227 abs[2].value = ABS_Y;
1228 abs[2].maximum = 1000;
1229 abs[3].value = ABS_MT_POSITION_Y;
1230 abs[3].maximum = 1000;
1232 abs[4].value = ABS_MT_SLOT;
1235 rc = test_create_abs_device(&uidev, &dev,
1239 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
1242 ck_assert_int_eq(libevdev_set_slot_value(dev, 1, ABS_Z, 1), -1);
1243 /* valid, but non-mt axis */
1244 ck_assert_int_eq(libevdev_set_slot_value(dev, 1, ABS_X, 1), -1);
1245 /* invalid mt axis */
1246 ck_assert_int_eq(libevdev_set_slot_value(dev, 1, ABS_MT_PRESSURE, 1), -1);
1247 /* invalid slot no */
1248 ck_assert_int_eq(libevdev_set_slot_value(dev, 4, ABS_X, 1), -1);
1250 uinput_device_free(uidev);
1255 START_TEST(test_event_mt_value_setters_current_slot)
1257 struct uinput_device* uidev;
1258 struct libevdev *dev;
1260 struct input_absinfo abs[5];
1262 memset(abs, 0, sizeof(abs));
1263 abs[0].value = ABS_X;
1264 abs[0].maximum = 1000;
1265 abs[1].value = ABS_MT_POSITION_X;
1266 abs[1].maximum = 1000;
1268 abs[2].value = ABS_Y;
1269 abs[2].maximum = 1000;
1270 abs[3].value = ABS_MT_POSITION_Y;
1271 abs[3].maximum = 1000;
1273 abs[4].value = ABS_MT_SLOT;
1276 rc = test_create_abs_device(&uidev, &dev,
1280 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
1282 /* set_event_value/get_event_value works on the current slot */
1284 ck_assert_int_eq(libevdev_get_current_slot(dev), 0);
1285 ck_assert_int_eq(libevdev_set_event_value(dev, EV_ABS, ABS_MT_POSITION_X, 1), 0);
1286 ck_assert_int_eq(libevdev_get_event_value(dev, EV_ABS, ABS_MT_POSITION_X), 1);
1287 ck_assert_int_eq(libevdev_get_slot_value(dev, 0, ABS_MT_POSITION_X), 1);
1289 ck_assert_int_eq(libevdev_set_event_value(dev, EV_ABS, ABS_MT_SLOT, 1), 0);
1290 ck_assert_int_eq(libevdev_get_current_slot(dev), 1);
1291 ck_assert_int_eq(libevdev_set_event_value(dev, EV_ABS, ABS_MT_POSITION_X, 2), 0);
1292 ck_assert_int_eq(libevdev_get_event_value(dev, EV_ABS, ABS_MT_POSITION_X), 2);
1293 ck_assert_int_eq(libevdev_get_slot_value(dev, 1, ABS_MT_POSITION_X), 2);
1295 /* set slot 0, but current is still slot 1 */
1296 ck_assert_int_eq(libevdev_set_slot_value(dev, 0, ABS_MT_POSITION_X, 3), 0);
1297 ck_assert_int_eq(libevdev_get_event_value(dev, EV_ABS, ABS_MT_POSITION_X), 2);
1299 ck_assert_int_eq(libevdev_set_event_value(dev, EV_ABS, ABS_MT_SLOT, 0), 0);
1300 ck_assert_int_eq(libevdev_get_current_slot(dev), 0);
1301 ck_assert_int_eq(libevdev_get_event_value(dev, EV_ABS, ABS_MT_POSITION_X), 3);
1303 uinput_device_free(uidev);
1309 libevdev_events(void)
1311 Suite *s = suite_create("libevdev event tests");
1313 TCase *tc = tcase_create("event polling");
1314 tcase_add_test(tc, test_next_event);
1315 tcase_add_test(tc, test_syn_dropped_event);
1316 tcase_add_test(tc, test_double_syn_dropped_event);
1317 tcase_add_test(tc, test_event_type_filtered);
1318 tcase_add_test(tc, test_event_code_filtered);
1319 tcase_add_test(tc, test_has_event_pending);
1320 suite_add_tcase(s, tc);
1322 tc = tcase_create("SYN_DROPPED deltas");
1323 tcase_add_test(tc, test_syn_delta_button);
1324 tcase_add_test(tc, test_syn_delta_abs);
1325 tcase_add_test(tc, test_syn_delta_mt);
1326 tcase_add_test(tc, test_syn_delta_led);
1327 tcase_add_test(tc, test_syn_delta_sw);
1328 suite_add_tcase(s, tc);
1330 tc = tcase_create("skipped syncs");
1331 tcase_add_test(tc, test_skipped_sync);
1332 tcase_add_test(tc, test_incomplete_sync);
1333 tcase_add_test(tc, test_empty_sync);
1334 suite_add_tcase(s, tc);
1336 tc = tcase_create("event values");
1337 tcase_add_test(tc, test_event_values);
1338 tcase_add_test(tc, test_event_values_invalid);
1339 tcase_add_test(tc, test_mt_event_values);
1340 tcase_add_test(tc, test_mt_event_values_invalid);
1341 tcase_add_test(tc, test_ev_rep_values);
1342 suite_add_tcase(s, tc);
1344 tc = tcase_create("event value setters");
1345 tcase_add_test(tc, test_event_value_setters);
1346 tcase_add_test(tc, test_event_value_setters_invalid);
1347 tcase_add_test(tc, test_event_mt_value_setters);
1348 tcase_add_test(tc, test_event_mt_value_setters_invalid);
1349 tcase_add_test(tc, test_event_mt_value_setters_current_slot);
1350 suite_add_tcase(s, tc);