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 test_create_abs_device(&uidev, &dev,
55 test_create_device(&uidev, &dev,
59 ck_assert_msg(libevdev_has_event_type(dev, EV_SYN), "for event type %d\n", *evbit);
60 ck_assert_msg(libevdev_has_event_type(dev, *evbit), "for event type %d\n", *evbit);
62 for (i = 0; i <= EV_MAX; i++) {
63 if (i == EV_SYN || i == *evbit)
66 ck_assert_msg(!libevdev_has_event_type(dev, i), "for event type %d\n", i);
70 uinput_device_free(uidev);
77 START_TEST(test_ev_bit_limits)
82 struct uinput_device* uidev;
85 if (*evbit == EV_ABS) {
86 struct input_absinfo abs = { ABS_X, 0, 2, 0, 0, 0};
87 test_create_abs_device(&uidev, &dev,
91 test_create_device(&uidev, &dev,
95 ck_assert_int_eq(libevdev_has_event_type(dev, EV_MAX + 1), 0);
96 ck_assert_int_eq(libevdev_has_event_type(dev, INT_MAX), 0);
97 ck_assert_int_eq(libevdev_has_event_type(dev, UINT_MAX), 0);
100 uinput_device_free(uidev);
107 START_TEST(test_event_codes)
111 while(*evbit != -1) {
112 struct uinput_device* uidev;
113 struct libevdev *dev;
115 if (*evbit == EV_SYN) {
120 max = libevdev_event_type_get_max(*evbit);
122 for (code = 1; code < max; code += 10) {
123 if (*evbit == EV_ABS) {
124 struct input_absinfo abs = { code, 0, 2, 0, 0, 0};
125 test_create_abs_device(&uidev, &dev,
129 test_create_device(&uidev, &dev,
133 ck_assert_msg(libevdev_has_event_type(dev, *evbit), "for event type %d\n", *evbit);
134 ck_assert_msg(libevdev_has_event_code(dev, *evbit, code), "for type %d code %d", *evbit, code);
135 ck_assert_msg(libevdev_has_event_code(dev, EV_SYN, SYN_REPORT), "for EV_SYN");
137 ck_assert_msg(!libevdev_has_event_code(dev, EV_PWR, 0), "for EV_PWR");
140 uinput_device_free(uidev);
148 START_TEST(test_event_code_limits)
152 while(*evbit != -1) {
153 struct uinput_device* uidev;
154 struct libevdev *dev;
157 if (*evbit == EV_SYN) {
162 max = libevdev_event_type_get_max(*evbit);
163 ck_assert(max != -1);
165 if (*evbit == EV_ABS) {
166 struct input_absinfo abs = { ABS_X, 0, 2, 0, 0, 0};
167 test_create_abs_device(&uidev, &dev,
171 test_create_device(&uidev, &dev,
175 ck_assert_msg(!libevdev_has_event_code(dev, *evbit, max), "for type %d code %d", *evbit, max);
176 ck_assert_msg(!libevdev_has_event_code(dev, *evbit, INT_MAX), "for type %d code %d", *evbit, INT_MAX);
177 ck_assert_msg(!libevdev_has_event_code(dev, *evbit, UINT_MAX), "for type %d code %d", *evbit, UINT_MAX);
180 uinput_device_free(uidev);
187 START_TEST(test_ev_rep)
189 struct libevdev *dev;
190 struct uinput_device* uidev;
193 const int KERNEL_DEFAULT_REP = 250;
194 const int KERNEL_DEFAULT_DELAY = 33;
196 /* EV_REP is special, it's always fully set if set at all,
197 can't test this through uinput though */
198 uidev = uinput_device_new(TEST_DEVICE_NAME);
199 ck_assert(uidev != NULL);
200 rc = uinput_device_set_bit(uidev, EV_REP);
201 ck_assert_int_eq(rc, 0);
203 rc = uinput_device_create(uidev);
204 ck_assert_int_eq(rc, 0);
206 rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev);
207 ck_assert_int_eq(rc, 0);
209 ck_assert_int_eq(libevdev_has_event_type(dev, EV_REP), 1);
210 ck_assert_int_eq(libevdev_has_event_code(dev, EV_REP, REP_DELAY), 1);
211 ck_assert_int_eq(libevdev_has_event_code(dev, EV_REP, REP_PERIOD), 1);
213 ck_assert_int_eq(libevdev_get_repeat(dev, &rep, &delay), 0);
214 /* default values as set by the kernel,
215 see drivers/input/input.c:input_register_device() */
216 ck_assert_int_eq(rep, KERNEL_DEFAULT_REP);
217 ck_assert_int_eq(delay, KERNEL_DEFAULT_DELAY);
220 uinput_device_free(uidev);
224 START_TEST(test_ev_rep_values)
226 struct uinput_device* uidev;
227 struct libevdev *dev;
228 int delay = 0xab, period = 0xbc;
230 /* EV_REP is special, it's always fully set if set at all, can't set
231 it through uinput though. */
232 test_create_device(&uidev, &dev, -1);
234 ck_assert_int_eq(libevdev_get_repeat(dev, NULL, NULL), -1);
235 ck_assert_int_eq(libevdev_get_repeat(dev, &delay, NULL), -1);
236 ck_assert_int_eq(libevdev_get_repeat(dev, NULL, &period), -1);
237 ck_assert_int_eq(libevdev_get_repeat(dev, &delay, &period), -1);
239 ck_assert_int_eq(delay, 0xab);
240 ck_assert_int_eq(period, 0xbc);
242 uinput_device_free(uidev);
247 START_TEST(test_input_props)
249 struct uinput_device* uidev;
250 struct libevdev *dev;
252 struct input_absinfo abs = {0, 0, 2, 0, 0};
254 uidev = uinput_device_new(TEST_DEVICE_NAME);
255 rc = uinput_device_set_abs_bit(uidev, ABS_X, &abs);
256 ck_assert_int_eq(rc, 0);
257 uinput_device_set_prop(uidev, INPUT_PROP_DIRECT);
258 uinput_device_set_prop(uidev, INPUT_PROP_BUTTONPAD);
259 rc = uinput_device_create(uidev);
260 ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
262 rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev);
263 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
266 for (i = 0; i < INPUT_PROP_CNT; i++) {
267 if (i == INPUT_PROP_DIRECT || i == INPUT_PROP_BUTTONPAD)
268 ck_assert_int_eq(libevdev_has_property(dev, i), 1);
270 ck_assert_int_eq(libevdev_has_property(dev, i), 0);
273 ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_MAX + 1), 0);
274 ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_MAX), 0);
276 uinput_device_free(uidev);
281 START_TEST(test_set_input_props)
283 struct uinput_device* uidev;
284 struct libevdev *dev;
286 struct input_absinfo abs = {0, 0, 2, 0, 0};
288 dev = libevdev_new();
289 ck_assert_int_eq(libevdev_enable_property(dev, INPUT_PROP_MAX + 1), -1);
290 ck_assert_int_eq(libevdev_enable_property(dev, INPUT_PROP_DIRECT), 0);
291 ck_assert_int_eq(libevdev_enable_property(dev, INPUT_PROP_BUTTONPAD), 0);
292 ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_DIRECT), 1);
293 ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_BUTTONPAD), 1);
295 uidev = uinput_device_new(TEST_DEVICE_NAME);
296 rc = uinput_device_set_abs_bit(uidev, ABS_X, &abs);
297 ck_assert_int_eq(rc, 0);
298 uinput_device_set_prop(uidev, INPUT_PROP_BUTTONPAD);
299 rc = uinput_device_create(uidev);
300 ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
302 fd = uinput_device_get_fd(uidev);
303 rc = libevdev_set_fd(dev, fd);
304 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
306 ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_DIRECT), 0);
307 ck_assert_int_eq(libevdev_has_property(dev, INPUT_PROP_BUTTONPAD), 1);
309 uinput_device_free(uidev);
314 START_TEST(test_slot_init_value)
316 struct uinput_device *uidev;
317 struct libevdev *dev;
322 struct input_absinfo abs[] = { { ABS_X, 0, 1000 },
324 { ABS_MT_POSITION_X, 0, 1000 },
325 { ABS_MT_POSITION_Y, 0, 1000 },
326 { ABS_MT_TRACKING_ID, -1, 2 },
327 { ABS_MT_SLOT, 0, 1 }};
329 uidev = uinput_device_new(TEST_DEVICE_NAME);
331 for (i = 0; i < nabs; i++) {
332 rc = uinput_device_set_abs_bit(uidev, abs[i].value, &abs[i]);
333 ck_assert_int_eq(rc, 0);
336 rc = uinput_device_create(uidev);
337 ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
339 fd = uinput_device_get_fd(uidev);
340 rc = fcntl(fd, F_SETFL, O_NONBLOCK);
341 ck_assert_msg(rc == 0, "fcntl failed: %s", strerror(errno));
343 uinput_device_event(uidev, EV_ABS, ABS_MT_SLOT, 0);
344 uinput_device_event(uidev, EV_ABS, ABS_X, 100);
345 uinput_device_event(uidev, EV_ABS, ABS_Y, 500);
346 uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_X, 100);
347 uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_Y, 500);
348 uinput_device_event(uidev, EV_ABS, ABS_MT_TRACKING_ID, 1);
349 uinput_device_event(uidev, EV_ABS, ABS_MT_SLOT, 1);
350 uinput_device_event(uidev, EV_ABS, ABS_X, 1);
351 uinput_device_event(uidev, EV_ABS, ABS_Y, 5);
352 uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_X, 1);
353 uinput_device_event(uidev, EV_ABS, ABS_MT_POSITION_Y, 5);
354 uinput_device_event(uidev, EV_ABS, ABS_MT_TRACKING_ID, 2);
355 uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0);
357 rc = libevdev_new_from_fd(fd, &dev);
358 ck_assert_int_eq(rc, 0);
360 ck_assert_int_eq(libevdev_get_current_slot(dev), 1);
361 ck_assert_int_eq(libevdev_get_slot_value(dev, 0, ABS_MT_POSITION_X), 100);
362 ck_assert_int_eq(libevdev_get_slot_value(dev, 0, ABS_MT_POSITION_Y), 500);
363 ck_assert_int_eq(libevdev_get_slot_value(dev, 1, ABS_MT_POSITION_X), 1);
364 ck_assert_int_eq(libevdev_get_slot_value(dev, 1, ABS_MT_POSITION_Y), 5);
366 uinput_device_free(uidev);
371 START_TEST(test_no_slots)
373 struct uinput_device* uidev;
374 struct libevdev *dev;
375 struct input_absinfo abs[] = { { ABS_X, 0, 2 },
377 { ABS_MT_POSITION_X, 0, 2 },
378 { ABS_MT_POSITION_Y, 0, 2 }};
380 test_create_abs_device(&uidev, &dev, 4, abs,
383 ck_assert_int_eq(libevdev_get_num_slots(dev), -1);
384 ck_assert_int_eq(libevdev_get_current_slot(dev), -1);
386 uinput_device_free(uidev);
391 START_TEST(test_slot_number)
393 struct uinput_device* uidev;
394 struct libevdev *dev;
395 const int nslots = 4;
396 struct input_absinfo abs[] = { { ABS_X, 0, 2 },
398 { ABS_MT_POSITION_X, 0, 2 },
399 { ABS_MT_POSITION_Y, 0, 2 },
400 { ABS_MT_SLOT, 0, nslots - 1 }};
402 test_create_abs_device(&uidev, &dev, 5, abs,
405 ck_assert_int_eq(libevdev_get_num_slots(dev), nslots);
406 ck_assert_int_eq(libevdev_get_current_slot(dev), 0);
408 uinput_device_free(uidev);
413 START_TEST(test_invalid_mt_device)
415 struct uinput_device* uidev;
416 struct libevdev *dev;
417 const int nslots = 4;
419 struct input_absinfo abs[] = { { ABS_X, 0, 2 },
421 { ABS_MT_POSITION_X, 0, 2 },
422 { ABS_MT_POSITION_Y, 0, 2 },
423 { ABS_MT_SLOT - 1, 0, 2 },
424 { ABS_MT_SLOT, 0, nslots - 1 }};
426 test_create_abs_device(&uidev, &dev, 6, abs,
429 ck_assert_int_eq(libevdev_get_num_slots(dev), -1);
430 ck_assert_int_eq(libevdev_get_current_slot(dev), -1);
431 ck_assert_int_eq(libevdev_set_slot_value(dev, 0, ABS_MT_POSITION_X, 0), -1);
432 ck_assert_int_eq(libevdev_fetch_slot_value(dev, 0, ABS_MT_POSITION_X, &value), 0);
434 ck_assert(libevdev_has_event_code(dev, EV_ABS, ABS_MT_SLOT - 1));
435 ck_assert(libevdev_has_event_code(dev, EV_ABS, ABS_MT_SLOT));
437 ck_assert_int_eq(libevdev_set_event_value(dev, EV_ABS, ABS_MT_SLOT, 1), 0);
438 ck_assert(libevdev_get_event_value(dev, EV_ABS, ABS_MT_SLOT) == 1);
440 uinput_device_free(uidev);
445 START_TEST(test_device_name)
447 struct uinput_device* uidev;
448 struct libevdev *dev;
449 struct input_id ids = {1, 2, 3, 4};
453 dev = libevdev_new();
455 str = libevdev_get_name(dev);
456 ck_assert(str != NULL);
457 ck_assert_int_eq(strlen(str), 0);
459 rc = uinput_device_new_with_events(&uidev, TEST_DEVICE_NAME, &ids,
462 ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
463 rc = libevdev_set_fd(dev, uinput_device_get_fd(uidev));
464 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
466 str = libevdev_get_name(dev);
467 ck_assert_int_eq(strcmp(str, TEST_DEVICE_NAME), 0);
469 str = libevdev_get_phys(dev);
470 ck_assert(str == NULL);
472 str = libevdev_get_uniq(dev);
473 ck_assert(str == NULL);
475 ck_assert_int_eq(libevdev_get_id_bustype(dev), ids.bustype);
476 ck_assert_int_eq(libevdev_get_id_vendor(dev), ids.vendor);
477 ck_assert_int_eq(libevdev_get_id_product(dev), ids.product);
478 ck_assert_int_eq(libevdev_get_id_version(dev), ids.version);
479 ck_assert_int_eq(libevdev_get_driver_version(dev), EV_VERSION);
481 uinput_device_free(uidev);
486 START_TEST(test_device_set_name)
488 struct uinput_device* uidev;
489 struct libevdev *dev;
490 struct input_id ids = {1, 2, 3, 4};
494 dev = libevdev_new();
496 libevdev_set_name(dev, "the name");
497 libevdev_set_phys(dev, "the phys");
498 libevdev_set_uniq(dev, "the uniq");
500 str = libevdev_get_name(dev);
501 ck_assert(str != NULL);
502 ck_assert_int_eq(strcmp(str, "the name"), 0);
504 str = libevdev_get_phys(dev);
505 ck_assert(str != NULL);
506 ck_assert_int_eq(strcmp(str, "the phys"), 0);
508 str = libevdev_get_uniq(dev);
509 ck_assert(str != NULL);
510 ck_assert_int_eq(strcmp(str, "the uniq"), 0);
512 rc = uinput_device_new_with_events(&uidev, TEST_DEVICE_NAME, &ids,
515 ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
516 rc = libevdev_set_fd(dev, uinput_device_get_fd(uidev));
517 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
519 str = libevdev_get_name(dev);
520 ck_assert_int_eq(strcmp(str, TEST_DEVICE_NAME), 0);
522 str = libevdev_get_phys(dev);
523 ck_assert(str == NULL);
525 str = libevdev_get_uniq(dev);
526 ck_assert(str == NULL);
528 uinput_device_free(uidev);
533 START_TEST(test_device_set_ids)
535 struct uinput_device* uidev;
536 struct libevdev *dev;
537 struct input_id ids = {1, 2, 3, 4};
540 dev = libevdev_new();
542 libevdev_set_id_product(dev, 10);
543 libevdev_set_id_vendor(dev, 20);
544 libevdev_set_id_bustype(dev, 30);
545 libevdev_set_id_version(dev, 40);
547 ck_assert_int_eq(libevdev_get_id_product(dev), 10);
548 ck_assert_int_eq(libevdev_get_id_vendor(dev), 20);
549 ck_assert_int_eq(libevdev_get_id_bustype(dev), 30);
550 ck_assert_int_eq(libevdev_get_id_version(dev), 40);
552 rc = uinput_device_new_with_events(&uidev, TEST_DEVICE_NAME, &ids,
555 ck_assert_msg(rc == 0, "Failed to create uinput device: %s", strerror(-rc));
556 rc = libevdev_set_fd(dev, uinput_device_get_fd(uidev));
557 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
559 ck_assert_int_eq(libevdev_get_id_bustype(dev), ids.bustype);
560 ck_assert_int_eq(libevdev_get_id_vendor(dev), ids.vendor);
561 ck_assert_int_eq(libevdev_get_id_product(dev), ids.product);
562 ck_assert_int_eq(libevdev_get_id_version(dev), ids.version);
564 uinput_device_free(uidev);
569 START_TEST(test_device_get_abs_info)
571 struct uinput_device* uidev;
572 struct libevdev *dev;
573 struct input_absinfo abs;
574 const struct input_absinfo *a;
577 uidev = uinput_device_new(TEST_DEVICE_NAME);
578 ck_assert(uidev != NULL);
588 uinput_device_set_abs_bit(uidev, ABS_X, &abs);
589 uinput_device_set_abs_bit(uidev, ABS_MT_POSITION_X, &abs);
598 uinput_device_set_abs_bit(uidev, ABS_Y, &abs);
599 uinput_device_set_abs_bit(uidev, ABS_MT_POSITION_Y, &abs);
601 rc = uinput_device_create(uidev);
602 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
604 rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev);
605 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
607 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_MAX + 1), 0);
608 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_MAX + 1), 0);
609 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_MAX + 1), 0);
610 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_MAX + 1), 0);
611 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_MAX + 1), 0);
612 ck_assert(!libevdev_get_abs_info(dev, ABS_MAX + 1));
614 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_X), 0);
615 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_X), 1000);
616 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_X), 1);
617 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_X), 2);
618 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_X), 3);
619 a = libevdev_get_abs_info(dev, ABS_X);
620 ck_assert(a != NULL);
621 ck_assert_int_eq(a->minimum, 0);
622 ck_assert_int_eq(a->maximum, 1000);
623 ck_assert_int_eq(a->fuzz, 1);
624 ck_assert_int_eq(a->flat, 2);
625 ck_assert_int_eq(a->resolution, 3);
627 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_MT_POSITION_X), 0);
628 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_MT_POSITION_X), 1000);
629 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_MT_POSITION_X), 1);
630 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_MT_POSITION_X), 2);
631 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_MT_POSITION_X), 3);
632 a = libevdev_get_abs_info(dev, ABS_MT_POSITION_X);
633 ck_assert(a != NULL);
634 ck_assert_int_eq(a->minimum, 0);
635 ck_assert_int_eq(a->maximum, 1000);
636 ck_assert_int_eq(a->fuzz, 1);
637 ck_assert_int_eq(a->flat, 2);
638 ck_assert_int_eq(a->resolution, 3);
640 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_Y), -500);
641 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_Y), 500);
642 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_Y), 10);
643 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_Y), 20);
644 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_Y), 30);
645 a = libevdev_get_abs_info(dev, ABS_Y);
646 ck_assert(a != NULL);
647 ck_assert_int_eq(a->minimum, -500);
648 ck_assert_int_eq(a->maximum, 500);
649 ck_assert_int_eq(a->fuzz, 10);
650 ck_assert_int_eq(a->flat, 20);
651 ck_assert_int_eq(a->resolution, 30);
653 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_MT_POSITION_Y), -500);
654 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_MT_POSITION_Y), 500);
655 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_MT_POSITION_Y), 10);
656 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_MT_POSITION_Y), 20);
657 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_MT_POSITION_Y), 30);
658 a = libevdev_get_abs_info(dev, ABS_MT_POSITION_Y);
659 ck_assert(a != NULL);
660 ck_assert_int_eq(a->minimum, -500);
661 ck_assert_int_eq(a->maximum, 500);
662 ck_assert_int_eq(a->fuzz, 10);
663 ck_assert_int_eq(a->flat, 20);
664 ck_assert_int_eq(a->resolution, 30);
666 uinput_device_free(uidev);
671 START_TEST(test_device_set_abs)
673 struct uinput_device* uidev;
674 struct libevdev *dev;
675 struct input_absinfo abs[2];
676 struct input_absinfo a;
678 memset(abs, 0, sizeof(abs));
679 abs[0].value = ABS_X;
680 abs[0].maximum = 1000;
682 abs[1].value = ABS_Y;
683 abs[1].maximum = 1000;
685 test_create_abs_device(&uidev, &dev,
690 libevdev_set_abs_minimum(dev, ABS_X, 1);
691 libevdev_set_abs_minimum(dev, ABS_Y, 5);
692 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_X), 1);
693 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_Y), 5);
695 libevdev_set_abs_maximum(dev, ABS_X, 3000);
696 libevdev_set_abs_maximum(dev, ABS_Y, 5000);
697 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_X), 3000);
698 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_Y), 5000);
700 libevdev_set_abs_fuzz(dev, ABS_X, 3);
701 libevdev_set_abs_fuzz(dev, ABS_Y, 5);
702 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_X), 3);
703 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_Y), 5);
705 libevdev_set_abs_flat(dev, ABS_X, 8);
706 libevdev_set_abs_flat(dev, ABS_Y, 15);
707 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_X), 8);
708 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_Y), 15);
710 libevdev_set_abs_resolution(dev, ABS_X, 80);
711 libevdev_set_abs_resolution(dev, ABS_Y, 150);
712 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_X), 80);
713 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_Y), 150);
722 libevdev_set_abs_info(dev, ABS_X, &a);
723 ck_assert_int_eq(memcmp(&a, libevdev_get_abs_info(dev, ABS_X), sizeof(a)), 0);
725 libevdev_set_abs_minimum(dev, ABS_Z, 10);
726 ck_assert_int_eq(libevdev_has_event_code(dev, EV_ABS, ABS_Z), 0);
728 uinput_device_free(uidev);
733 START_TEST(test_device_enable_bit)
735 struct uinput_device* uidev;
736 struct libevdev *dev, *dev2;
737 struct input_absinfo abs = {ABS_X, 0, 2};
740 test_create_abs_device(&uidev, &dev, 1, &abs,
743 ck_assert(!libevdev_has_event_code(dev, EV_ABS, ABS_Y));
744 ck_assert(!libevdev_has_event_type(dev, EV_REL));
745 ck_assert(!libevdev_has_event_code(dev, EV_REL, REL_X));
753 ck_assert_int_eq(libevdev_enable_event_code(dev, EV_ABS, ABS_Y, &abs), 0);
754 ck_assert(libevdev_has_event_code(dev, EV_ABS, ABS_Y));
756 ck_assert_int_eq(libevdev_enable_event_type(dev, EV_REL), 0);
757 ck_assert(libevdev_has_event_type(dev, EV_REL));
758 ck_assert(!libevdev_has_event_code(dev, EV_REL, REL_X));
760 ck_assert_int_eq(libevdev_enable_event_code(dev, EV_REL, REL_X, NULL), 0);
761 ck_assert(libevdev_has_event_code(dev, EV_REL, REL_X));
763 /* make sure kernel device is unchanged */
764 rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev2);
765 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));
766 ck_assert(libevdev_has_event_code(dev2, EV_ABS, ABS_X));
767 ck_assert(!libevdev_has_event_code(dev2, EV_ABS, ABS_Y));
768 ck_assert(!libevdev_has_event_type(dev2, EV_REL));
769 ck_assert(!libevdev_has_event_code(dev2, EV_REL, REL_X));
772 uinput_device_free(uidev);
777 START_TEST(test_device_enable_bit_invalid)
779 struct uinput_device* uidev;
780 struct libevdev *dev;
781 struct input_absinfo abs = {ABS_X, 0, 1};
783 test_create_abs_device(&uidev, &dev, 1, &abs,
786 ck_assert_int_eq(libevdev_enable_event_code(dev, EV_ABS, ABS_MAX + 1, &abs), -1);
787 ck_assert_int_eq(libevdev_enable_event_code(dev, EV_MAX + 1, ABS_MAX + 1, &abs), -1);
788 ck_assert_int_eq(libevdev_enable_event_type(dev, EV_MAX + 1), -1);
789 /* there's a gap between EV_SW and EV_LED */
790 ck_assert_int_eq(libevdev_enable_event_type(dev, EV_LED - 1), -1);
791 ck_assert_int_eq(libevdev_enable_event_code(dev, EV_LED - 1, 0, NULL), -1);
793 ck_assert_int_eq(libevdev_enable_event_code(dev, EV_ABS, ABS_Y, NULL), -1);
794 ck_assert_int_eq(libevdev_enable_event_code(dev, EV_REP, REP_DELAY, NULL), -1);
795 ck_assert_int_eq(libevdev_enable_event_code(dev, EV_REL, REL_X, &abs), -1);
797 uinput_device_free(uidev);
802 START_TEST(test_device_disable_bit)
804 struct uinput_device* uidev;
805 struct libevdev *dev, *dev2;
807 struct input_absinfo abs[2] = {{ABS_X, 0, 1}, {ABS_Y, 0, 1}};
809 test_create_abs_device(&uidev, &dev,
815 ck_assert(libevdev_has_event_code(dev, EV_ABS, ABS_X));
816 ck_assert(libevdev_has_event_code(dev, EV_ABS, ABS_Y));
817 ck_assert(libevdev_has_event_type(dev, EV_REL));
818 ck_assert(libevdev_has_event_code(dev, EV_REL, REL_X));
819 ck_assert(libevdev_has_event_code(dev, EV_REL, REL_Y));
821 ck_assert_int_eq(libevdev_disable_event_code(dev, EV_ABS, ABS_Y), 0);
822 ck_assert(!libevdev_has_event_code(dev, EV_ABS, ABS_Y));
824 ck_assert_int_eq(libevdev_disable_event_code(dev, EV_REL, REL_X), 0);
825 ck_assert(!libevdev_has_event_code(dev, EV_REL, REL_X));
826 ck_assert(libevdev_has_event_code(dev, EV_REL, REL_Y));
827 ck_assert(libevdev_has_event_type(dev, EV_REL));
829 ck_assert_int_eq(libevdev_disable_event_type(dev, EV_REL), 0);
830 ck_assert(!libevdev_has_event_type(dev, EV_REL));
831 ck_assert(!libevdev_has_event_code(dev, EV_REL, REL_X));
832 ck_assert(!libevdev_has_event_code(dev, EV_REL, REL_Y));
834 /* make sure kernel device is unchanged */
835 rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev2);
836 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));
837 ck_assert(libevdev_has_event_code(dev2, EV_ABS, ABS_X));
838 ck_assert(libevdev_has_event_code(dev2, EV_ABS, ABS_Y));
839 ck_assert(libevdev_has_event_type(dev2, EV_REL));
840 ck_assert(libevdev_has_event_code(dev2, EV_REL, REL_X));
841 ck_assert(libevdev_has_event_code(dev2, EV_REL, REL_Y));
844 uinput_device_free(uidev);
849 START_TEST(test_device_disable_bit_invalid)
851 struct uinput_device* uidev;
852 struct libevdev *dev;
853 struct input_absinfo abs = {ABS_X, 0, 1};
855 test_create_abs_device(&uidev, &dev, 1, &abs, -1);
857 /* there's a gap between EV_SW and EV_LED */
858 ck_assert_int_eq(libevdev_disable_event_type(dev, EV_LED - 1), -1);
859 ck_assert_int_eq(libevdev_disable_event_code(dev, EV_LED - 1, 0), -1);
860 ck_assert_int_eq(libevdev_disable_event_code(dev, EV_ABS, ABS_MAX + 1), -1);
861 ck_assert_int_eq(libevdev_disable_event_code(dev, EV_MAX + 1, ABS_MAX + 1), -1);
862 ck_assert_int_eq(libevdev_disable_event_type(dev, EV_MAX + 1), -1);
863 ck_assert_int_eq(libevdev_disable_event_type(dev, EV_SYN), -1);
864 ck_assert_int_eq(libevdev_disable_event_code(dev, EV_SYN, SYN_REPORT), -1);
866 uinput_device_free(uidev);
871 START_TEST(test_device_kernel_change_axis)
873 struct uinput_device* uidev;
874 struct libevdev *dev, *dev2;
875 struct input_absinfo abs;
878 uidev = uinput_device_new(TEST_DEVICE_NAME);
879 ck_assert(uidev != NULL);
888 uinput_device_set_abs_bit(uidev, ABS_X, &abs);
890 rc = uinput_device_create(uidev);
891 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
893 rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev);
894 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
896 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_X), 0);
897 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_X), 1000);
898 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_X), 1);
899 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_X), 2);
900 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_X), 3);
907 rc = libevdev_kernel_set_abs_info(dev, ABS_X, &abs);
908 ck_assert_int_eq(rc, 0);
910 ck_assert_int_eq(libevdev_get_abs_minimum(dev, ABS_X), 500);
911 ck_assert_int_eq(libevdev_get_abs_maximum(dev, ABS_X), 5000);
912 ck_assert_int_eq(libevdev_get_abs_fuzz(dev, ABS_X), 10);
913 ck_assert_int_eq(libevdev_get_abs_flat(dev, ABS_X), 20);
914 ck_assert_int_eq(libevdev_get_abs_resolution(dev, ABS_X), 30);
916 /* make sure kernel device is changed */
917 rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev2);
918 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));
919 ck_assert_int_eq(libevdev_get_abs_minimum(dev2, ABS_X), 500);
920 ck_assert_int_eq(libevdev_get_abs_maximum(dev2, ABS_X), 5000);
921 ck_assert_int_eq(libevdev_get_abs_fuzz(dev2, ABS_X), 10);
922 ck_assert_int_eq(libevdev_get_abs_flat(dev2, ABS_X), 20);
923 ck_assert_int_eq(libevdev_get_abs_resolution(dev2, ABS_X), 30);
927 uinput_device_free(uidev);
931 START_TEST(test_device_kernel_change_axis_invalid)
933 struct uinput_device* uidev;
934 struct libevdev *dev;
935 struct input_absinfo abs;
938 uidev = uinput_device_new(TEST_DEVICE_NAME);
939 ck_assert(uidev != NULL);
945 abs.resolution = 3; /* FIXME: value is unused, we can't test resolution */
948 uinput_device_set_abs_bit(uidev, ABS_X, &abs);
950 rc = uinput_device_create(uidev);
951 ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc));
953 rc = libevdev_new_from_fd(uinput_device_get_fd(uidev), &dev);
954 ck_assert_msg(rc == 0, "Failed to init device: %s", strerror(-rc));;
956 rc = libevdev_kernel_set_abs_info(dev, ABS_MAX + 1, &abs);
957 ck_assert_int_eq(rc, -EINVAL);
960 uinput_device_free(uidev);
964 START_TEST(test_led_valid)
966 struct uinput_device* uidev;
967 struct libevdev *dev;
970 test_create_device(&uidev, &dev,
976 rc = libevdev_kernel_set_led_value(dev, LED_NUML, LIBEVDEV_LED_ON);
977 ck_assert_int_eq(rc, 0);
978 rc = libevdev_kernel_set_led_value(dev, LED_NUML, LIBEVDEV_LED_OFF);
979 ck_assert_int_eq(rc, 0);
981 rc = libevdev_kernel_set_led_values(dev,
982 LED_NUML, LIBEVDEV_LED_OFF,
983 LED_CAPSL, LIBEVDEV_LED_ON,
984 LED_COMPOSE, LIBEVDEV_LED_OFF,
986 ck_assert_int_eq(rc, 0);
987 ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_NUML));
988 ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_CAPSL));
989 ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_COMPOSE));
991 rc = libevdev_kernel_set_led_values(dev,
992 LED_NUML, LIBEVDEV_LED_ON,
993 LED_CAPSL, LIBEVDEV_LED_OFF,
994 LED_COMPOSE, LIBEVDEV_LED_ON,
996 ck_assert_int_eq(rc, 0);
997 ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_NUML));
998 ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_CAPSL));
999 ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_COMPOSE));
1001 /* make sure we ignore unset leds */
1002 rc = libevdev_kernel_set_led_values(dev,
1003 LED_NUML, LIBEVDEV_LED_ON,
1004 LED_CAPSL, LIBEVDEV_LED_OFF,
1005 LED_SCROLLL, LIBEVDEV_LED_OFF,
1006 LED_COMPOSE, LIBEVDEV_LED_ON,
1008 ck_assert_int_eq(rc, 0);
1009 ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_NUML));
1010 ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_CAPSL));
1011 ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_COMPOSE));
1014 uinput_device_free(uidev);
1018 START_TEST(test_led_invalid)
1020 struct uinput_device* uidev;
1021 struct libevdev *dev;
1024 test_create_device(&uidev, &dev,
1027 EV_LED, LED_COMPOSE,
1030 rc = libevdev_kernel_set_led_value(dev, LED_MAX + 1, LIBEVDEV_LED_ON);
1031 ck_assert_int_eq(rc, -EINVAL);
1033 rc = libevdev_kernel_set_led_value(dev, LED_NUML, LIBEVDEV_LED_OFF + 1);
1034 ck_assert_int_eq(rc, -EINVAL);
1036 rc = libevdev_kernel_set_led_value(dev, LED_SCROLLL, LIBEVDEV_LED_ON);
1037 ck_assert_int_eq(rc, 0);
1039 rc = libevdev_kernel_set_led_values(dev,
1040 LED_NUML, LIBEVDEV_LED_OFF + 1,
1042 ck_assert_int_eq(rc, -EINVAL);
1044 rc = libevdev_kernel_set_led_values(dev,
1045 LED_MAX + 1, LIBEVDEV_LED_ON,
1046 LED_NUML, LIBEVDEV_LED_OFF + 1,
1048 ck_assert_int_eq(rc, -EINVAL);
1050 rc = libevdev_kernel_set_led_values(dev,
1051 LED_SCROLLL, LIBEVDEV_LED_OFF,
1053 ck_assert_int_eq(rc, 0);
1056 uinput_device_free(uidev);
1060 START_TEST(test_led_same)
1062 struct uinput_device* uidev;
1063 struct libevdev *dev;
1066 test_create_device(&uidev, &dev,
1069 EV_LED, LED_COMPOSE,
1072 rc = libevdev_kernel_set_led_values(dev,
1073 LED_NUML, LIBEVDEV_LED_OFF,
1074 LED_NUML, LIBEVDEV_LED_ON,
1075 LED_NUML, LIBEVDEV_LED_OFF,
1076 LED_NUML, LIBEVDEV_LED_ON,
1077 LED_NUML, LIBEVDEV_LED_OFF,
1078 LED_NUML, LIBEVDEV_LED_ON,
1079 LED_NUML, LIBEVDEV_LED_OFF,
1080 LED_NUML, LIBEVDEV_LED_ON,
1081 LED_NUML, LIBEVDEV_LED_OFF,
1082 LED_NUML, LIBEVDEV_LED_ON,
1083 LED_NUML, LIBEVDEV_LED_OFF,
1084 LED_NUML, LIBEVDEV_LED_ON,
1085 LED_NUML, LIBEVDEV_LED_OFF,
1086 LED_NUML, LIBEVDEV_LED_ON,
1087 LED_NUML, LIBEVDEV_LED_OFF,
1088 LED_NUML, LIBEVDEV_LED_ON,
1089 LED_NUML, LIBEVDEV_LED_OFF,
1090 LED_NUML, LIBEVDEV_LED_ON,
1091 LED_NUML, LIBEVDEV_LED_OFF,
1092 LED_NUML, LIBEVDEV_LED_ON,
1093 LED_NUML, LIBEVDEV_LED_OFF,
1094 LED_NUML, LIBEVDEV_LED_ON,
1095 LED_NUML, LIBEVDEV_LED_OFF,
1096 LED_NUML, LIBEVDEV_LED_ON,
1097 /* more than LED_CNT */
1099 ck_assert_int_eq(rc, 0);
1100 ck_assert_int_eq(1, libevdev_get_event_value(dev, EV_LED, LED_NUML));
1101 ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_CAPSL));
1102 ck_assert_int_eq(0, libevdev_get_event_value(dev, EV_LED, LED_COMPOSE));
1105 uinput_device_free(uidev);
1110 libevdev_has_event_test(void)
1112 Suite *s = suite_create("libevdev_has_event tests");
1114 TCase *tc = tcase_create("event type");
1115 tcase_add_test(tc, test_ev_bit_limits);
1116 tcase_add_test(tc, test_has_ev_bit);
1117 suite_add_tcase(s, tc);
1119 tc = tcase_create("event codes");
1120 tcase_add_test(tc, test_event_codes);
1121 tcase_add_test(tc, test_event_code_limits);
1122 suite_add_tcase(s, tc);
1124 tc = tcase_create("ev_rep");
1125 tcase_add_test(tc, test_ev_rep);
1126 tcase_add_test(tc, test_ev_rep_values);
1127 suite_add_tcase(s, tc);
1129 tc = tcase_create("input properties");
1130 tcase_add_test(tc, test_input_props);
1131 tcase_add_test(tc, test_set_input_props);
1132 suite_add_tcase(s, tc);
1134 tc = tcase_create("multitouch info");
1135 tcase_add_test(tc, test_no_slots);
1136 tcase_add_test(tc, test_slot_number);
1137 tcase_add_test(tc, test_slot_init_value);
1138 tcase_add_test(tc, test_invalid_mt_device);
1139 suite_add_tcase(s, tc);
1141 tc = tcase_create("device info");
1142 tcase_add_test(tc, test_device_name);
1143 tcase_add_test(tc, test_device_set_name);
1144 tcase_add_test(tc, test_device_set_ids);
1145 tcase_add_test(tc, test_device_get_abs_info);
1146 suite_add_tcase(s, tc);
1148 tc = tcase_create("device bit manipulation");
1149 tcase_add_test(tc, test_device_set_abs);
1150 tcase_add_test(tc, test_device_enable_bit);
1151 tcase_add_test(tc, test_device_enable_bit_invalid);
1152 tcase_add_test(tc, test_device_disable_bit);
1153 tcase_add_test(tc, test_device_disable_bit_invalid);
1154 tcase_add_test(tc, test_device_kernel_change_axis);
1155 tcase_add_test(tc, test_device_kernel_change_axis_invalid);
1156 suite_add_tcase(s, tc);
1158 tc = tcase_create("led manipulation");
1159 tcase_add_test(tc, test_led_valid);
1160 tcase_add_test(tc, test_led_invalid);
1161 tcase_add_test(tc, test_led_same);
1162 suite_add_tcase(s, tc);