From: Marek Chalupa Date: Mon, 22 Feb 2016 13:37:00 +0000 (+0100) Subject: tests: add test for receiving an error on destroyed object X-Git-Tag: 1.10.91~33 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=564623653a146ba74714bcf3569d8082a2afd3f0;p=platform%2Fupstream%2Fwayland.git 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 Reviewed-by: Jonas Ã…dahl Reviewed-by: Bryce Harrington Tested-by: Bryce Harrington Reviewed-by: Pekka Paalanen --- 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); +}