Test if events are going to the right queue and if the queue is interrupted from polling when an error to the main queue comes. The last one is failing. --- tests/queue-test.c | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+)
diff --git a/tests/queue-test.c b/tests/queue-test.c index 36d7a69..307bae9 100644 --- a/tests/queue-test.c +++ b/tests/queue-test.c @@ -27,6 +27,7 @@ #include <sys/types.h> #include <sys/wait.h> #include <assert.h> +#include <pthread.h> #include "wayland-client.h" #include "wayland-server.h" @@ -139,6 +140,53 @@ client_test_multiple_queues(void) exit(ret == -1 ? -1 : 0); } +/* test that events will come to the right queue */ +static void +client_test_multiple_queues2(void) +{ + struct wl_event_queue *queue[5], *q; + struct wl_callback *callback; + struct wl_display *display; + int i, j; + + display = wl_display_connect(NULL); + assert(display); + + for (i = 0; i < 5; ++i) { + queue[i] = wl_display_create_queue(display); + assert(queue[i]); + } + + for (i = 0; i < 100; ++i) { + q = queue[i % 5]; + callback = wl_display_sync(display); + assert(callback != NULL); + wl_proxy_set_queue((struct wl_proxy *) callback, q); + + assert(wl_display_flush(display) > 0); + + /* the callback should come to the q queue */ + assert(wl_display_dispatch_pending(display) == 0); + assert(wl_display_dispatch_queue(display, q) > 0); + /* now all queues should be empty */ + for (j = 0; j < 5; ++j) + assert(wl_display_dispatch_queue_pending(display, + queue[j]) == 0); + } + + callback = wl_display_sync(display); + assert(callback != NULL); + + assert(wl_display_flush(display) > 0); + assert(wl_display_dispatch(display) > 0); + for (j = 0; j < 5; ++j) { + assert(wl_display_dispatch_queue_pending(display, queue[j]) == 0); + wl_event_queue_destroy(queue[j]); + } + + wl_display_disconnect(display); +} + static void dummy_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id) @@ -169,5 +217,85 @@ TEST(queue) client_create(d, client_test_multiple_queues); display_run(d); + client_create(d, client_test_multiple_queues2); + display_run(d); + + display_destroy(d); +} + +struct thread_data { + struct wl_display *display; + struct wl_event_queue *queue; +}; + +static void * +run_new_queue(void *arg) +{ + struct thread_data *data = arg; + int ret; + + /* XXX shouldn't it return -1 in the first dispatch? + * Anyway - the queue keeps polling atm and is not interrupted by + * the error */ + do { + ret = wl_display_dispatch_queue(data->display, data->queue); + /* it definitely cannot dispatch any event */ + assert(ret <= 0); + } while (ret != -1); + + pthread_exit(NULL); +} + +static void +client_test_multiple_queues_errors(void) +{ + struct client *c; + struct wl_event_queue *queue; + struct thread_data data; + pthread_t thr; + + c = client_connect(); + + queue = wl_display_create_queue(c->wl_display); + assert(queue); + + data.display = c->wl_display; + data.queue = queue; + /* run new thread that will wait for event in + * the new queue. Then post an error and check + * if the dispatching was cancelled... */ + assert(pthread_create(&thr, NULL, run_new_queue, &data) == 0); + + stop_display(c, 1); + + /* make sure we got the error */ + alarm(3); /* timeout */ + wl_display_roundtrip(c->wl_display); + assert(wl_display_get_error(c->wl_display) != 0); + + /* wait for the thread to finish */ + assert(pthread_join(thr, NULL) == 0); + + /* do not use client_disconnect(c), because it would + * fail the test since we posted an error */ + wl_event_queue_destroy(queue); + wl_proxy_destroy((struct wl_proxy *) c->tc); + wl_display_disconnect(c->wl_display); +} + +TEST(queue_errors) +{ + struct display *d = display_create(); + + client_create(d, client_test_multiple_queues_errors); + display_run(d); + + /* get the client */ + struct client_info *ci = wl_container_of(d->clients.next, ci, link); + assert(ci && ci->wl_client != NULL); + + wl_client_post_no_memory(ci->wl_client); + display_resume(d); + display_destroy(d); } -- 1.9.3 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel