mirror of
https://gitlab.freedesktop.org/libinput/libei.git
synced 2025-12-20 12:40:06 +01:00
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:
parent
6c50e2f8a0
commit
cae398c132
2 changed files with 144 additions and 0 deletions
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue