summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Chalupa <mchqwerty@gmail.com>2016-02-22 14:37:00 +0100
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>2016-02-26 11:56:10 +0200
commit564623653a146ba74714bcf3569d8082a2afd3f0 (patch)
tree1f383ebc5a0294d6849d16ce786a9c03394cbba8
parent25fcb88a269a434196cf89df835ba6326bacacab (diff)
downloadwayland-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.c50
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);
+}