diff options
author | Daniel Stone <daniels@collabora.com> | 2022-07-21 11:18:48 +0100 |
---|---|---|
committer | Daniel Stone <daniels@collabora.com> | 2022-10-20 11:26:22 +0000 |
commit | 86d73b2da221bc9ca059195af4c97297fd5221c6 (patch) | |
tree | abb35e6293379d5818f43339b56da12f9c5779df | |
parent | 51d788de5b5b3443fa1ca71115d16a53281c5ed9 (diff) | |
download | wayland-86d73b2da221bc9ca059195af4c97297fd5221c6.tar.gz |
tests: Ensure resource vs. client destroy handler order
Make sure that the client destroy handler runs strictly before the
resource destroy handler, which runs strictly before the client
late-destroy handler.
Signed-off-by: Daniel Stone <daniels@collabora.com>
-rw-r--r-- | tests/client-test.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/tests/client-test.c b/tests/client-test.c index 01ebc4e..47be83f 100644 --- a/tests/client-test.c +++ b/tests/client-test.c @@ -43,6 +43,8 @@ struct client_destroy_listener { bool done; struct wl_listener late_listener; bool late_done; + struct wl_listener resource_listener; + bool resource_done; }; static void @@ -51,8 +53,20 @@ client_destroy_notify(struct wl_listener *l, void *data) struct client_destroy_listener *listener = wl_container_of(l, listener, listener); - assert(!listener->late_done); listener->done = true; + assert(!listener->resource_done); + assert(!listener->late_done); +} + +static void +client_resource_destroy_notify(struct wl_listener *l, void *data) +{ + struct client_destroy_listener *listener = + wl_container_of(l, listener, resource_listener); + + assert(listener->done); + listener->resource_done = true; + assert(!listener->late_done); } static void @@ -62,6 +76,7 @@ client_late_destroy_notify(struct wl_listener *l, void *data) wl_container_of(l, listener, late_listener); assert(listener->done); + assert(listener->resource_done); listener->late_done = true; } @@ -69,6 +84,7 @@ TEST(client_destroy_listener) { struct wl_display *display; struct wl_client *client; + struct wl_resource *resource; struct client_destroy_listener a, b; int s[2]; @@ -78,33 +94,47 @@ TEST(client_destroy_listener) client = wl_client_create(display, s[0]); assert(client); + resource = wl_resource_create(client, &wl_callback_interface, 1, 0); + assert(resource); + a.listener.notify = client_destroy_notify; a.done = false; + a.resource_listener.notify = client_resource_destroy_notify; + a.resource_done = false; a.late_listener.notify = client_late_destroy_notify; a.late_done = false; wl_client_add_destroy_listener(client, &a.listener); + wl_resource_add_destroy_listener(resource, &a.resource_listener); wl_client_add_destroy_late_listener(client, &a.late_listener); assert(wl_client_get_destroy_listener(client, client_destroy_notify) == &a.listener); + assert(wl_resource_get_destroy_listener(resource, client_resource_destroy_notify) == + &a.resource_listener); assert(wl_client_get_destroy_late_listener(client, client_late_destroy_notify) == &a.late_listener); b.listener.notify = client_destroy_notify; b.done = false; + b.resource_listener.notify = client_resource_destroy_notify; + b.resource_done = false; b.late_listener.notify = client_late_destroy_notify; b.late_done = false; wl_client_add_destroy_listener(client, &b.listener); + wl_resource_add_destroy_listener(resource, &b.resource_listener); wl_client_add_destroy_late_listener(client, &b.late_listener); wl_list_remove(&a.listener.link); + wl_list_remove(&a.resource_listener.link); wl_list_remove(&a.late_listener.link); wl_client_destroy(client); assert(!a.done); + assert(!a.resource_done); assert(!a.late_done); assert(b.done); + assert(b.resource_done); assert(b.late_done); close(s[0]); |