END_TEST START_TEST(test_empty_sync) { struct uinput_device* uidev; struct libevdev *dev; int rc; struct input_event ev; rc = test_create_device(&uidev, &dev, EV_SYN, SYN_REPORT, EV_SYN, SYN_DROPPED, EV_KEY, BTN_LEFT, EV_KEY, BTN_MIDDLE, EV_KEY, BTN_RIGHT, -1); ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc)); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev); ck_assert_int_eq(rc, -EAGAIN); uinput_device_free(uidev); libevdev_free(dev); }
void run_test(struct parser_test *test) { struct discover_boot_option *opt; struct discover_context *ctx; struct discover_device *dev; test_read_conf_embedded(test, "/grub.cfg"); test_run_parser(test, "grub2"); ctx = test->ctx; check_boot_option_count(ctx, 1); opt = get_boot_option(ctx, 0); check_name(opt, "Linux"); check_unresolved_resource(opt->boot_image); test_remove_device(test, test->ctx->device); dev = test_create_device(test, "external"); dev->uuid = "ec50d321-aab1-4335-8a87-aa8fadd80a09"; test_hotplug_device(test, dev); check_boot_option_count(ctx, 0); }
END_TEST START_TEST(test_syn_delta_button) { struct uinput_device* uidev; struct libevdev *dev; int rc; struct input_event ev; rc = test_create_device(&uidev, &dev, EV_SYN, SYN_REPORT, EV_SYN, SYN_DROPPED, EV_REL, REL_X, EV_REL, REL_Y, EV_KEY, BTN_LEFT, EV_KEY, BTN_MIDDLE, EV_KEY, BTN_RIGHT, EV_KEY, KEY_MAX, -1); ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc)); uinput_device_event(uidev, EV_KEY, BTN_LEFT, 1); uinput_device_event(uidev, EV_KEY, BTN_RIGHT, 1); uinput_device_event(uidev, EV_KEY, KEY_MAX, 1); uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC); ck_assert_int_eq(ev.type, EV_KEY); ck_assert_int_eq(ev.code, BTN_LEFT); ck_assert_int_eq(ev.value, 1); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC); ck_assert_int_eq(ev.type, EV_KEY); ck_assert_int_eq(ev.code, BTN_RIGHT); ck_assert_int_eq(ev.value, 1); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC); ck_assert_int_eq(ev.type, EV_KEY); ck_assert_int_eq(ev.code, KEY_MAX); ck_assert_int_eq(ev.value, 1); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC); ck_assert_int_eq(ev.type, EV_SYN); ck_assert_int_eq(ev.code, SYN_REPORT); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev); ck_assert_int_eq(rc, -EAGAIN); ck_assert(libevdev_get_event_value(dev, EV_KEY, BTN_LEFT)); ck_assert(libevdev_get_event_value(dev, EV_KEY, BTN_RIGHT)); ck_assert(!libevdev_get_event_value(dev, EV_KEY, BTN_MIDDLE)); ck_assert(libevdev_get_event_value(dev, EV_KEY, KEY_MAX)); uinput_device_free(uidev); libevdev_free(dev); }
END_TEST START_TEST(test_syn_delta_sw) { struct uinput_device* uidev; struct libevdev *dev; int rc; struct input_event ev; rc = test_create_device(&uidev, &dev, EV_SYN, SYN_REPORT, EV_SYN, SYN_DROPPED, EV_SW, SW_LID, EV_SW, SW_MICROPHONE_INSERT, EV_SW, SW_MAX, -1); ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc)); uinput_device_event(uidev, EV_SW, SW_LID, 1); uinput_device_event(uidev, EV_SW, SW_MICROPHONE_INSERT, 1); uinput_device_event(uidev, EV_SW, SW_MAX, 1); uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC); ck_assert_int_eq(ev.type, EV_SW); ck_assert_int_eq(ev.code, SW_LID); ck_assert_int_eq(ev.value, 1); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC); ck_assert_int_eq(ev.type, EV_SW); ck_assert_int_eq(ev.code, SW_MICROPHONE_INSERT); ck_assert_int_eq(ev.value, 1); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC); ck_assert_int_eq(ev.type, EV_SW); ck_assert_int_eq(ev.code, SW_MAX); ck_assert_int_eq(ev.value, 1); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC); ck_assert_int_eq(ev.type, EV_SYN); ck_assert_int_eq(ev.code, SYN_REPORT); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_SYNC, &ev); ck_assert_int_eq(rc, -EAGAIN); ck_assert_int_eq(libevdev_get_event_value(dev, EV_SW, SW_LID), 1); ck_assert_int_eq(libevdev_get_event_value(dev, EV_SW, SW_MICROPHONE_INSERT), 1); ck_assert_int_eq(libevdev_get_event_value(dev, EV_SW, SW_MAX), 1); uinput_device_free(uidev); libevdev_free(dev); }
END_TEST START_TEST(test_event_code_filtered) { struct uinput_device* uidev; struct libevdev *dev; int rc; struct input_event ev; rc = test_create_device(&uidev, &dev, EV_REL, REL_X, EV_REL, REL_Y, EV_KEY, BTN_LEFT, -1); ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc)); libevdev_disable_event_code(dev, EV_REL, REL_X); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev); ck_assert_int_eq(rc, -EAGAIN); uinput_device_event(uidev, EV_REL, REL_X, 1); uinput_device_event(uidev, EV_REL, REL_Y, 1); uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SUCCESS); ck_assert_int_eq(ev.type, EV_REL); ck_assert_int_eq(ev.code, REL_Y); ck_assert_int_eq(ev.value, 1); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SUCCESS); ck_assert_int_eq(ev.type, EV_SYN); ck_assert_int_eq(ev.code, SYN_REPORT); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev); ck_assert_int_eq(rc, -EAGAIN); libevdev_free(dev); uinput_device_free(uidev); }
END_TEST START_TEST(test_has_event_pending) { struct uinput_device* uidev; struct libevdev *dev; int rc; struct input_event ev; rc = test_create_device(&uidev, &dev, EV_REL, REL_X, EV_REL, REL_Y, EV_KEY, BTN_LEFT, -1); ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc)); ck_assert_int_eq(libevdev_has_event_pending(dev), 0); uinput_device_event(uidev, EV_REL, REL_X, 1); uinput_device_event(uidev, EV_REL, REL_Y, 1); uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0); ck_assert_int_eq(libevdev_has_event_pending(dev), 1); libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev); ck_assert_int_eq(libevdev_has_event_pending(dev), 1); while ((rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev)) != -EAGAIN) ; ck_assert_int_eq(libevdev_has_event_pending(dev), 0); libevdev_change_fd(dev, -1); ck_assert_int_eq(libevdev_has_event_pending(dev), -EBADF); libevdev_free(dev); uinput_device_free(uidev); }
END_TEST START_TEST(test_syn_event) { struct uinput_device* uidev; struct libevdev *dev; int rc; struct input_event ev; int pipefd[2]; rc = test_create_device(&uidev, &dev, EV_SYN, SYN_REPORT, EV_SYN, SYN_DROPPED, EV_REL, REL_X, EV_REL, REL_Y, EV_KEY, BTN_LEFT, -1); ck_assert_msg(rc == 0, "Failed to create device: %s", strerror(-rc)); /* This is a bid complicated: we can't get SYN_DROPPED through uinput, so we push two events down uinput, and fetch one off libevdev (reading in the other one on the way). Then write a SYN_DROPPED on a pipe, switch the fd and read one event off the wire (but returning the second event from before). Switch back, so that when we do read off the SYN_DROPPED we have the fd back on the device and the ioctls work. */ uinput_device_event(uidev, EV_KEY, BTN_LEFT, 1); uinput_device_event(uidev, EV_SYN, SYN_REPORT, 0); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SUCCESS); ck_assert_int_eq(ev.type, EV_KEY); ck_assert_int_eq(ev.code, BTN_LEFT); rc = pipe2(pipefd, O_NONBLOCK); ck_assert_int_eq(rc, 0); libevdev_change_fd(dev, pipefd[0]); ev.type = EV_SYN; ev.code = SYN_DROPPED; ev.value = 0; rc = write(pipefd[1], &ev, sizeof(ev)); ck_assert_int_eq(rc, sizeof(ev)); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev); libevdev_change_fd(dev, uinput_device_get_fd(uidev)); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SUCCESS); ck_assert_int_eq(ev.type, EV_SYN); ck_assert_int_eq(ev.code, SYN_REPORT); rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev); ck_assert_int_eq(rc, LIBEVDEV_READ_STATUS_SYNC); /* only check for the rc, nothing actually changed on the device */ libevdev_free(dev); uinput_device_free(uidev); close(pipefd[0]); close(pipefd[1]); }