diff --git a/test/test-ei.c b/test/test-ei.c index 2ea51e2..5705e35 100644 --- a/test/test-ei.c +++ b/test/test-ei.c @@ -930,6 +930,76 @@ MUNIT_TEST(test_ei_ping) 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) { _unref_(peck) *peck = peck_new(); diff --git a/test/test-eis.c b/test/test-eis.c index 5aff895..0af5d5b 100644 --- a/test/test-eis.c +++ b/test/test-eis.c @@ -608,6 +608,80 @@ MUNIT_TEST(test_eis_ping) 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) { _unref_(peck) *peck = peck_new();