test: expand the tablet mode switch test to check for fake key releases
authorPeter Hutterer <peter.hutterer@who-t.net>
Fri, 14 Jul 2023 02:57:58 +0000 (12:57 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Sun, 16 Jul 2023 23:32:24 +0000 (09:32 +1000)
If a key is still down when the tablet mode switch goes on, make sure we
release the key before the switch goes in effect.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
test/litest.c
test/litest.h
test/test-switch.c

index 175d7f4213818a51e5c4d6dd24c6a186784ff88d..615a16f747bc46c5f1f55e2113321a65b8b4a432 100644 (file)
@@ -3995,6 +3995,21 @@ litest_is_switch_event(struct libinput_event *event,
        return swev;
 }
 
+void
+litest_assert_switch_event(struct libinput *li,
+                          enum libinput_switch sw,
+                          enum libinput_switch_state state)
+{
+       struct libinput_event *event;
+
+       litest_wait_for_event(li);
+       event = libinput_get_event(li);
+
+       litest_is_switch_event(event, sw, state);
+
+       libinput_event_destroy(event);
+}
+
 void
 litest_assert_pad_button_event(struct libinput *li,
                               unsigned int button,
index a69217b7cd4819df0062aa105f78473ac763918d..5fa1477c72e7ec22f6d6844826f0aaa3fa176318 100644 (file)
@@ -837,6 +837,11 @@ litest_assert_button_event(struct libinput *li,
                           unsigned int button,
                           enum libinput_button_state state);
 
+void
+litest_assert_switch_event(struct libinput *li,
+                          enum libinput_switch sw,
+                          enum libinput_switch_state state);
+
 void
 litest_assert_scroll(struct libinput *li,
                     enum libinput_event_type axis_type,
index f4f3402e0df077f1a5556031c025d914b5fbdf89..23fdb45a578c16ec412b3af2ebb87db7e72574b7 100644 (file)
@@ -1097,13 +1097,23 @@ START_TEST(tablet_mode_disable_keyboard)
 
        litest_keyboard_key(keyboard, KEY_A, true);
        litest_keyboard_key(keyboard, KEY_A, false);
-       litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
+       litest_keyboard_key(keyboard, KEY_B, true); /* KEY_B down but not up */
+       libinput_dispatch(li);
+
+       litest_assert_key_event(li, KEY_A, LIBINPUT_KEY_STATE_PRESSED);
+       litest_assert_key_event(li, KEY_A, LIBINPUT_KEY_STATE_RELEASED);
+       litest_assert_key_event(li, KEY_B, LIBINPUT_KEY_STATE_PRESSED); /* KEY_B down but not up */
 
        litest_switch_action(sw,
                             LIBINPUT_SWITCH_TABLET_MODE,
                             LIBINPUT_SWITCH_STATE_ON);
-       litest_drain_events(li);
 
+       /* The key currently down must be released */
+       litest_assert_key_event(li, KEY_B, LIBINPUT_KEY_STATE_RELEASED);
+       litest_assert_switch_event(li, LIBINPUT_SWITCH_TABLET_MODE, LIBINPUT_SWITCH_STATE_ON);
+       litest_assert_empty_queue(li);
+
+       litest_keyboard_key(keyboard, KEY_B, false); /* release the kernel device */
        litest_keyboard_key(keyboard, KEY_A, true);
        litest_keyboard_key(keyboard, KEY_A, false);
        litest_assert_empty_queue(li);
@@ -1111,11 +1121,16 @@ START_TEST(tablet_mode_disable_keyboard)
        litest_switch_action(sw,
                             LIBINPUT_SWITCH_TABLET_MODE,
                             LIBINPUT_SWITCH_STATE_OFF);
-       litest_assert_only_typed_events(li, LIBINPUT_EVENT_SWITCH_TOGGLE);
+       litest_assert_switch_event(li, LIBINPUT_SWITCH_TABLET_MODE, LIBINPUT_SWITCH_STATE_OFF);
 
        litest_keyboard_key(keyboard, KEY_A, true);
        litest_keyboard_key(keyboard, KEY_A, false);
-       litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY);
+       litest_keyboard_key(keyboard, KEY_B, true);
+       litest_keyboard_key(keyboard, KEY_B, false);
+       litest_assert_key_event(li, KEY_A, LIBINPUT_KEY_STATE_PRESSED);
+       litest_assert_key_event(li, KEY_A, LIBINPUT_KEY_STATE_RELEASED);
+       litest_assert_key_event(li, KEY_B, LIBINPUT_KEY_STATE_PRESSED);
+       litest_assert_key_event(li, KEY_B, LIBINPUT_KEY_STATE_RELEASED);
 
        litest_delete_device(keyboard);
 }