summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPekka Paalanen <pekka.paalanen@collabora.com>2020-03-11 17:11:03 +0200
committerPekka Paalanen <pekka.paalanen@collabora.com>2020-03-11 17:11:03 +0200
commit9c267e5b5500b4c30311bb46341126afaa2c7992 (patch)
treea40009bb13a59b136a417e207b38e432cbcc1531
parent9f53edd461c578d365a2e7a9a35a51e6410de7dc (diff)
tests: move viewport creation into helpers
There will be a new test program using viewports and would like to share this bit of code. There are two behavioral changes: - Compositor wp_viewporter interface version is no longer checked. - client_create_viewport() does not leak the viewporter object. test_viewporter_double_create needs to call bind_to_singleton_global() itself so that the viewporter object still exists when the error event arrives. Otherwise error verification fails. Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
-rw-r--r--tests/meson.build14
-rw-r--r--tests/viewporter-test.c66
-rw-r--r--tests/weston-test-client-helper.c60
-rw-r--r--tests/weston-test-client-helper.h9
4 files changed, 87 insertions, 62 deletions
diff --git a/tests/meson.build b/tests/meson.build
index 463d7129..714903f2 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -30,6 +30,8 @@ lib_test_client = static_library(
'weston-test-fixture-compositor.c',
weston_test_client_protocol_h,
weston_test_protocol_c,
+ viewporter_client_protocol_h,
+ viewporter_protocol_c,
],
include_directories: common_inc,
dependencies: [
@@ -43,6 +45,9 @@ lib_test_client = static_library(
)
dep_test_client = declare_dependency(
link_with: lib_test_client,
+ sources: [
+ viewporter_client_protocol_h,
+ ],
dependencies: [
dep_wayland_client,
dep_test_runner,
@@ -179,14 +184,7 @@ tests = [
'name': 'vertex-clip',
'dep_objs': dep_vertex_clipping,
},
- {
- 'name': 'viewporter',
- 'sources': [
- 'viewporter-test.c',
- viewporter_client_protocol_h,
- viewporter_protocol_c,
- ],
- },
+ { 'name': 'viewporter', },
]
tests_standalone = [
diff --git a/tests/viewporter-test.c b/tests/viewporter-test.c
index ad4f3779..68e93647 100644
--- a/tests/viewporter-test.c
+++ b/tests/viewporter-test.c
@@ -34,7 +34,6 @@
#include "shared/helpers.h"
#include "shared/xalloc.h"
#include "weston-test-client-helper.h"
-#include "viewporter-client-protocol.h"
#include "weston-test-fixture-compositor.h"
static enum test_result_code
@@ -48,48 +47,6 @@ fixture_setup(struct weston_test_harness *harness)
}
DECLARE_FIXTURE_SETUP(fixture_setup);
-static struct wp_viewporter *
-get_viewporter(struct client *client)
-{
- struct global *g;
- struct global *global_wpr = NULL;
- struct wp_viewporter *wpr;
-
- wl_list_for_each(g, &client->global_list, link) {
- if (strcmp(g->interface, wp_viewporter_interface.name))
- continue;
-
- if (global_wpr)
- assert(0 && "multiple wp_viewporter objects");
-
- global_wpr = g;
- }
-
- assert(global_wpr && "no wp_viewporter found");
-
- assert(global_wpr->version == 1);
-
- wpr = wl_registry_bind(client->wl_registry, global_wpr->name,
- &wp_viewporter_interface, 1);
- assert(wpr);
-
- return wpr;
-}
-
-static struct wp_viewport *
-create_viewport(struct client *client)
-{
- struct wp_viewporter *viewporter;
- struct wp_viewport *viewport;
-
- viewporter = get_viewporter(client);
- viewport = wp_viewporter_get_viewport(viewporter,
- client->surface->wl_surface);
- assert(viewport);
-
- return viewport;
-}
-
static void
set_source(struct wp_viewport *vp, int x, int y, int w, int h)
{
@@ -104,7 +61,8 @@ TEST(test_viewporter_double_create)
client = create_client_and_test_surface(100, 50, 123, 77);
- viewporter = get_viewporter(client);
+ viewporter = bind_to_singleton_global(client,
+ &wp_viewporter_interface, 1);
wp_viewporter_get_viewport(viewporter, client->surface->wl_surface);
wp_viewporter_get_viewport(viewporter, client->surface->wl_surface);
@@ -135,7 +93,7 @@ TEST_P(test_viewporter_bad_source_rect, bad_source_rect_args)
client = create_client_and_test_surface(100, 50, 123, 77);
- vp = create_viewport(client);
+ vp = client_create_viewport(client);
testlog("wp_viewport.set_source x=%d, y=%d, w=%d, h=%d\n",
args->x, args->y, args->w, args->h);
@@ -152,7 +110,7 @@ TEST(test_viewporter_unset_source_rect)
client = create_client_and_test_surface(100, 50, 123, 77);
- vp = create_viewport(client);
+ vp = client_create_viewport(client);
set_source(vp, -1, -1, -1, -1);
wl_surface_commit(client->surface->wl_surface);
@@ -180,7 +138,7 @@ TEST_P(test_viewporter_bad_destination_size, bad_destination_args)
client = create_client_and_test_surface(100, 50, 123, 77);
- vp = create_viewport(client);
+ vp = client_create_viewport(client);
testlog("wp_viewport.set_destination w=%d, h=%d\n", args->w, args->h);
wp_viewport_set_destination(vp, args->w, args->h);
@@ -196,7 +154,7 @@ TEST(test_viewporter_unset_destination_size)
client = create_client_and_test_surface(100, 50, 123, 77);
- vp = create_viewport(client);
+ vp = client_create_viewport(client);
wp_viewport_set_destination(vp, -1, -1);
wl_surface_commit(client->surface->wl_surface);
@@ -225,7 +183,7 @@ TEST_P(test_viewporter_non_integer_destination_size, nonint_destination_args)
client = create_client_and_test_surface(100, 50, 123, 77);
- vp = create_viewport(client);
+ vp = client_create_viewport(client);
testlog("non-integer size w=%f, h=%f\n",
wl_fixed_to_double(args->w), wl_fixed_to_double(args->h));
@@ -294,7 +252,7 @@ setup_source_vs_buffer(struct client *client,
struct wp_viewport *vp;
surf = client->surface->wl_surface;
- vp = create_viewport(client);
+ vp = client_create_viewport(client);
testlog("surface %dx%d\n",
get_surface_width(client->surface,
@@ -487,7 +445,7 @@ TEST(test_viewporter_outside_null_buffer)
surf = client->surface->wl_surface;
/* If buffer is NULL, does not matter what the source rect is. */
- vp = create_viewport(client);
+ vp = client_create_viewport(client);
wl_surface_attach(surf, NULL, 0, 0);
set_source(vp, 1000, 1000, 20, 10);
wp_viewport_set_destination(vp, 99, 99);
@@ -516,7 +474,7 @@ TEST(test_viewporter_no_surface_set_source)
struct wp_viewport *vp;
client = create_client_and_test_surface(100, 50, 123, 77);
- vp = create_viewport(client);
+ vp = client_create_viewport(client);
wl_surface_destroy(client->surface->wl_surface);
client->surface->wl_surface = NULL;
@@ -533,7 +491,7 @@ TEST(test_viewporter_no_surface_set_destination)
struct wp_viewport *vp;
client = create_client_and_test_surface(100, 50, 123, 77);
- vp = create_viewport(client);
+ vp = client_create_viewport(client);
wl_surface_destroy(client->surface->wl_surface);
client->surface->wl_surface = NULL;
@@ -550,7 +508,7 @@ TEST(test_viewporter_no_surface_destroy)
struct wp_viewport *vp;
client = create_client_and_test_surface(100, 50, 123, 77);
- vp = create_viewport(client);
+ vp = client_create_viewport(client);
wl_surface_destroy(client->surface->wl_surface);
client->surface->wl_surface = NULL;
diff --git a/tests/weston-test-client-helper.c b/tests/weston-test-client-helper.c
index f5f24025..8711cf0e 100644
--- a/tests/weston-test-client-helper.c
+++ b/tests/weston-test-client-helper.c
@@ -1788,3 +1788,63 @@ client_buffer_from_image_file(struct client *client,
return buf;
}
+
+/**
+ * Bind to a singleton global in wl_registry
+ *
+ * \param client Client whose registry and globals to use.
+ * \param iface The Wayland interface to look for.
+ * \param version The version to bind the interface with.
+ * \return A struct wl_proxy, which you need to cast to the proper type.
+ *
+ * Asserts that the global being searched for is a singleton and is found.
+ *
+ * Binds with the exact version given, does not take compositor interface
+ * version into account.
+ */
+void *
+bind_to_singleton_global(struct client *client,
+ const struct wl_interface *iface,
+ int version)
+{
+ struct global *tmp;
+ struct global *g = NULL;
+ struct wl_proxy *proxy;
+
+ wl_list_for_each(tmp, &client->global_list, link) {
+ if (strcmp(tmp->interface, iface->name))
+ continue;
+
+ assert(!g && "multiple singleton objects");
+ g = tmp;
+ }
+
+ assert(g && "singleton not found");
+
+ proxy = wl_registry_bind(client->wl_registry, g->name, iface, version);
+ assert(proxy);
+
+ return proxy;
+}
+
+/**
+ * Create a wp_viewport for the client surface
+ *
+ * \param client The client->surface to use.
+ * \return A fresh viewport object.
+ */
+struct wp_viewport *
+client_create_viewport(struct client *client)
+{
+ struct wp_viewporter *viewporter;
+ struct wp_viewport *viewport;
+
+ viewporter = bind_to_singleton_global(client,
+ &wp_viewporter_interface, 1);
+ viewport = wp_viewporter_get_viewport(viewporter,
+ client->surface->wl_surface);
+ assert(viewport);
+ wp_viewporter_destroy(viewporter);
+
+ return viewport;
+}
diff --git a/tests/weston-test-client-helper.h b/tests/weston-test-client-helper.h
index a8253137..417c62e4 100644
--- a/tests/weston-test-client-helper.h
+++ b/tests/weston-test-client-helper.h
@@ -37,6 +37,7 @@
#include <wayland-client-protocol.h>
#include "weston-test-runner.h"
#include "weston-test-client-protocol.h"
+#include "viewporter-client-protocol.h"
struct client {
struct wl_display *wl_display;
@@ -269,4 +270,12 @@ client_buffer_from_image_file(struct client *client,
const char *basename,
int scale);
+void *
+bind_to_singleton_global(struct client *client,
+ const struct wl_interface *iface,
+ int version);
+
+struct wp_viewport *
+client_create_viewport(struct client *client);
+
#endif