diff options
author | Marek Chalupa <mchqwerty@gmail.com> | 2016-02-22 14:37:00 +0100 |
---|---|---|
committer | Pekka Paalanen <pekka.paalanen@collabora.co.uk> | 2016-02-26 11:56:10 +0200 |
commit | 564623653a146ba74714bcf3569d8082a2afd3f0 (patch) | |
tree | 1f383ebc5a0294d6849d16ce786a9c03394cbba8 | |
parent | 25fcb88a269a434196cf89df835ba6326bacacab (diff) | |
download | wayland-564623653a146ba74714bcf3569d8082a2afd3f0.tar.gz |
tests: add test for receiving an error on destroyed object
test if receiving an error on already destroyed object won't
do any harm
Signed-off-by: Marek Chalupa <mchqwerty@gmail.com>
Reviewed-by: Jonas Ã…dahl <jadahl@gmail.com>
Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
Tested-by: Bryce Harrington <bryce@osg.samsung.com>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
-rw-r--r-- | tests/display-test.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/tests/display-test.c b/tests/display-test.c index 1a6c345..f9f8160 100644 --- a/tests/display-test.c +++ b/tests/display-test.c @@ -876,3 +876,53 @@ TEST(versions) display_destroy(d); } + +static void +check_error_on_destroyed_object(void *data) +{ + struct client *c; + struct wl_seat *seat; + uint32_t id; + const struct wl_interface *intf; + + c = client_connect(); + seat = client_get_seat(c); + + /* destroy the seat proxy. The display won't know + * about it yet, so it will post the error as usual */ + wl_proxy_destroy((struct wl_proxy *) seat); + + /* let display post the error. The error will + * be caught in stop_display while dispatching */ + assert(stop_display(c, 1) == -1); + + /* check the returned error. Since the object was destroyed, + * we don't know the interface and id */ + assert(wl_display_get_error(c->wl_display) == EPROTO); + assert(wl_display_get_protocol_error(c->wl_display, &intf, &id) == 23); + assert(intf == NULL); + assert(id == 0); + + client_disconnect_nocheck(c); +} + +TEST(error_on_destroyed_object) +{ + struct client_info *cl; + struct display *d = display_create(); + + wl_global_create(d->wl_display, &wl_seat_interface, + 1, d, bind_seat); + + cl = client_create_noarg(d, check_error_on_destroyed_object); + display_run(d); + + /* did client bind to the seat? */ + assert(cl->data); + + /* post error on the destroyed object */ + wl_resource_post_error((struct wl_resource *) cl->data, + 23, "Dummy error"); + display_resume(d); + display_destroy(d); +} |