From c366e32da6b61a7395348ae867c9f217a303d64a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Date: Sun, 8 Sep 2024 12:49:47 +0200 Subject: [PATCH] tests/wayland: Add DRM lease device release test Add a test that: - Creates 2 clients - Releases a device for each client - Checks that releasing a device for one client doesn't affect the other - Checks that an error is raised if a released client is used Part-of: --- src/tests/wayland-drm-lease-tests.c | 17 +++++ src/tests/wayland-test-clients/drm-lease.c | 73 ++++++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/src/tests/wayland-drm-lease-tests.c b/src/tests/wayland-drm-lease-tests.c index f42fb73e5..cf5e186a4 100644 --- a/src/tests/wayland-drm-lease-tests.c +++ b/src/tests/wayland-drm-lease-tests.c @@ -43,11 +43,28 @@ test_drm_lease_client_connection (void) meta_wayland_test_client_finish (wayland_test_client); } +static void +test_drm_lease_release_device (void) +{ + MetaWaylandTestClient *wayland_test_client; + + wayland_test_client = meta_wayland_test_client_new_with_args (test_context, + "drm-lease", + "release-device", + NULL); + g_test_expect_message ("libmutter", G_LOG_LEVEL_WARNING, + "WL: error in client communication*"); + meta_wayland_test_client_finish (wayland_test_client); + g_test_assert_expected_messages (); +} + static void init_tests (void) { g_test_add_func ("/wayland/drm-lease/client-connection", test_drm_lease_client_connection); + g_test_add_func ("/wayland/drm-lease/release-device", + test_drm_lease_release_device); } static void diff --git a/src/tests/wayland-test-clients/drm-lease.c b/src/tests/wayland-test-clients/drm-lease.c index 431a03b9e..0c6c80221 100644 --- a/src/tests/wayland-test-clients/drm-lease.c +++ b/src/tests/wayland-test-clients/drm-lease.c @@ -241,6 +241,37 @@ drm_lease_device_lookup (DrmLeaseClient *client, return device; } +static void +drm_lease_device_get_at_index (guint index, + DrmLeaseClient *client, + struct wp_drm_lease_device_v1 **out_drm_lease_device, + DrmLeaseDevice **out_device) +{ + gpointer key, value; + GHashTableIter iter; + guint n = 0; + + g_hash_table_iter_init (&iter, client->devices); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + if (n != index) + { + n++; + continue; + } + + if (out_drm_lease_device) + *out_drm_lease_device = key; + + if (out_device) + *out_device = value; + + return; + } + + g_assert_not_reached (); +} + static void handle_device_drm_fd (void *user_data, struct wp_drm_lease_device_v1 *drm_lease_device, @@ -414,6 +445,46 @@ test_drm_lease_client_connection (WaylandDisplay *display) return EXIT_SUCCESS; } +static int +test_drm_lease_release_device (WaylandDisplay *display) +{ + DrmLeaseClient *client1; + DrmLeaseClient *client2; + struct wp_drm_lease_device_v1 *drm_lease_device; + + client1 = drm_lease_client_new (display); + client2 = drm_lease_client_new (display); + + /* Release the first client's device */ + drm_lease_device_get_at_index (0, client1, &drm_lease_device, NULL); + wp_drm_lease_device_v1_release (drm_lease_device); + g_assert_cmpint (wl_display_roundtrip (display->display), !=, -1); + + event_queue_assert_event (client1->event_queue, DEVICE_RELEASED); + event_queue_assert_empty (client1->event_queue); + event_queue_assert_empty (client2->event_queue); + + /* Release the second client's device */ + drm_lease_device_get_at_index (0, client2, &drm_lease_device, NULL); + wp_drm_lease_device_v1_release (drm_lease_device); + g_assert_cmpint (wl_display_roundtrip (display->display), !=, -1); + + event_queue_assert_event (client2->event_queue, DEVICE_RELEASED); + event_queue_assert_empty (client2->event_queue); + event_queue_assert_empty (client1->event_queue); + + /* Check that a client error is raised if a released device is used */ + g_assert_cmpint (wl_display_get_error (display->display), ==, 0); + wp_drm_lease_device_v1_release (drm_lease_device); + g_assert_cmpint (wl_display_roundtrip (display->display), ==, -1); + g_assert_cmpint (wl_display_get_error (display->display), !=, 0); + + drm_lease_client_free (client1); + drm_lease_client_free (client2); + + return EXIT_SUCCESS; +} + int main (int argc, char **argv) @@ -429,6 +500,8 @@ main (int argc, if (g_strcmp0 (test_case, "client-connection") == 0) return test_drm_lease_client_connection (display); + else if (g_strcmp0 (test_case, "release-device") == 0) + return test_drm_lease_release_device (display); return EXIT_FAILURE; }