summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorBenjamin Tissoires <benjamin.tissoires@gmail.com>2017-05-19 12:57:23 +0200
committerPeter Hutterer <peter.hutterer@who-t.net>2017-05-23 15:10:10 +1000
commit8fbdef3aadfaa09dfaec50b0f67ec43ad0b55e96 (patch)
tree8aa6ffb1cba5ce2eb2d539ccb5bd00d29c6d7035 /test
parent28fcd2c6d41e972f606c60f56c6f0a94d73455ae (diff)
lid: setup the keyboard notifier when pairing it
On unreliable LID switches, we might have the LID declared as closed while it is actually not. We can not wait for the first switch event to setup the keyboard listener: it will never occur. https://bugs.freedesktop.org/show_bug.cgi?id=101099 Signed-off-by: Benjamin Tissoires <benjamin.tissoires@gmail.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'test')
-rw-r--r--test/test-lid.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/test/test-lid.c b/test/test-lid.c
index 1bd75cb..4bf4c05 100644
--- a/test/test-lid.c
+++ b/test/test-lid.c
@@ -505,6 +505,56 @@ START_TEST(lid_update_hw_on_key)
}
END_TEST
+START_TEST(lid_update_hw_on_key_closed_on_init)
+{
+ struct litest_device *sw = litest_current_device();
+ struct libinput *li;
+ struct litest_device *keyboard;
+ struct libevdev *evdev = sw->evdev;
+ struct input_event ev;
+
+ litest_lid_action(sw, LIBINPUT_SWITCH_STATE_ON);
+
+ /* Make sure kernel state is right */
+ libevdev_next_event(evdev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev);
+ while (libevdev_next_event(evdev, LIBEVDEV_READ_FLAG_SYNC, &ev) >= 0)
+ ;
+ ck_assert(libevdev_get_event_value(evdev, EV_SW, SW_LID));
+
+ keyboard = litest_add_device(sw->libinput, LITEST_KEYBOARD);
+
+ /* separate context for the right state on init */
+ li = litest_create_context();
+ libinput_path_add_device(li,
+ libevdev_uinput_get_devnode(sw->uinput));
+ libinput_path_add_device(li,
+ libevdev_uinput_get_devnode(keyboard->uinput));
+
+ /* don't expect a switch waiting for us */
+ while (libinput_next_event_type(li) != LIBINPUT_EVENT_NONE) {
+ ck_assert_int_ne(libinput_next_event_type(li),
+ LIBINPUT_EVENT_SWITCH_TOGGLE);
+ libinput_event_destroy(libinput_get_event(li));
+ }
+
+ litest_event(keyboard, EV_KEY, KEY_A, 1);
+ litest_event(keyboard, EV_SYN, SYN_REPORT, 0);
+ litest_event(keyboard, EV_KEY, KEY_A, 0);
+ litest_event(keyboard, EV_SYN, SYN_REPORT, 0);
+ /* No switch event, we're still in vanilla (open) state */
+ litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
+
+ /* Make sure kernel state has updated */
+ libevdev_next_event(evdev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev);
+ while (libevdev_next_event(evdev, LIBEVDEV_READ_FLAG_SYNC, &ev) >= 0)
+ ;
+ ck_assert(!libevdev_get_event_value(evdev, EV_SW, SW_LID));
+
+ libinput_unref(li);
+ litest_delete_device(keyboard);
+}
+END_TEST
+
void
litest_setup_tests_lid(void)
{
@@ -525,4 +575,5 @@ litest_setup_tests_lid(void)
litest_add_no_device("lid:disable_touchpad", lid_suspend_with_touchpad);
litest_add_for_device("lid:buggy", lid_update_hw_on_key, LITEST_LID_SWITCH_SURFACE3);
+ litest_add_for_device("lid:buggy", lid_update_hw_on_key_closed_on_init, LITEST_LID_SWITCH_SURFACE3);
}