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 static int evbits[] = {
33 EV_SYN, EV_KEY, EV_REL, EV_ABS, EV_MSC,
34 EV_SW, EV_LED, EV_SND, EV_FF,
35 /* Intentionally skipping these, they're different
36 * EV_PWR, EV_FF_STATUS, EV_REP, */
40 START_TEST(test_has_ev_bit)
45 struct uinput_device* uidev;
49 if (*evbit == EV_ABS) {
50 struct input_absinfo abs = { ABS_X, 0, 2, 0, 0, 0};
51 rc = test_create_abs_device(&uidev, &dev,
55 rc = test_create_device(&uidev, &dev,
58 ck_assert_msg(rc == 0, "%s: Failed to create device with: %s",
59 libevdev_event_type_get_name(*evbit),
62 ck_assert_msg(libevdev_has_event_type(dev, EV_SYN), "for event type %d\n", *evbit);
63 ck_assert_msg(libevdev_has_event_type(dev, *evbit), "for event type %d\n", *evbit);
65 for (i = 0; i <= EV_MAX; i++) {
66 if (i == EV_SYN || i == *evbit)
69 ck_assert_msg(!libevdev_has_event_type(dev, i), "for event type %d\n", i);
73 uinput_device_free(uidev);
80 START_TEST(test_ev_bit_limits)
85 struct uinput_device* uidev;
89 if (*evbit == EV_ABS) {
90 struct input_absinfo abs = { ABS_X, 0, 2, 0, 0, 0};
91 rc = test_create_abs_device(&uidev, &dev,
95 rc = test_create_device(&uidev, &dev,
98 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
100 ck_assert_int_eq(libevdev_has_event_type(dev, EV_MAX + 1), 0);
101 ck_assert_int_eq(libevdev_has_event_type(dev, INT_MAX), 0);
102 ck_assert_int_eq(libevdev_has_event_type(dev, UINT_MAX), 0);
105 uinput_device_free(uidev);
112 START_TEST(test_event_codes)
116 while(*evbit != -1) {
117 struct uinput_device* uidev;
118 struct libevdev *dev;
121 if (*evbit == EV_SYN) {
126 max = libevdev_event_type_get_max(*evbit);
128 for (code = 1; code < max; code += 10) {
129 if (*evbit == EV_ABS) {
130 struct input_absinfo abs = { code, 0, 2, 0, 0, 0};
131 rc = test_create_abs_device(&uidev, &dev,
135 rc = test_create_device(&uidev, &dev,
138 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
140 ck_assert_msg(libevdev_has_event_type(dev, *evbit), "for event type %d\n", *evbit);
141 ck_assert_msg(libevdev_has_event_code(dev, *evbit, code), "for type %d code %d", *evbit, code);
142 ck_assert_msg(libevdev_has_event_code(dev, EV_SYN, SYN_REPORT), "for EV_SYN");
144 ck_assert_msg(!libevdev_has_event_code(dev, EV_PWR, 0), "for EV_PWR");
147 uinput_device_free(uidev);
155 START_TEST(test_event_code_limits)
159 while(*evbit != -1) {
160 struct uinput_device* uidev;
161 struct libevdev *dev;
165 if (*evbit == EV_SYN) {
170 max = libevdev_event_type_get_max(*evbit);
171 ck_assert(max != -1);
173 if (*evbit == EV_ABS) {
174 struct input_absinfo abs = { ABS_X, 0, 2, 0, 0, 0};
175 rc = test_create_abs_device(&uidev, &dev,
179 rc = test_create_device(&uidev, &dev,
182 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
184 ck_assert_msg(!libevdev_has_event_code(dev, *evbit, max), "for type %d code %d", *evbit, max);
185 ck_assert_msg(!libevdev_has_event_code(dev, *evbit, INT_MAX), "for type %d code %d", *evbit, INT_MAX);
186 ck_assert_msg(!libevdev_has_event_code(dev, *evbit, UINT_MAX), "for type %d code %d", *evbit, UINT_MAX);
189 uinput_device_free(uidev);
196 START_TEST(test_ev_rep)
198 struct libevdev *dev;
199 struct uinput_device* uidev;
202 const int KERNEL_DEFAULT_REP = 250;
203 const int KERNEL_DEFAULT_DELAY = 33;
205 /* EV_REP is special, it's always fully set if set at all,
206 can't test this through uinput though */
207 uidev = uinput_device_new(TEST_DEVICE_NAME);
208 ck_assert(uidev != NULL);
209 rc = uinput_device_set_bit(uidev, EV_REP);
210 ck_assert_int_eq(rc, 0);
212 rc = uinput_device_create(uidev);
213 ck_assert_int_eq(rc, 0);
215 rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev);
216 ck_assert_int_eq(rc, 0);
218 ck_assert_int_eq(libevdev_has_event_type(dev, EV_REP), 1);
219 ck_assert_int_eq(libevdev_has_event_code(dev, EV_REP, REP_DELAY), 1);
220 ck_assert_int_eq(libevdev_has_event_code(dev, EV_REP, REP_PERIOD), 1);
222 ck_assert_int_eq(libevdev_get_repeat(dev, &rep, &delay), 0);
223 /* default values as set by the kernel,
224 see drivers/input/input.c:input_register_device() */
225 ck_assert_int_eq(rep, KERNEL_DEFAULT_REP);
226 ck_assert_int_eq(delay, KERNEL_DEFAULT_DELAY);
229 uinput_device_free(uidev);
233 START_TEST(test_ev_rep_values)
235 struct uinput_device* uidev;
236 struct libevdev *dev;
238 int delay = 0xab, period = 0xbc;
240 /* EV_REP is special, it's always fully set if set at all, can't set
241 it through uinput though. */
242 rc = test_create_device(&uidev, &dev, -1);
243 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
245 ck_assert_int_eq(libevdev_get_repeat(dev, NULL, NULL), -1);
246 ck_assert_int_eq(libevdev_get_repeat(dev, &delay, NULL), -1);
247 ck_assert_int_eq(libevdev_get_repeat(dev, NULL, &period), -1);
248 ck_assert_int_eq(libevdev_get_repeat(dev, &delay, &period), -1);
250 ck_assert_int_eq(delay, 0xab);
251 ck_assert_int_eq(period, 0xbc);
253 uinput_device_free(uidev);
258 START_TEST(test_input_props)
260 struct uinput_device* uidev;
261 struct libevdev *dev;
263 struct input_absinfo abs = {0, 0, 2, 0, 0};
265 uidev = uinput_device_new(TEST_DEVICE_NAME);
266 rc = uinput_device_set_abs_bit(uidev, ABS_X, &abs);
267 ck_assert_int_eq(rc, 0);
268 uinput_device_set_prop(uidev, INPUT_PROP_DIRECT);
269 uinput_device_set_prop(uidev, INPUT_PROP_BUTTONPAD);
270 rc = uinput_device_create(uidev);
271 ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
273 rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev);
274 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
277 for (i = 0; i < INPUT_PROP_CNT; i++) {
278 if (i == INPUT_PROP_DIRECT || i == INPUT_PROP_BUTTONPAD)
279 ck_assert_int_eq(libevdev_has_property(dev, i), 1);
281 ck_assert_int_eq(libevdev_has_property(dev, i), 0);
284 ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_MAX + 1), 0);
285 ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_MAX), 0);
287 uinput_device_free(uidev);
292 START_TEST(test_set_input_props)
294 struct uinput_device* uidev;
295 struct libevdev *dev;
297 struct input_absinfo abs = {0, 0, 2, 0, 0};
299 dev = libevdev_new();
300 ck_assert_int_eq(libevdev_enable_property(dev, INPUT_PROP_MAX + 1), -1);
301 ck_assert_int_eq(libevdev_enable_property(dev, INPUT_PROP_DIRECT), 0);
302 ck_assert_int_eq(libevdev_enable_property(dev, INPUT_PROP_BUTTONPAD), 0);
303 ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_DIRECT), 1);
304 ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_BUTTONPAD), 1);
306 uidev = uinput_device_new(TEST_DEVICE_NAME);
307 rc = uinput_device_set_abs_bit(uidev, ABS_X, &abs);
308 ck_assert_int_eq(rc, 0);
309 uinput_device_set_prop(uidev, INPUT_PROP_BUTTONPAD);
310 rc = uinput_device_create(uidev);
311 ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
313 fd = uinput_device_get_fd(uidev);
314 rc = libevdev_set_fd(dev, fd);
315 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
317 ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_DIRECT), 0);
318 ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_BUTTONPAD), 1);
320 uinput_device_free(uidev);
325 START_TEST(test_slot_init_value)
327 struct uinput_device *uidev;
328 struct libevdev *dev;
333 struct input_absinfo abs[] = { { ABS_X, 0, 1000 },
335 { ABS_MT_POSITION_X, 0, 1000 },
336 { ABS_MT_POSITION_Y, 0, 1000 },
337 { ABS_MT_TRACKING_ID, -1, 2 },
338 { ABS_MT_SLOT, 0, 1 }};
340 uidev = uinput_device_new(TEST_DEVICE_NAME);
342 for (i = 0; i < nabs; i++) {
343 rc = uinput_device_set_abs_bit(uidev, abs[i].value, &abs[i]);
344 ck_assert_int_eq(rc, 0);
347 rc = uinput_device_create(uidev);
348 ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
350 fd = uinput_device_get_fd(uidev);
351 rc = fcntl(fd, F_SETFL, O_NONBLOCK);
352 ck_assert_msg(rc == 0, "fcntl failed: %s", strerror(errno));
354 uinput_device_event(uidev, EV_ABS, ABS_MT_SLOT, 0);
355 uinput_device_event(uidev, EV_ABS, ABS_X, 100);
356 uinput_device_event(uidev, EV_ABS, ABS_Y, 500);
357 uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_X, 100);
358 uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_Y, 500);
359 uinput_device_event(uidev, EV_ABS, ABS_MT_TRACKING_ID, 1);
360 uinput_device_event(uidev, EV_ABS, ABS_MT_SLOT, 1);
361 uinput_device_event(uidev, EV_ABS, ABS_X, 1);
362 uinput_device_event(uidev, EV_ABS, ABS_Y, 5);
363 uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_X, 1);
364 uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_Y, 5);
365 uinput_device_event(uidev, EV_ABS, ABS_MT_TRACKING_ID, 2);
366 uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
368 rc = libevdev_new_from_fd(fd, &dev);
369 ck_assert_int_eq(rc, 0);
371 ck_assert_int_eq(libevdev_get_current_slot(dev), 1);
372 ck_assert_int_eq(libevdev_get_slot_value(dev, 0, ABS_MT_POSITION_X), 100);
373 ck_assert_int_eq(libevdev_get_slot_value(dev, 0, ABS_MT_POSITION_Y), 500);
374 ck_assert_int_eq(libevdev_get_slot_value(dev, 1, ABS_MT_POSITION_X), 1);
375 ck_assert_int_eq(libevdev_get_slot_value(dev, 1, ABS_MT_POSITION_Y), 5);
377 uinput_device_free(uidev);
382 START_TEST(test_no_slots)
384 struct uinput_device* uidev;
385 struct libevdev *dev;
387 struct input_absinfo abs[] = { { ABS_X, 0, 2 },
389 { ABS_MT_POSITION_X, 0, 2 },
390 { ABS_MT_POSITION_Y, 0, 2 }};
392 rc = test_create_abs_device(&uidev, &dev, 4, abs,
394 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
396 ck_assert_int_eq(libevdev_get_num_slots(dev), -1);
397 ck_assert_int_eq(libevdev_get_current_slot(dev), -1);
399 uinput_device_free(uidev);
404 START_TEST(test_slot_number)
406 struct uinput_device* uidev;
407 struct libevdev *dev;
409 const int nslots = 4;
410 struct input_absinfo abs[] = { { ABS_X, 0, 2 },
412 { ABS_MT_POSITION_X, 0, 2 },
413 { ABS_MT_POSITION_Y, 0, 2 },
414 { ABS_MT_SLOT, 0, nslots - 1 }};
416 rc = test_create_abs_device(&uidev, &dev, 5, abs,
418 ck_assert_msg(rc == 0, "Failed to uinput device: %s", strerror(-rc));
420 ck_assert_int_eq(libevdev_get_num_slots(dev), nslots);
421 ck_assert_int_eq(libevdev_get_current_slot(dev), 0);
423 uinput_device_free(uidev);
429 START_TEST(test_device_name)
431 struct uinput_device* uidev;
432 struct libevdev *dev;
433 struct input_id ids = {1, 2, 3, 4};
437 dev = libevdev_new();
439 str = libevdev_get_name(dev);
440 ck_assert(str != NULL);
441 ck_assert_int_eq(strlen(str), 0);
443 rc = uinput_device_new_with_events(&uidev, TEST_DEVICE_NAME, &ids,
446 ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
447 rc = libevdev_set_fd(dev, uinput_device_get_fd(uidev));
448 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
450 str = libevdev_get_name(dev);
451 ck_assert_int_eq(strcmp(str, TEST_DEVICE_NAME), 0);
453 str = libevdev_get_phys(dev);
454 ck_assert(str == NULL);
456 str = libevdev_get_uniq(dev);
457 ck_assert(str == NULL);
459 ck_assert_int_eq(libevdev_get_id_bustype(dev), ids.bustype);
460 ck_assert_int_eq(libevdev_get_id_vendor(dev), ids.vendor);
461 ck_assert_int_eq(libevdev_get_id_product(dev), ids.product);
462 ck_assert_int_eq(libevdev_get_id_version(dev), ids.version);
463 ck_assert_int_eq(libevdev_get_driver_version(dev), EV_VERSION);
465 uinput_device_free(uidev);
470 START_TEST(test_device_set_name)
472 struct uinput_device* uidev;
473 struct libevdev *dev;
474 struct input_id ids = {1, 2, 3, 4};
478 dev = libevdev_new();
480 libevdev_set_name(dev, "the name");
481 libevdev_set_phys(dev, "the phys");
482 libevdev_set_uniq(dev, "the uniq");
484 str = libevdev_get_name(dev);
485 ck_assert(str != NULL);
486 ck_assert_int_eq(strcmp(str, "the name"), 0);
488 str = libevdev_get_phys(dev);
489 ck_assert(str != NULL);
490 ck_assert_int_eq(strcmp(str, "the phys"), 0);
492 str = libevdev_get_uniq(dev);
493 ck_assert(str != NULL);
494 ck_assert_int_eq(strcmp(str, "the uniq"), 0);
496 rc = uinput_device_new_with_events(&uidev, TEST_DEVICE_NAME, &ids,
499 ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
500 rc = libevdev_set_fd(dev, uinput_device_get_fd(uidev));
501 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
503 str = libevdev_get_name(dev);
504 ck_assert_int_eq(strcmp(str, TEST_DEVICE_NAME), 0);
506 str = libevdev_get_phys(dev);
507 ck_assert(str == NULL);
509 str = libevdev_get_uniq(dev);
510 ck_assert(str == NULL);
512 uinput_device_free(uidev);
517 START_TEST(test_device_set_ids)
519 struct uinput_device* uidev;
520 struct libevdev *dev;
521 struct input_id ids = {1, 2, 3, 4};
524 dev = libevdev_new();
526 libevdev_set_id_product(dev, 10);
527 libevdev_set_id_vendor(dev, 20);
528 libevdev_set_id_bustype(dev, 30);
529 libevdev_set_id_version(dev, 40);
531 ck_assert_int_eq(libevdev_get_id_product(dev), 10);
532 ck_assert_int_eq(libevdev_get_id_vendor(dev), 20);
533 ck_assert_int_eq(libevdev_get_id_bustype(dev), 30);
534 ck_assert_int_eq(libevdev_get_id_version(dev), 40);
536 rc = uinput_device_new_with_events(&uidev, TEST_DEVICE_NAME, &ids,
539 ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
540 rc = libevdev_set_fd(dev, uinput_device_get_fd(uidev));
541 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
543 ck_assert_int_eq(libevdev_get_id_bustype(dev), ids.bustype);
544 ck_assert_int_eq(libevdev_get_id_vendor(dev), ids.vendor);
545 ck_assert_int_eq(libevdev_get_id_product(dev), ids.product);
546 ck_assert_int_eq(libevdev_get_id_version(dev), ids.version);
548 uinput_device_free(uidev);
553 START_TEST(test_device_get_abs_info)
555 struct uinput_device* uidev;
556 struct libevdev *dev;
557 struct input_absinfo abs;
558 const struct input_absinfo *a;
561 uidev = uinput_device_new(TEST_DEVICE_NAME);
562 ck_assert(uidev != NULL);
572 uinput_device_set_abs_bit(uidev, ABS_X, &abs);
573 uinput_device_set_abs_bit(uidev, ABS_MT_POSITION_X, &abs);
582 uinput_device_set_abs_bit(uidev, ABS_Y, &abs);
583 uinput_device_set_abs_bit(uidev, ABS_MT_POSITION_Y, &abs);
585 rc = uinput_device_create(uidev);
586 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
588 rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev);
589 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
591 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_MAX + 1), 0);
592 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_MAX + 1), 0);
593 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_MAX + 1), 0);
594 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_MAX + 1), 0);
595 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_MAX + 1), 0);
596 ck_assert(!libevdev_get_abs_info(dev, ABS_MAX + 1));
598 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_X), 0);
599 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_X), 1000);
600 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_X), 1);
601 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_X), 2);
602 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_X), 3);
603 a = libevdev_get_abs_info(dev, ABS_X);
604 ck_assert(a != NULL);
605 ck_assert_int_eq(a->minimum, 0);
606 ck_assert_int_eq(a->maximum, 1000);
607 ck_assert_int_eq(a->fuzz, 1);
608 ck_assert_int_eq(a->flat, 2);
609 ck_assert_int_eq(a->resolution, 3);
611 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_MT_POSITION_X), 0);
612 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_MT_POSITION_X), 1000);
613 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_MT_POSITION_X), 1);
614 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_MT_POSITION_X), 2);
615 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_MT_POSITION_X), 3);
616 a = libevdev_get_abs_info(dev, ABS_MT_POSITION_X);
617 ck_assert(a != NULL);
618 ck_assert_int_eq(a->minimum, 0);
619 ck_assert_int_eq(a->maximum, 1000);
620 ck_assert_int_eq(a->fuzz, 1);
621 ck_assert_int_eq(a->flat, 2);
622 ck_assert_int_eq(a->resolution, 3);
624 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_Y), -500);
625 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_Y), 500);
626 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_Y), 10);
627 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_Y), 20);
628 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_Y), 30);
629 a = libevdev_get_abs_info(dev, ABS_Y);
630 ck_assert(a != NULL);
631 ck_assert_int_eq(a->minimum, -500);
632 ck_assert_int_eq(a->maximum, 500);
633 ck_assert_int_eq(a->fuzz, 10);
634 ck_assert_int_eq(a->flat, 20);
635 ck_assert_int_eq(a->resolution, 30);
637 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_MT_POSITION_Y), -500);
638 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_MT_POSITION_Y), 500);
639 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_MT_POSITION_Y), 10);
640 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_MT_POSITION_Y), 20);
641 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_MT_POSITION_Y), 30);
642 a = libevdev_get_abs_info(dev, ABS_MT_POSITION_Y);
643 ck_assert(a != NULL);
644 ck_assert_int_eq(a->minimum, -500);
645 ck_assert_int_eq(a->maximum, 500);
646 ck_assert_int_eq(a->fuzz, 10);
647 ck_assert_int_eq(a->flat, 20);
648 ck_assert_int_eq(a->resolution, 30);
650 uinput_device_free(uidev);
655 START_TEST(test_device_set_abs)
657 struct uinput_device* uidev;
658 struct libevdev *dev;
659 struct input_absinfo abs[2];
660 struct input_absinfo a;
663 memset(abs, 0, sizeof(abs));
664 abs[0].value = ABS_X;
665 abs[0].maximum = 1000;
667 abs[1].value = ABS_Y;
668 abs[1].maximum = 1000;
670 rc = test_create_abs_device(&uidev, &dev,
674 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
676 libevdev_set_abs_minimum(dev, ABS_X, 1);
677 libevdev_set_abs_minimum(dev, ABS_Y, 5);
678 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_X), 1);
679 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_Y), 5);
681 libevdev_set_abs_maximum(dev, ABS_X, 3000);
682 libevdev_set_abs_maximum(dev, ABS_Y, 5000);
683 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_X), 3000);
684 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_Y), 5000);
686 libevdev_set_abs_fuzz(dev, ABS_X, 3);
687 libevdev_set_abs_fuzz(dev, ABS_Y, 5);
688 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_X), 3);
689 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_Y), 5);
691 libevdev_set_abs_flat(dev, ABS_X, 8);
692 libevdev_set_abs_flat(dev, ABS_Y, 15);
693 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_X), 8);
694 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_Y), 15);
696 libevdev_set_abs_resolution(dev, ABS_X, 80);
697 libevdev_set_abs_resolution(dev, ABS_Y, 150);
698 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_X), 80);
699 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_Y), 150);
707 libevdev_set_abs_info(dev, ABS_X, &a);
708 ck_assert_int_eq(memcmp(&a, libevdev_get_abs_info(dev, ABS_X), sizeof(a)), 0);
710 libevdev_set_abs_minimum(dev, ABS_Z, 10);
711 ck_assert_int_eq(libevdev_has_event_code(dev, EV_ABS, ABS_Z), 0);
713 uinput_device_free(uidev);
719 START_TEST(test_device_enable_bit)
721 struct uinput_device* uidev;
722 struct libevdev *dev, *dev2;
723 struct input_absinfo abs = {ABS_X, 0, 2};
726 rc = test_create_abs_device(&uidev, &dev, 1, &abs,
728 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
730 ck_assert(!libevdev_has_event_code(dev, EV_ABS, ABS_Y));
731 ck_assert(!libevdev_has_event_type(dev, EV_REL));
732 ck_assert(!libevdev_has_event_code(dev, EV_REL, REL_X));
740 ck_assert_int_eq(libevdev_enable_event_code(dev, EV_ABS, ABS_Y, &abs), 0);
741 ck_assert(libevdev_has_event_code(dev, EV_ABS, ABS_Y));
743 ck_assert_int_eq(libevdev_enable_event_type(dev, EV_REL), 0);
744 ck_assert(libevdev_has_event_type(dev, EV_REL));
745 ck_assert(!libevdev_has_event_code(dev, EV_REL, REL_X));
747 ck_assert_int_eq(libevdev_enable_event_code(dev, EV_REL, REL_X, NULL), 0);
748 ck_assert(libevdev_has_event_code(dev, EV_REL, REL_X));
750 /* make sure kernel device is unchanged */
751 rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev2);
752 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));
753 ck_assert(libevdev_has_event_code(dev2, EV_ABS, ABS_X));
754 ck_assert(!libevdev_has_event_code(dev2, EV_ABS, ABS_Y));
755 ck_assert(!libevdev_has_event_type(dev2, EV_REL));
756 ck_assert(!libevdev_has_event_code(dev2, EV_REL, REL_X));
759 uinput_device_free(uidev);
764 START_TEST(test_device_enable_bit_invalid)
766 struct uinput_device* uidev;
767 struct libevdev *dev;
768 struct input_absinfo abs = {ABS_X, 0, 1};
771 rc = test_create_abs_device(&uidev, &dev, 1, &abs,
773 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
775 ck_assert_int_eq(libevdev_enable_event_code(dev, EV_ABS, ABS_MAX + 1, &abs), -1);
776 ck_assert_int_eq(libevdev_enable_event_code(dev, EV_MAX + 1, ABS_MAX + 1, &abs), -1);
777 ck_assert_int_eq(libevdev_enable_event_type(dev, EV_MAX + 1), -1);
778 /* there's a gap between EV_SW and EV_LED */
779 ck_assert_int_eq(libevdev_enable_event_type(dev, EV_LED - 1), -1);
780 ck_assert_int_eq(libevdev_enable_event_code(dev, EV_LED - 1, 0, NULL), -1);
782 ck_assert_int_eq(libevdev_enable_event_code(dev, EV_ABS, ABS_Y, NULL), -1);
783 ck_assert_int_eq(libevdev_enable_event_code(dev, EV_REP, REP_DELAY, NULL), -1);
784 ck_assert_int_eq(libevdev_enable_event_code(dev, EV_REL, REL_X, &abs), -1);
786 uinput_device_free(uidev);
791 START_TEST(test_device_disable_bit)
793 struct uinput_device* uidev;
794 struct libevdev *dev, *dev2;
796 struct input_absinfo abs[2] = {{ABS_X, 0, 1}, {ABS_Y, 0, 1}};
798 rc = test_create_abs_device(&uidev, &dev,
803 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
805 ck_assert(libevdev_has_event_code(dev, EV_ABS, ABS_X));
806 ck_assert(libevdev_has_event_code(dev, EV_ABS, ABS_Y));
807 ck_assert(libevdev_has_event_type(dev, EV_REL));
808 ck_assert(libevdev_has_event_code(dev, EV_REL, REL_X));
809 ck_assert(libevdev_has_event_code(dev, EV_REL, REL_Y));
811 ck_assert_int_eq(libevdev_disable_event_code(dev, EV_ABS, ABS_Y), 0);
812 ck_assert(!libevdev_has_event_code(dev, EV_ABS, ABS_Y));
814 ck_assert_int_eq(libevdev_disable_event_code(dev, EV_REL, REL_X), 0);
815 ck_assert(!libevdev_has_event_code(dev, EV_REL, REL_X));
816 ck_assert(libevdev_has_event_code(dev, EV_REL, REL_Y));
817 ck_assert(libevdev_has_event_type(dev, EV_REL));
819 ck_assert_int_eq(libevdev_disable_event_type(dev, EV_REL), 0);
820 ck_assert(!libevdev_has_event_type(dev, EV_REL));
821 ck_assert(!libevdev_has_event_code(dev, EV_REL, REL_X));
822 ck_assert(!libevdev_has_event_code(dev, EV_REL, REL_Y));
824 /* make sure kernel device is unchanged */
825 rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev2);
826 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));
827 ck_assert(libevdev_has_event_code(dev2, EV_ABS, ABS_X));
828 ck_assert(libevdev_has_event_code(dev2, EV_ABS, ABS_Y));
829 ck_assert(libevdev_has_event_type(dev2, EV_REL));
830 ck_assert(libevdev_has_event_code(dev2, EV_REL, REL_X));
831 ck_assert(libevdev_has_event_code(dev2, EV_REL, REL_Y));
834 uinput_device_free(uidev);
839 START_TEST(test_device_disable_bit_invalid)
841 struct uinput_device* uidev;
842 struct libevdev *dev;
844 struct input_absinfo abs = {ABS_X, 0, 1};
846 rc = test_create_abs_device(&uidev, &dev, 1, &abs, -1);
847 ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
849 /* there's a gap between EV_SW and EV_LED */
850 ck_assert_int_eq(libevdev_disable_event_type(dev, EV_LED - 1), -1);
851 ck_assert_int_eq(libevdev_disable_event_code(dev, EV_LED - 1, 0), -1);
852 ck_assert_int_eq(libevdev_disable_event_code(dev, EV_ABS, ABS_MAX + 1), -1);
853 ck_assert_int_eq(libevdev_disable_event_code(dev, EV_MAX + 1, ABS_MAX + 1), -1);
854 ck_assert_int_eq(libevdev_disable_event_type(dev, EV_MAX + 1), -1);
855 ck_assert_int_eq(libevdev_disable_event_type(dev, EV_SYN), -1);
856 ck_assert_int_eq(libevdev_disable_event_code(dev, EV_SYN, SYN_REPORT), -1);
858 uinput_device_free(uidev);
863 START_TEST(test_device_kernel_change_axis)
865 struct uinput_device* uidev;
866 struct libevdev *dev, *dev2;
867 struct input_absinfo abs;
870 uidev = uinput_device_new(TEST_DEVICE_NAME);
871 ck_assert(uidev != NULL);
880 uinput_device_set_abs_bit(uidev, ABS_X, &abs);
882 rc = uinput_device_create(uidev);
883 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
885 rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev);
886 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
888 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_X), 0);
889 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_X), 1000);
890 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_X), 1);
891 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_X), 2);
892 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_X), 3);
899 rc = libevdev_kernel_set_abs_info(dev, ABS_X, &abs);
900 ck_assert_int_eq(rc, 0);
902 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_X), 500);
903 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_X), 5000);
904 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_X), 10);
905 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_X), 20);
906 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_X), 30);
908 /* make sure kernel device is changed */
909 rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev2);
910 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));
911 ck_assert_int_eq(libevdev_get_abs_minimum(dev2, ABS_X), 500);
912 ck_assert_int_eq(libevdev_get_abs_maximum(dev2, ABS_X), 5000);
913 ck_assert_int_eq(libevdev_get_abs_fuzz(dev2, ABS_X), 10);
914 ck_assert_int_eq(libevdev_get_abs_flat(dev2, ABS_X), 20);
915 ck_assert_int_eq(libevdev_get_abs_resolution(dev2, ABS_X), 30);
919 uinput_device_free(uidev);
923 START_TEST(test_device_kernel_change_axis_invalid)
925 struct uinput_device* uidev;
926 struct libevdev *dev;
927 struct input_absinfo abs;
930 uidev = uinput_device_new(TEST_DEVICE_NAME);
931 ck_assert(uidev != NULL);
937 /* abs.resolution = 3; FIXME: can't test resolution */
940 uinput_device_set_abs_bit(uidev, ABS_X, &abs);
942 rc = uinput_device_create(uidev);
943 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
945 rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev);
946 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
948 rc = libevdev_kernel_set_abs_info(dev, ABS_MAX + 1, &abs);
949 ck_assert_int_eq(rc, -EINVAL);
952 uinput_device_free(uidev);
956 START_TEST(test_led_valid)
958 struct uinput_device* uidev;
959 struct libevdev *dev;
962 rc = test_create_device(&uidev, &dev,
967 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
969 rc = libevdev_kernel_set_led_value(dev, LED_NUML, LIBEVDEV_LED_ON);
970 ck_assert_int_eq(rc, 0);
971 rc = libevdev_kernel_set_led_value(dev, LED_NUML, LIBEVDEV_LED_OFF);
972 ck_assert_int_eq(rc, 0);
974 rc = libevdev_kernel_set_led_values(dev,
975 LED_NUML, LIBEVDEV_LED_OFF,
976 LED_CAPSL, LIBEVDEV_LED_ON,
977 LED_COMPOSE, LIBEVDEV_LED_OFF,
979 ck_assert_int_eq(rc, 0);
980 ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_NUML));
981 ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_CAPSL));
982 ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_COMPOSE));
984 rc = libevdev_kernel_set_led_values(dev,
985 LED_NUML, LIBEVDEV_LED_ON,
986 LED_CAPSL, LIBEVDEV_LED_OFF,
987 LED_COMPOSE, LIBEVDEV_LED_ON,
989 ck_assert_int_eq(rc, 0);
990 ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_NUML));
991 ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_CAPSL));
992 ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_COMPOSE));
994 /* make sure we ignore unset leds */
995 rc = libevdev_kernel_set_led_values(dev,
996 LED_NUML, LIBEVDEV_LED_ON,
997 LED_CAPSL, LIBEVDEV_LED_OFF,
998 LED_SCROLLL, LIBEVDEV_LED_OFF,
999 LED_COMPOSE, LIBEVDEV_LED_ON,
1001 ck_assert_int_eq(rc, 0);
1002 ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_NUML));
1003 ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_CAPSL));
1004 ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_COMPOSE));
1007 uinput_device_free(uidev);
1011 START_TEST(test_led_invalid)
1013 struct uinput_device* uidev;
1014 struct libevdev *dev;
1017 rc = test_create_device(&uidev, &dev,
1020 EV_LED, LED_COMPOSE,
1022 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
1024 rc = libevdev_kernel_set_led_value(dev, LED_MAX + 1, LIBEVDEV_LED_ON);
1025 ck_assert_int_eq(rc, -EINVAL);
1027 rc = libevdev_kernel_set_led_value(dev, LED_NUML, LIBEVDEV_LED_OFF + 1);
1028 ck_assert_int_eq(rc, -EINVAL);
1030 rc = libevdev_kernel_set_led_value(dev, LED_SCROLLL, LIBEVDEV_LED_ON);
1031 ck_assert_int_eq(rc, 0);
1033 rc = libevdev_kernel_set_led_values(dev,
1034 LED_NUML, LIBEVDEV_LED_OFF + 1,
1036 ck_assert_int_eq(rc, -EINVAL);
1038 rc = libevdev_kernel_set_led_values(dev,
1039 LED_MAX + 1, LIBEVDEV_LED_ON,
1040 LED_NUML, LIBEVDEV_LED_OFF + 1,
1042 ck_assert_int_eq(rc, -EINVAL);
1044 rc = libevdev_kernel_set_led_values(dev,
1045 LED_SCROLLL, LIBEVDEV_LED_OFF,
1047 ck_assert_int_eq(rc, 0);
1050 uinput_device_free(uidev);
1054 START_TEST(test_led_same)
1056 struct uinput_device* uidev;
1057 struct libevdev *dev;
1060 rc = test_create_device(&uidev, &dev,
1063 EV_LED, LED_COMPOSE,
1065 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
1067 rc = libevdev_kernel_set_led_values(dev,
1068 LED_NUML, LIBEVDEV_LED_OFF,
1069 LED_NUML, LIBEVDEV_LED_ON,
1070 LED_NUML, LIBEVDEV_LED_OFF,
1071 LED_NUML, LIBEVDEV_LED_ON,
1072 LED_NUML, LIBEVDEV_LED_OFF,
1073 LED_NUML, LIBEVDEV_LED_ON,
1074 LED_NUML, LIBEVDEV_LED_OFF,
1075 LED_NUML, LIBEVDEV_LED_ON,
1076 LED_NUML, LIBEVDEV_LED_OFF,
1077 LED_NUML, LIBEVDEV_LED_ON,
1078 LED_NUML, LIBEVDEV_LED_OFF,
1079 LED_NUML, LIBEVDEV_LED_ON,
1080 LED_NUML, LIBEVDEV_LED_OFF,
1081 LED_NUML, LIBEVDEV_LED_ON,
1082 LED_NUML, LIBEVDEV_LED_OFF,
1083 LED_NUML, LIBEVDEV_LED_ON,
1084 LED_NUML, LIBEVDEV_LED_OFF,
1085 LED_NUML, LIBEVDEV_LED_ON,
1086 LED_NUML, LIBEVDEV_LED_OFF,
1087 LED_NUML, LIBEVDEV_LED_ON,
1088 LED_NUML, LIBEVDEV_LED_OFF,
1089 LED_NUML, LIBEVDEV_LED_ON,
1090 LED_NUML, LIBEVDEV_LED_OFF,
1091 LED_NUML, LIBEVDEV_LED_ON,
1092 /* more than LED_CNT */
1094 ck_assert_int_eq(rc, 0);
1095 ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_NUML));
1096 ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_CAPSL));
1097 ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_COMPOSE));
1100 uinput_device_free(uidev);
1104 libevdev_has_event_test(void)
1106 Suite *s = suite_create("libevdev_has_event tests");
1108 TCase *tc = tcase_create("event type");
1109 tcase_add_test(tc, test_ev_bit_limits);
1110 tcase_add_test(tc, test_has_ev_bit);
1111 suite_add_tcase(s, tc);
1113 tc = tcase_create("event codes");
1114 tcase_add_test(tc, test_event_codes);
1115 tcase_add_test(tc, test_event_code_limits);
1116 suite_add_tcase(s, tc);
1118 tc = tcase_create("ev_rep");
1119 tcase_add_test(tc, test_ev_rep);
1120 tcase_add_test(tc, test_ev_rep_values);
1121 suite_add_tcase(s, tc);
1123 tc = tcase_create("input properties");
1124 tcase_add_test(tc, test_input_props);
1125 tcase_add_test(tc, test_set_input_props);
1126 suite_add_tcase(s, tc);
1128 tc = tcase_create("multitouch info");
1129 tcase_add_test(tc, test_no_slots);
1130 tcase_add_test(tc, test_slot_number);
1131 tcase_add_test(tc, test_slot_init_value);
1132 suite_add_tcase(s, tc);
1134 tc = tcase_create("device info");
1135 tcase_add_test(tc, test_device_name);
1136 tcase_add_test(tc, test_device_set_name);
1137 tcase_add_test(tc, test_device_set_ids);
1138 tcase_add_test(tc, test_device_get_abs_info);
1139 suite_add_tcase(s, tc);
1141 tc = tcase_create("device bit manipulation");
1142 tcase_add_test(tc, test_device_set_abs);
1143 tcase_add_test(tc, test_device_enable_bit);
1144 tcase_add_test(tc, test_device_enable_bit_invalid);
1145 tcase_add_test(tc, test_device_disable_bit);
1146 tcase_add_test(tc, test_device_disable_bit_invalid);
1147 tcase_add_test(tc, test_device_kernel_change_axis);
1148 tcase_add_test(tc, test_device_kernel_change_axis_invalid);
1149 suite_add_tcase(s, tc);
1151 tc = tcase_create("led manipulation");
1152 tcase_add_test(tc, test_led_valid);
1153 tcase_add_test(tc, test_led_invalid);
1154 tcase_add_test(tc, test_led_same);
1155 suite_add_tcase(s, tc);