tests/wayland: Add connector lease test

Add a test that:
- Creates 2 clients
- Leases a connector using the first client
- Checks that the first client receives a lease_fd event
- Checks that both clients receive a connector withdrawn event
- Finishes the lease
- Check that both clients have access to the connector

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4031>
This commit is contained in:
José Expósito 2024-09-08 19:24:06 +02:00 committed by Marge Bot
parent c366e32da6
commit e6178fae6d
2 changed files with 209 additions and 0 deletions

View File

@ -58,6 +58,18 @@ test_drm_lease_release_device (void)
g_test_assert_expected_messages (); g_test_assert_expected_messages ();
} }
static void
test_drm_lease_lease_request (void)
{
MetaWaylandTestClient *wayland_test_client;
wayland_test_client = meta_wayland_test_client_new_with_args (test_context,
"drm-lease",
"lease-request",
NULL);
meta_wayland_test_client_finish (wayland_test_client);
}
static void static void
init_tests (void) init_tests (void)
{ {
@ -65,6 +77,8 @@ init_tests (void)
test_drm_lease_client_connection); test_drm_lease_client_connection);
g_test_add_func ("/wayland/drm-lease/release-device", g_test_add_func ("/wayland/drm-lease/release-device",
test_drm_lease_release_device); test_drm_lease_release_device);
g_test_add_func ("/wayland/drm-lease/lease-request",
test_drm_lease_lease_request);
} }
static void static void

View File

@ -36,6 +36,8 @@ typedef enum
CONNECTOR_ID, CONNECTOR_ID,
CONNECTOR_DONE, CONNECTOR_DONE,
CONNECTOR_WITHDRAWN, CONNECTOR_WITHDRAWN,
LEASE_FD,
LEASE_FINISHED,
} DrmLeaseEventType; } DrmLeaseEventType;
typedef struct _DrmLeaseClient typedef struct _DrmLeaseClient
@ -76,6 +78,17 @@ typedef struct _DrmLeaseConnector
gboolean done; gboolean done;
} DrmLeaseConnector; } DrmLeaseConnector;
typedef struct _DrmLeaseLease
{
DrmLeaseClient *client;
struct wp_drm_lease_v1 *lease;
struct wp_drm_lease_request_v1 *request;
int32_t fd;
gboolean done;
} DrmLeaseLease;
static void static void
event_queue_add (GQueue *event_queue, event_queue_add (GQueue *event_queue,
DrmLeaseEventType event_type) DrmLeaseEventType event_type)
@ -97,6 +110,35 @@ event_queue_assert_empty (GQueue *event_queue)
g_assert_cmpint (g_queue_get_length (event_queue), ==, 0); g_assert_cmpint (g_queue_get_length (event_queue), ==, 0);
} }
static void
handle_lease_fd (void *user_data,
struct wp_drm_lease_v1 *drm_lease,
int32_t lease_fd)
{
DrmLeaseLease *lease = user_data;
event_queue_add (lease->client->event_queue, LEASE_FD);
lease->fd = lease_fd;
lease->done = TRUE;
}
static void
handle_finished (void *user_data,
struct wp_drm_lease_v1 *drm_lease)
{
DrmLeaseLease *lease = user_data;
event_queue_add (lease->client->event_queue, LEASE_FINISHED);
lease->done = TRUE;
}
static const struct wp_drm_lease_v1_listener lease_listener = {
.lease_fd = handle_lease_fd,
.finished = handle_finished,
};
static DrmLeaseConnector * static DrmLeaseConnector *
drm_lease_connector_new (DrmLeaseDevice *device) drm_lease_connector_new (DrmLeaseDevice *device)
{ {
@ -128,6 +170,37 @@ drm_lease_connector_lookup (DrmLeaseDevice *device,
return connector; return connector;
} }
static void
drm_lease_connector_get_at_index (guint index,
DrmLeaseDevice *device,
struct wp_drm_lease_connector_v1 **out_drm_lease_connector,
DrmLeaseConnector **out_connector)
{
gpointer key, value;
GHashTableIter iter;
guint n = 0;
g_hash_table_iter_init (&iter, device->connectors);
while (g_hash_table_iter_next (&iter, &key, &value))
{
if (n != index)
{
n++;
continue;
}
if (out_drm_lease_connector)
*out_drm_lease_connector = key;
if (out_connector)
*out_connector = value;
return;
}
g_assert_not_reached ();
}
static void static void
handle_connector_name (void *user_data, handle_connector_name (void *user_data,
struct wp_drm_lease_connector_v1 *drm_lease_connector, struct wp_drm_lease_connector_v1 *drm_lease_connector,
@ -370,6 +443,71 @@ static const struct wl_registry_listener registry_listener = {
handle_registry_global_remove handle_registry_global_remove
}; };
static DrmLeaseLease *
drm_lease_lease_new (DrmLeaseClient *client,
guint device_index,
guint *connector_indices,
int num_connectors)
{
DrmLeaseLease *lease;
DrmLeaseDevice *device;
struct wp_drm_lease_device_v1 *drm_lease_device;
int n;
lease = g_new0 (DrmLeaseLease, 1);
lease->client = client;
lease->fd = -1;
drm_lease_device_get_at_index (device_index,
client,
&drm_lease_device,
&device);
lease->request =
wp_drm_lease_device_v1_create_lease_request (drm_lease_device);
for (n = 0; n < num_connectors; n++)
{
struct wp_drm_lease_connector_v1 *drm_lease_connector;
guint connector_index = connector_indices[n];
drm_lease_connector_get_at_index (connector_index,
device,
&drm_lease_connector,
NULL);
wp_drm_lease_request_v1_request_connector (lease->request,
drm_lease_connector);
}
return lease;
}
static void
drm_lease_lease_submit (DrmLeaseLease *lease)
{
lease->lease = wp_drm_lease_request_v1_submit (lease->request);
wp_drm_lease_v1_add_listener (lease->lease, &lease_listener, lease);
while (!lease->done)
{
if (wl_display_dispatch (lease->client->display->display) == -1)
return;
}
}
static void
drm_lease_lease_destroy (DrmLeaseLease *lease)
{
wp_drm_lease_v1_destroy (lease->lease);
}
static void
drm_lease_lease_free (DrmLeaseLease *lease)
{
g_clear_pointer (&lease, g_free);
}
static DrmLeaseClient * static DrmLeaseClient *
drm_lease_client_new (WaylandDisplay *display) drm_lease_client_new (WaylandDisplay *display)
{ {
@ -485,6 +623,61 @@ test_drm_lease_release_device (WaylandDisplay *display)
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
static int
test_drm_lease_lease_request (WaylandDisplay *display)
{
DrmLeaseClient *client1;
DrmLeaseClient *client2;
DrmLeaseLease *lease;
guint connectors[] = {0};
int num_connectors = G_N_ELEMENTS (connectors);
client1 = drm_lease_client_new (display);
client2 = drm_lease_client_new (display);
/* Create and submit a lease request */
lease = drm_lease_lease_new (client1, 0, connectors, num_connectors);
drm_lease_lease_submit (lease);
/* Check that the lease succeeded*/
event_queue_assert_event (client1->event_queue, CONNECTOR_WITHDRAWN);
event_queue_assert_event (client1->event_queue, DEVICE_DONE);
event_queue_assert_event (client1->event_queue, LEASE_FD);
event_queue_assert_empty (client1->event_queue);
/* Check that the other client receive the withdrawn event */
event_queue_assert_event (client2->event_queue, CONNECTOR_WITHDRAWN);
event_queue_assert_event (client2->event_queue, DEVICE_DONE);
event_queue_assert_empty (client2->event_queue);
/* Finish the lease and check that both clients have access to the leased
connector again */
drm_lease_lease_destroy (lease);
g_assert_cmpint (wl_display_roundtrip (display->display), !=, -1);
event_queue_assert_event (client1->event_queue, DEVICE_CONNECTOR);
event_queue_assert_event (client1->event_queue, CONNECTOR_NAME);
event_queue_assert_event (client1->event_queue, CONNECTOR_DESCRIPTION);
event_queue_assert_event (client1->event_queue, CONNECTOR_ID);
event_queue_assert_event (client1->event_queue, CONNECTOR_DONE);
event_queue_assert_event (client1->event_queue, DEVICE_DONE);
event_queue_assert_empty (client1->event_queue);
event_queue_assert_event (client2->event_queue, DEVICE_CONNECTOR);
event_queue_assert_event (client2->event_queue, CONNECTOR_NAME);
event_queue_assert_event (client2->event_queue, CONNECTOR_DESCRIPTION);
event_queue_assert_event (client2->event_queue, CONNECTOR_ID);
event_queue_assert_event (client2->event_queue, CONNECTOR_DONE);
event_queue_assert_event (client2->event_queue, DEVICE_DONE);
event_queue_assert_empty (client2->event_queue);
drm_lease_lease_free (lease);
drm_lease_client_free (client1);
drm_lease_client_free (client2);
return EXIT_SUCCESS;
}
int int
main (int argc, main (int argc,
char **argv) char **argv)
@ -502,6 +695,8 @@ main (int argc,
return test_drm_lease_client_connection (display); return test_drm_lease_client_connection (display);
else if (g_strcmp0 (test_case, "release-device") == 0) else if (g_strcmp0 (test_case, "release-device") == 0)
return test_drm_lease_release_device (display); return test_drm_lease_release_device (display);
else if (g_strcmp0 (test_case, "lease-request") == 0)
return test_drm_lease_lease_request (display);
return EXIT_FAILURE; return EXIT_FAILURE;
} }