diff --git a/test/test-ei.c b/test/test-ei.c index 31b3110..158b012 100644 --- a/test/test-ei.c +++ b/test/test-ei.c @@ -49,6 +49,33 @@ MUNIT_TEST(test_ei_disconnect_immediately) return MUNIT_OK; } +MUNIT_TEST(test_ei_disconnect_self_immediately) +{ + _unref_(peck) *peck = peck_new(); + + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE); + peck_dispatch_until_stable(peck); + + /* Disconnect before server processed CONNECT */ + with_client(peck) { + peck_drop_ei(peck); + ei_unref(ei); + } + + peck_dispatch_until_stable(peck); + + /* Expect the client to get a disconnect event */ + with_server(peck) { + _unref_(eis_event) *connect = + peck_eis_next_event(eis, EIS_EVENT_CLIENT_CONNECT); + _unref_(eis_event) *disconnect = + peck_eis_next_event(eis, EIS_EVENT_CLIENT_DISCONNECT); + } + + return MUNIT_OK; +} + + MUNIT_TEST(test_ei_disconnect_after_connect) { _unref_(peck) *peck = peck_new(); @@ -83,6 +110,102 @@ MUNIT_TEST(test_ei_disconnect_after_connect) return MUNIT_OK; } +MUNIT_TEST(test_ei_disconnect_self_after_connect) +{ + _unref_(peck) *peck = peck_new(); + + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE); + peck_dispatch_until_stable(peck); + + with_client(peck) { + peck_drop_ei(peck); + ei_unref(ei); + } + + peck_dispatch_until_stable(peck); + + with_server(peck) { + _unref_(eis_event) *connect = + peck_eis_next_event(eis, EIS_EVENT_CLIENT_CONNECT); + _unref_(eis_event) *disconnect = + peck_eis_next_event(eis, EIS_EVENT_CLIENT_DISCONNECT); + } + + return MUNIT_OK; +} + +MUNIT_TEST(test_ei_disconnect_after_seat) +{ + _unref_(peck) *peck = peck_new(); + _unref_(eis_client) *client = NULL; + + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_CLIENT); + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_DEFAULT_SEAT); + peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_NONE); + + peck_dispatch_until_stable(peck); + + with_client(peck) { + _unref_(ei_event) *connect = + peck_ei_next_event(ei, EI_EVENT_CONNECT); + _unref_(ei_event) *seat = + peck_ei_next_event(ei, EI_EVENT_SEAT_ADDED); + } + + with_server(peck) { + struct eis_client *client = peck_eis_get_default_client(peck); + eis_client_disconnect(client); + } + + peck_dispatch_until_stable(peck); + + with_client(peck) { + _unref_(ei_event) *seat = + peck_ei_next_event(ei, EI_EVENT_SEAT_REMOVED); + _unref_(ei_event) *disconnect = + peck_ei_next_event(ei, EI_EVENT_DISCONNECT); + } + + return MUNIT_OK; +} + +MUNIT_TEST(test_ei_disconnect_self_after_seat) +{ + _unref_(peck) *peck = peck_new(); + _unref_(eis_client) *client = NULL; + + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_CLIENT); + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_DEFAULT_SEAT); + peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_NONE); + + peck_dispatch_until_stable(peck); + + with_client(peck) { + _unref_(ei_event) *connect = + peck_ei_next_event(ei, EI_EVENT_CONNECT); + _unref_(ei_event) *seat = + peck_ei_next_event(ei, EI_EVENT_SEAT_ADDED); + peck_drop_ei(peck); + /* Disconnect from client */ + ei_unref(ei); + + /* There is no way to disconnect from the server without + * destroying the context, so we don't care about the actual + * events here + */ + } + + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE); + peck_dispatch_until_stable(peck); + + with_server(peck) { + _unref_(eis_event) *disconnect = + peck_eis_next_event(eis, EIS_EVENT_CLIENT_DISCONNECT); + } + + return MUNIT_OK; +} + MUNIT_TEST(test_ei_disconnect_after_add_before_received) { _unref_(peck) *peck = peck_new(); @@ -119,6 +242,44 @@ MUNIT_TEST(test_ei_disconnect_after_add_before_received) return MUNIT_OK; } +MUNIT_TEST(test_ei_disconnect_self_after_add_before_received) +{ + _unref_(peck) *peck = peck_new(); + _unref_(eis_client) *client = NULL; + + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_CLIENT); + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_DEFAULT_SEAT); + peck_dispatch_until_stable(peck); + + with_client(peck) { + struct ei_seat *seat = peck_ei_get_default_seat(peck); + _unref_(ei_device) *device = ei_device_new(seat); + ei_device_configure_name(device, __func__); + ei_device_configure_capability(device, EI_DEVICE_CAP_POINTER); + ei_device_add(device); + peck_drop_ei(peck); + ei_unref(ei); + } + + peck_dispatch_eis(peck); + + with_server(peck) { + _unref_(eis_event) *added = + peck_eis_next_event(eis, EIS_EVENT_DEVICE_ADDED); + + /* Device is already gone, but let's say we add it anyway */ + struct eis_device *device = eis_event_get_device(added); + eis_device_connect(device); + + _unref_(eis_event) *removed = + peck_eis_next_event(eis, EIS_EVENT_DEVICE_REMOVED); + _unref_(eis_event) *disconnect = + peck_eis_next_event(eis, EIS_EVENT_CLIENT_DISCONNECT); + } + + return MUNIT_OK; +} + MUNIT_TEST(test_ei_disconnect_after_add_after_received) { _unref_(peck) *peck = peck_new(); @@ -157,6 +318,49 @@ MUNIT_TEST(test_ei_disconnect_after_add_after_received) return MUNIT_OK; } +MUNIT_TEST(test_ei_disconnect_self_after_add_after_received) +{ + _unref_(peck) *peck = peck_new(); + _unref_(eis_client) *client = NULL; + + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_CLIENT); + peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_DEFAULT_SEAT); + peck_dispatch_until_stable(peck); + + with_client(peck) { + struct ei_seat *seat = peck_ei_get_default_seat(peck); + _unref_(ei_device) *device = ei_device_new(seat); + ei_device_configure_name(device, __func__); + ei_device_configure_capability(device, EI_DEVICE_CAP_POINTER); + ei_device_add(device); + } + + peck_dispatch_eis(peck); + + with_client(peck) { + peck_drop_ei(peck); + ei_unref(ei); + } + + peck_dispatch_eis(peck); + + with_server(peck) { + _unref_(eis_event) *added = + peck_eis_next_event(eis, EIS_EVENT_DEVICE_ADDED); + + /* Device is already gone, but let's say we add it anyway */ + struct eis_device *device = eis_event_get_device(added); + eis_device_connect(device); + + _unref_(eis_event) *removed = + peck_eis_next_event(eis, EIS_EVENT_DEVICE_REMOVED); + _unref_(eis_event) *disconnect = + peck_eis_next_event(eis, EIS_EVENT_CLIENT_DISCONNECT); + } + + return MUNIT_OK; +} + MUNIT_TEST(test_ei_disconnect_after_remove_before_received) { _unref_(peck) *peck = peck_new();