From 59c4054c9115b0e9389cb896291b8a6be1b7aca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Date: Sun, 8 Sep 2024 11:27:20 +0200 Subject: [PATCH] tests/wayland: Add event queue Add an event queue to the DRM lease client that allows to check that the compositor sent the expected events in the expected order. For the moment, the event queue is used to check that the initial connection to the compositor works as expected. Part-of: --- src/tests/wayland-test-clients/drm-lease.c | 78 +++++++++++++++++++++- 1 file changed, 76 insertions(+), 2 deletions(-) diff --git a/src/tests/wayland-test-clients/drm-lease.c b/src/tests/wayland-test-clients/drm-lease.c index bf823f3cc..431a03b9e 100644 --- a/src/tests/wayland-test-clients/drm-lease.c +++ b/src/tests/wayland-test-clients/drm-lease.c @@ -25,6 +25,19 @@ #include "drm-lease-v1-client-protocol.h" +typedef enum +{ + DEVICE_DRM_FD, + DEVICE_CONNECTOR, + DEVICE_DONE, + DEVICE_RELEASED, + CONNECTOR_NAME, + CONNECTOR_DESCRIPTION, + CONNECTOR_ID, + CONNECTOR_DONE, + CONNECTOR_WITHDRAWN, +} DrmLeaseEventType; + typedef struct _DrmLeaseClient { WaylandDisplay *display; @@ -33,6 +46,9 @@ typedef struct _DrmLeaseClient * Value: DrmLeaseDevice *device */ GHashTable *devices; + + /* Queue of DrmLeaseEventType */ + GQueue *event_queue; } DrmLeaseClient; typedef struct _DrmLeaseDevice @@ -60,6 +76,27 @@ typedef struct _DrmLeaseConnector gboolean done; } DrmLeaseConnector; +static void +event_queue_add (GQueue *event_queue, + DrmLeaseEventType event_type) +{ + g_queue_push_tail (event_queue, GUINT_TO_POINTER (event_type)); +} + +static void +event_queue_assert_event (GQueue *event_queue, + DrmLeaseEventType expected) +{ + DrmLeaseEventType actual = GPOINTER_TO_UINT (g_queue_pop_head (event_queue)); + g_assert (expected == actual); +} + +static void +event_queue_assert_empty (GQueue *event_queue) +{ + g_assert_cmpint (g_queue_get_length (event_queue), ==, 0); +} + static DrmLeaseConnector * drm_lease_connector_new (DrmLeaseDevice *device) { @@ -100,6 +137,8 @@ handle_connector_name (void *user_data, DrmLeaseConnector *connector = drm_lease_connector_lookup (device, drm_lease_connector); + event_queue_add (device->client->event_queue, CONNECTOR_NAME); + connector->name = g_strdup (connector_name); } @@ -112,6 +151,8 @@ handle_connector_description (void *user_data, DrmLeaseConnector *connector = drm_lease_connector_lookup (device, drm_lease_connector); + event_queue_add (device->client->event_queue, CONNECTOR_DESCRIPTION); + connector->description = g_strdup (connector_description); } @@ -124,6 +165,8 @@ handle_connector_connector_id (void *user_data, DrmLeaseConnector *connector = drm_lease_connector_lookup (device, drm_lease_connector); + event_queue_add (device->client->event_queue, CONNECTOR_ID); + connector->id = connector_id; } @@ -135,6 +178,8 @@ handle_connector_done (void *user_data, DrmLeaseConnector *connector = drm_lease_connector_lookup (device, drm_lease_connector); + event_queue_add (device->client->event_queue, CONNECTOR_DONE); + connector->done = TRUE; } @@ -144,6 +189,8 @@ handle_connector_withdrawn (void *user_data, { DrmLeaseDevice *device = user_data; + event_queue_add (device->client->event_queue, CONNECTOR_WITHDRAWN); + wp_drm_lease_connector_v1_destroy (drm_lease_connector); g_hash_table_remove (device->connectors, drm_lease_connector); } @@ -202,6 +249,8 @@ handle_device_drm_fd (void *user_data, DrmLeaseClient *client = user_data; DrmLeaseDevice *device = drm_lease_device_lookup (client, drm_lease_device); + event_queue_add (client->event_queue, DEVICE_DRM_FD); + device->fd = drm_lease_device_fd; } @@ -214,6 +263,8 @@ handle_device_connector (void *user_data, DrmLeaseDevice *device = drm_lease_device_lookup (client, drm_lease_device); DrmLeaseConnector *connector; + event_queue_add (client->event_queue, DEVICE_CONNECTOR); + connector = drm_lease_connector_new (device); g_hash_table_insert (device->connectors, drm_lease_connector, connector); @@ -229,6 +280,8 @@ handle_device_done (void *user_data, DrmLeaseClient *client = user_data; DrmLeaseDevice *device = drm_lease_device_lookup (client, drm_lease_device); + event_queue_add (client->event_queue, DEVICE_DONE); + device->done = TRUE; } @@ -238,6 +291,8 @@ handle_device_released (void *user_data, { DrmLeaseClient *client = user_data; + event_queue_add (client->event_queue, DEVICE_RELEASED); + g_hash_table_remove (client->devices, drm_lease_device); } @@ -290,6 +345,9 @@ drm_lease_client_new (WaylandDisplay *display) DrmLeaseClient *client; struct wl_registry *registry; gboolean client_done = FALSE; + GHashTableIter iter; + DrmLeaseDevice *device; + int n; client = g_new0 (DrmLeaseClient, 1); client->display = display; @@ -297,6 +355,7 @@ drm_lease_client_new (WaylandDisplay *display) g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) drm_lease_device_free); + client->event_queue = g_queue_new (); registry = wl_display_get_registry (display->display); wl_registry_add_listener (registry, ®istry_listener, client); @@ -307,8 +366,6 @@ drm_lease_client_new (WaylandDisplay *display) while (!client_done) { gboolean all_devices_done = TRUE; - GHashTableIter iter; - DrmLeaseDevice *device; wayland_display_dispatch (display); @@ -319,12 +376,29 @@ drm_lease_client_new (WaylandDisplay *display) client_done = all_devices_done; } + g_hash_table_iter_init (&iter, client->devices); + while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &device)) + { + event_queue_assert_event (client->event_queue, DEVICE_DRM_FD); + for (n = 0; n < g_hash_table_size (device->connectors); n++) + { + event_queue_assert_event (client->event_queue, DEVICE_CONNECTOR); + event_queue_assert_event (client->event_queue, CONNECTOR_NAME); + event_queue_assert_event (client->event_queue, CONNECTOR_DESCRIPTION); + event_queue_assert_event (client->event_queue, CONNECTOR_ID); + event_queue_assert_event (client->event_queue, CONNECTOR_DONE); + } + event_queue_assert_event (client->event_queue, DEVICE_DONE); + } + event_queue_assert_empty (client->event_queue); + return client; } static void drm_lease_client_free (DrmLeaseClient *client) { + g_queue_free (client->event_queue); g_clear_pointer (&client->devices, g_hash_table_unref); g_clear_pointer (&client, g_free); }