test: add a test for delaying the ping/sync

For both the tests send two pings, with a keyboard event in between.
Where the ping is processed, fetch all the events first up front, and
process them one by one in the right order.

Part-of: <https://gitlab.freedesktop.org/libinput/libei/-/merge_requests/340>
This commit is contained in:
Peter Hutterer 2025-08-25 12:56:27 +10:00 committed by Jonas Ådahl
parent 6c50e2f8a0
commit cae398c132
2 changed files with 144 additions and 0 deletions

View file

@ -930,6 +930,76 @@ MUNIT_TEST(test_ei_ping)
return MUNIT_OK; return MUNIT_OK;
} }
MUNIT_TEST(test_ei_ping_delayed_pong)
{
_unref_(peck) *peck = peck_new();
uint32_t ping_id_1 = 0, ping_id_2 = 0;
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_KEYBOARD);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_RESUME_DEVICE);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTOSTART);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_HANDLE_ADDED);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_HANDLE_ADDED_KEYBOARD);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_HANDLE_RESUMED);
peck_dispatch_until_stable(peck);
peck_disable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_disable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_FRAME);
peck_disable_ei_behavior(peck, PECK_EI_BEHAVIOR_HANDLE_SYNC);
with_client(peck) {
peck_drain_ei(ei);
/* We send two ping events, one before and one after the frame */
struct ei_device *device = peck_ei_get_default_keyboard(peck);
_unref_(ei_ping) *ping1 = ei_new_ping(ei);
_unref_(ei_ping) *ping2 = ei_new_ping(ei);
ping_id_1 = ei_ping_get_id(ping1);
ping_id_2 = ei_ping_get_id(ping2);
ei_ping(ping1);
ei_device_keyboard_key(device, 123, true);
ei_device_frame(device, ei_now(ei));
ei_ping(ping2);
}
peck_dispatch_until_stable(peck);
with_server(peck) {
/* check events arrive in the right order, without processing them */
struct eis_event *ping1 = peck_eis_next_event(eis, EIS_EVENT_SYNC);
_unref_(eis_event) *key = peck_eis_next_event(eis, EIS_EVENT_KEYBOARD_KEY);
_unref_(eis_event) *frame = peck_eis_next_event(eis, EIS_EVENT_FRAME);
struct eis_event *ping2 = peck_eis_next_event(eis, EIS_EVENT_SYNC);
eis_event_unref(ping1);
/* Send the modifiers event as if it was processed between the two pings. */
eis_device_keyboard_send_xkb_modifiers(eis_event_get_device(key), 0x1, 0x2, 0x3, 0x4);
eis_event_unref(ping2);
}
peck_dispatch_until_stable(peck);
with_client(peck) {
_unref_(ei_event) *pong1 = peck_ei_next_event(ei, EI_EVENT_PONG);
_unref_(ei_event) *mods = peck_ei_next_event(ei, EI_EVENT_KEYBOARD_MODIFIERS);
_unref_(ei_event) *pong2 = peck_ei_next_event(ei, EI_EVENT_PONG);
struct ei_ping *ping1 = ei_event_pong_get_ping(pong1);
struct ei_ping *ping2 = ei_event_pong_get_ping(pong2);
munit_assert_int64(ping_id_1, ==, ei_ping_get_id(ping1));
munit_assert_int64(ping_id_2, ==, ei_ping_get_id(ping2));
}
return MUNIT_OK;
}
MUNIT_TEST(test_ei_ping_within_frame) MUNIT_TEST(test_ei_ping_within_frame)
{ {
_unref_(peck) *peck = peck_new(); _unref_(peck) *peck = peck_new();

View file

@ -608,6 +608,80 @@ MUNIT_TEST(test_eis_ping)
return MUNIT_OK; return MUNIT_OK;
} }
MUNIT_TEST(test_eis_ping_delayed_pong)
{
_unref_(peck) *peck = peck_new();
uint32_t ping_id_1 = 0, ping_id_2 = 0;
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_KEYBOARD);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_RESUME_DEVICE);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTOSTART);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_HANDLE_ADDED);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_HANDLE_ADDED_KEYBOARD);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_HANDLE_RESUMED);
peck_dispatch_until_stable(peck);
peck_disable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_disable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_FRAME);
peck_disable_ei_behavior(peck, PECK_EI_BEHAVIOR_HANDLE_SYNC);
with_server(peck) {
peck_drain_eis(eis);
}
with_server(peck) {
struct eis_client *client = peck_eis_get_default_client(peck);
struct eis_device *keyboard = peck_eis_get_default_keyboard(peck);
_unref_(eis_ping) *ping1 = eis_client_new_ping(client);
_unref_(eis_ping) *ping2 = eis_client_new_ping(client);
ping_id_1 = eis_ping_get_id(ping1);
ping_id_2 = eis_ping_get_id(ping2);
eis_ping(ping1);
eis_device_keyboard_send_xkb_modifiers(keyboard, 0x1, 0x2, 0x3, 0x4);
eis_ping(ping2);
}
peck_dispatch_until_stable(peck);
with_client(peck) {
/* check events arrive in the right order, without processing them */
struct ei_event *ping1 = peck_ei_next_event(ei, EI_EVENT_SYNC);
_unref_(ei_event) *mods = peck_ei_next_event(ei, EI_EVENT_KEYBOARD_MODIFIERS);
struct ei_event *ping2 = peck_ei_next_event(ei, EI_EVENT_SYNC);
ei_event_unref(ping1);
/* Send the key as if it was processed between the two pings. */
struct ei_device *keyboard = peck_ei_get_default_keyboard(peck);
ei_device_keyboard_key(keyboard, 123, true);
ei_device_frame(keyboard, ei_now(ei));
ei_event_unref(ping2);
}
peck_dispatch_until_stable(peck);
with_server(peck) {
_unref_(eis_event) *pong1 = peck_eis_next_event(eis, EIS_EVENT_PONG);
_unref_(eis_event) *key = peck_eis_next_event(eis, EIS_EVENT_KEYBOARD_KEY);
_unref_(eis_event) *frame = peck_eis_next_event(eis, EIS_EVENT_FRAME);
_unref_(eis_event) *pong2 = peck_eis_next_event(eis, EIS_EVENT_PONG);
struct eis_ping *ping1 = eis_event_pong_get_ping(pong1);
struct eis_ping *ping2 = eis_event_pong_get_ping(pong2);
munit_assert_int64(ping_id_1, ==, eis_ping_get_id(ping1));
munit_assert_int64(ping_id_2, ==, eis_ping_get_id(ping2));
}
return MUNIT_OK;
}
MUNIT_TEST(eistest_ignore_EPIPE) MUNIT_TEST(eistest_ignore_EPIPE)
{ {
_unref_(peck) *peck = peck_new(); _unref_(peck) *peck = peck_new();