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: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4031>
This commit is contained in:
José Expósito 2024-09-08 11:27:20 +02:00 committed by Marge Bot
parent 97e50a7285
commit 59c4054c91

View File

@ -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, &registry_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);
}