diff --git a/tests/weston-test-client-helper.c b/tests/weston-test-client-helper.c index 186b3956..92cee9f0 100644 --- a/tests/weston-test-client-helper.c +++ b/tests/weston-test-client-helper.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include "../shared/os-compatibility.h" @@ -512,6 +513,53 @@ skip(const char *fmt, ...) exit(77); } +void +expect_protocol_error(struct client *client, + const struct wl_interface *intf, + uint32_t code) +{ + int err; + uint32_t errcode, failed = 0; + const struct wl_interface *interface; + unsigned int id; + + /* if the error has not come yet, make it happen */ + wl_display_roundtrip(client->wl_display); + + err = wl_display_get_error(client->wl_display); + + assert(err && "Expected protocol error but nothing came"); + assert(err == EPROTO && "Expected protocol error but got local error"); + + errcode = wl_display_get_protocol_error(client->wl_display, + &interface, &id); + + /* check error */ + if (errcode != code) { + fprintf(stderr, "Should get error code %d but got %d\n", + code, errcode); + failed = 1; + } + + /* this should be definitely set */ + assert(interface); + + if (strcmp(intf->name, interface->name) != 0) { + fprintf(stderr, "Should get interface '%s' but got '%s'\n", + intf->name, interface->name); + failed = 1; + } + + if (failed) { + fprintf(stderr, "Expected other protocol error\n"); + abort(); + } + + /* all OK */ + fprintf(stderr, "Got expected protocol error on '%s' (object id: %d) " + "with code %d\n", interface->name, id, errcode); +} + static void log_handler(const char *fmt, va_list args) { diff --git a/tests/weston-test-client-helper.h b/tests/weston-test-client-helper.h index 4bfc3fac..f1546611 100644 --- a/tests/weston-test-client-helper.h +++ b/tests/weston-test-client-helper.h @@ -129,4 +129,8 @@ get_n_egl_buffers(struct client *client); void skip(const char *fmt, ...); +void +expect_protocol_error(struct client *client, + const struct wl_interface *intf, uint32_t code); + #endif