From: =?utf-8?q?Jonas_=C3=85dahl?= <jadahl@gmail.com>
Date: Wed, 10 Sep 2025 00:11:58 +0200
Subject: tests/wayland: Add test case for client with invalid geometry

This makes sure we gracefully handle a client providing an invalid
window geometry.

Bug: https://gitlab.gnome.org/GNOME/mutter/-/issues/4310
Forwarded: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4648
---
 src/tests/meson.build                             |  1 +
 src/tests/wayland-test-clients/invalid-geometry.c | 55 +++++++++++++++++++++++
 src/tests/wayland-test-clients/meson.build        |  3 ++
 src/tests/wayland-unit-tests.c                    | 38 ++++++++++++++++
 4 files changed, 97 insertions(+)
 create mode 100644 src/tests/wayland-test-clients/invalid-geometry.c

diff --git a/src/tests/meson.build b/src/tests/meson.build
index 1b88a86..1e0c048 100644
--- a/src/tests/meson.build
+++ b/src/tests/meson.build
@@ -977,6 +977,7 @@ wayland_test_cases = [
       test_client_executables.get('invalid-size-limits-on-map-client'),
       test_client_executables.get('invalid-subsurfaces'),
       test_client_executables.get('invalid-xdg-shell-actions'),
+      test_client_executables.get('invalid-geometry'),
       test_client_executables.get('kms-cursor-hotplug-helper'),
       test_client_executables.get('service-client'),
       test_client_executables.get('shm-destroy-before-release'),
diff --git a/src/tests/wayland-test-clients/invalid-geometry.c b/src/tests/wayland-test-clients/invalid-geometry.c
new file mode 100644
index 0000000..b487730
--- /dev/null
+++ b/src/tests/wayland-test-clients/invalid-geometry.c
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2025 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "wayland-test-client-utils.h"
+
+static void
+on_configure (WaylandSurface *surface)
+{
+  xdg_surface_set_window_geometry (surface->xdg_surface,
+                                   0, 0,
+                                   surface->width, surface->height);
+  wl_surface_commit (surface->wl_surface);
+
+  wayland_surface_commit (surface);
+}
+
+int
+main (int    argc,
+      char **argv)
+{
+  g_autoptr (WaylandDisplay) display = NULL;
+  g_autoptr (WaylandSurface) surface = NULL;
+
+  display = wayland_display_new (WAYLAND_DISPLAY_CAPABILITY_TEST_DRIVER);
+  surface = wayland_surface_new (display, "invalid-geometry",
+                                 200, 200, 0xffffffff);
+
+  g_signal_connect (surface, "configure", G_CALLBACK (on_configure), NULL);
+  wl_surface_commit (surface->wl_surface);
+
+  /* Imitate a common Wayland protocol violation. */
+  xdg_surface_set_window_geometry (surface->xdg_surface, 0, 0, 200, 200);
+  wl_surface_commit (surface->wl_surface);
+
+  while (TRUE)
+    wayland_display_dispatch (display);
+
+  return EXIT_SUCCESS;
+}
diff --git a/src/tests/wayland-test-clients/meson.build b/src/tests/wayland-test-clients/meson.build
index 0afff53..6d4c356 100644
--- a/src/tests/wayland-test-clients/meson.build
+++ b/src/tests/wayland-test-clients/meson.build
@@ -145,6 +145,9 @@ wayland_test_clients = [
   {
     'name': 'invalid-size-limits-on-map-client',
   },
+  {
+    'name': 'invalid-geometry',
+  },
 ]
 
 test_client_executables = {}
diff --git a/src/tests/wayland-unit-tests.c b/src/tests/wayland-unit-tests.c
index 4ee1128..beb58bd 100644
--- a/src/tests/wayland-unit-tests.c
+++ b/src/tests/wayland-unit-tests.c
@@ -771,6 +771,42 @@ toplevel_invalid_limits (void)
   g_test_assert_expected_messages ();
 }
 
+static void
+toplevel_invalid_geometry_basic (void)
+{
+  GSettings *settings = g_settings_new ("org.gnome.mutter");
+  MetaWaylandTestClient *wayland_test_client;
+  MetaWindow *window;
+  MtkRectangle rect;
+
+  g_assert_true (g_settings_set_boolean (settings, "center-new-windows", TRUE));
+
+  wayland_test_client =
+    meta_wayland_test_client_new (test_context, "invalid-geometry");
+
+  g_test_expect_message ("libmutter", G_LOG_LEVEL_WARNING,
+                         "Client provided invalid window geometry for "
+                         "xdg_surface*");
+  g_test_expect_message ("libmutter", G_LOG_LEVEL_WARNING,
+                         "Client provided invalid window geometry for "
+                         "xdg_surface*");
+
+  while (!(window = find_client_window ("invalid-geometry")))
+    g_main_context_iteration (NULL, TRUE);
+  while (meta_window_is_hidden (window))
+    g_main_context_iteration (NULL, TRUE);
+
+  rect = meta_window_config_get_rect (window->config);
+  g_assert_cmpint (rect.width, ==, 200);
+  g_assert_cmpint (rect.height, ==, 200);
+
+  /* Window position is bogus in this case. */
+
+  meta_wayland_test_driver_terminate (test_driver);
+  meta_wayland_test_client_finish (wayland_test_client);
+  g_test_assert_expected_messages ();
+}
+
 static void
 toplevel_activation (void)
 {
@@ -1882,6 +1918,8 @@ init_tests (void)
                    toplevel_apply_limits);
   g_test_add_func ("/wayland/toplevel/invalid-limits",
                    toplevel_invalid_limits);
+  g_test_add_func ("/wayland/toplevel/invalid-geometry/basic",
+                   toplevel_invalid_geometry_basic);
   g_test_add_func ("/wayland/toplevel/activation",
                    toplevel_activation);
   g_test_add_func ("/wayland/toplevel/sessions/basic",
