aboutsummaryrefslogtreecommitdiffstats
path: root/tests/queue-test.c
diff options
context:
space:
mode:
authorDerek Foreman <derek.foreman@collabora.com>2023-11-10 14:21:48 -0600
committerDaniel Stone <daniels@collabora.com>2024-01-22 12:34:14 +0000
commitb42218f790033c496c48c7d5ba1f8421db794d0b (patch)
tree3cccd51396bc8bed4db77f2b9c271016b652efd1 /tests/queue-test.c
parentconnection: Spruce up logging for client errors. (diff)
downloadwayland-b42218f790033c496c48c7d5ba1f8421db794d0b.tar
wayland-b42218f790033c496c48c7d5ba1f8421db794d0b.tar.gz
wayland-b42218f790033c496c48c7d5ba1f8421db794d0b.tar.bz2
wayland-b42218f790033c496c48c7d5ba1f8421db794d0b.tar.lz
wayland-b42218f790033c496c48c7d5ba1f8421db794d0b.tar.xz
wayland-b42218f790033c496c48c7d5ba1f8421db794d0b.tar.zst
wayland-b42218f790033c496c48c7d5ba1f8421db794d0b.zip
client: Allow setting names for queues
Allow setting a name for an event queue. The queue is used only for printing additional debug information. Debug output can now show the name of the event queue an event is dispatched from, or the event queue of a proxy when a request is made. Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
Diffstat (limited to 'tests/queue-test.c')
-rw-r--r--tests/queue-test.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/tests/queue-test.c b/tests/queue-test.c
index 6562139..cb61a85 100644
--- a/tests/queue-test.c
+++ b/tests/queue-test.c
@@ -472,6 +472,106 @@ client_test_queue_destroy_default_with_attached_proxies(void)
}
static void
+check_queue_name(struct wl_proxy *proxy, const char *name)
+{
+ struct wl_event_queue *queue;
+ const char *queue_name;
+
+ queue = wl_proxy_get_queue(proxy);
+ queue_name = wl_event_queue_get_name(queue);
+ if (!name)
+ assert(!queue_name);
+ else
+ assert(strcmp(queue_name, name) == 0);
+}
+
+static struct wl_callback *
+roundtrip_named_queue_nonblock(struct wl_display *display,
+ struct wl_event_queue *queue,
+ const char *name)
+{
+ struct wl_callback *callback;
+ struct wl_display *wrapped_display = NULL;
+
+ if (queue) {
+ wrapped_display = wl_proxy_create_wrapper(display);
+ assert(wrapped_display);
+ wl_proxy_set_queue((struct wl_proxy *) wrapped_display, queue);
+ check_queue_name((struct wl_proxy *) wrapped_display, name);
+
+ callback = wl_display_sync(wrapped_display);
+ } else
+ callback = wl_display_sync(display);
+
+ check_queue_name((struct wl_proxy *) callback, name);
+
+ if (wrapped_display)
+ wl_proxy_wrapper_destroy(wrapped_display);
+
+ assert(callback != NULL);
+
+ return callback;
+}
+
+static void
+client_test_queue_names(void)
+{
+ struct wl_event_queue *queue1, *queue2, *queue3;
+ struct wl_display *display;
+ struct wl_callback *callback1, *callback2, *callback3, *callback4;
+ struct wl_event_queue *default_queue;
+ char *log;
+ size_t log_len;
+ const char *default_queue_name;
+
+ display = wl_display_connect(NULL);
+ assert(display);
+
+ default_queue = wl_proxy_get_queue((struct wl_proxy *) display);
+ default_queue_name = wl_event_queue_get_name(default_queue);
+ assert(strcmp(default_queue_name, "Default Queue") == 0);
+
+ /* Create some event queues both with and without names. */
+ queue1 = wl_display_create_queue_with_name(display, "First");
+ assert(queue1);
+
+ queue2 = wl_display_create_queue_with_name(display, "Second");
+ assert(queue2);
+
+ queue3 = wl_display_create_queue(display);
+ assert(queue3);
+
+ /* Create some requests and ensure their queues have the expected
+ * names.
+ */
+ callback1 = roundtrip_named_queue_nonblock(display, queue1, "First");
+ callback2 = roundtrip_named_queue_nonblock(display, queue2, "Second");
+ callback3 = roundtrip_named_queue_nonblock(display, queue3, NULL);
+ callback4 = roundtrip_named_queue_nonblock(display, NULL, "Default Queue");
+
+ /* Destroy one queue with proxies still attached so we can verify
+ * that the queue name is in the log message. */
+ wl_event_queue_destroy(queue2);
+ log = map_file(client_log_fd, &log_len);
+ assert(strstr(log, "Second"));
+
+ /* There's no reason for the First queue name to be present. */
+ assert(!strstr(log, "First"));
+
+ munmap(log, log_len);
+
+ wl_callback_destroy(callback1);
+ wl_callback_destroy(callback2);
+ wl_callback_destroy(callback3);
+ wl_callback_destroy(callback4);
+
+ wl_event_queue_destroy(queue1);
+ wl_event_queue_destroy(queue3);
+
+ wl_display_disconnect(display);
+}
+
+static void
dummy_bind(struct wl_client *client,
void *data, uint32_t version, uint32_t id)
{
@@ -597,3 +697,15 @@ TEST(queue_destroy_default_with_attached_proxies)
display_destroy(d);
}
+
+TEST(queue_names)
+{
+ struct display *d = display_create();
+
+ test_set_timeout(2);
+
+ client_create_noarg(d, client_test_queue_names);
+ display_run(d);
+
+ display_destroy(d);
+}