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>
This commit is contained in:
+6
-8
@@ -30,6 +30,8 @@ lib_test_client = static_library(
|
|||||||
'weston-test-fixture-compositor.c',
|
'weston-test-fixture-compositor.c',
|
||||||
weston_test_client_protocol_h,
|
weston_test_client_protocol_h,
|
||||||
weston_test_protocol_c,
|
weston_test_protocol_c,
|
||||||
|
viewporter_client_protocol_h,
|
||||||
|
viewporter_protocol_c,
|
||||||
],
|
],
|
||||||
include_directories: common_inc,
|
include_directories: common_inc,
|
||||||
dependencies: [
|
dependencies: [
|
||||||
@@ -43,6 +45,9 @@ lib_test_client = static_library(
|
|||||||
)
|
)
|
||||||
dep_test_client = declare_dependency(
|
dep_test_client = declare_dependency(
|
||||||
link_with: lib_test_client,
|
link_with: lib_test_client,
|
||||||
|
sources: [
|
||||||
|
viewporter_client_protocol_h,
|
||||||
|
],
|
||||||
dependencies: [
|
dependencies: [
|
||||||
dep_wayland_client,
|
dep_wayland_client,
|
||||||
dep_test_runner,
|
dep_test_runner,
|
||||||
@@ -179,14 +184,7 @@ tests = [
|
|||||||
'name': 'vertex-clip',
|
'name': 'vertex-clip',
|
||||||
'dep_objs': dep_vertex_clipping,
|
'dep_objs': dep_vertex_clipping,
|
||||||
},
|
},
|
||||||
{
|
{ 'name': 'viewporter', },
|
||||||
'name': 'viewporter',
|
|
||||||
'sources': [
|
|
||||||
'viewporter-test.c',
|
|
||||||
viewporter_client_protocol_h,
|
|
||||||
viewporter_protocol_c,
|
|
||||||
],
|
|
||||||
},
|
|
||||||
]
|
]
|
||||||
|
|
||||||
tests_standalone = [
|
tests_standalone = [
|
||||||
|
|||||||
+12
-54
@@ -34,7 +34,6 @@
|
|||||||
#include "shared/helpers.h"
|
#include "shared/helpers.h"
|
||||||
#include "shared/xalloc.h"
|
#include "shared/xalloc.h"
|
||||||
#include "weston-test-client-helper.h"
|
#include "weston-test-client-helper.h"
|
||||||
#include "viewporter-client-protocol.h"
|
|
||||||
#include "weston-test-fixture-compositor.h"
|
#include "weston-test-fixture-compositor.h"
|
||||||
|
|
||||||
static enum test_result_code
|
static enum test_result_code
|
||||||
@@ -48,48 +47,6 @@ fixture_setup(struct weston_test_harness *harness)
|
|||||||
}
|
}
|
||||||
DECLARE_FIXTURE_SETUP(fixture_setup);
|
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
|
static void
|
||||||
set_source(struct wp_viewport *vp, int x, int y, int w, int h)
|
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);
|
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);
|
||||||
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);
|
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",
|
testlog("wp_viewport.set_source x=%d, y=%d, w=%d, h=%d\n",
|
||||||
args->x, args->y, args->w, args->h);
|
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);
|
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);
|
set_source(vp, -1, -1, -1, -1);
|
||||||
wl_surface_commit(client->surface->wl_surface);
|
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);
|
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);
|
testlog("wp_viewport.set_destination w=%d, h=%d\n", args->w, args->h);
|
||||||
wp_viewport_set_destination(vp, 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);
|
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);
|
wp_viewport_set_destination(vp, -1, -1);
|
||||||
wl_surface_commit(client->surface->wl_surface);
|
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);
|
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",
|
testlog("non-integer size w=%f, h=%f\n",
|
||||||
wl_fixed_to_double(args->w), wl_fixed_to_double(args->h));
|
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;
|
struct wp_viewport *vp;
|
||||||
|
|
||||||
surf = client->surface->wl_surface;
|
surf = client->surface->wl_surface;
|
||||||
vp = create_viewport(client);
|
vp = client_create_viewport(client);
|
||||||
|
|
||||||
testlog("surface %dx%d\n",
|
testlog("surface %dx%d\n",
|
||||||
get_surface_width(client->surface,
|
get_surface_width(client->surface,
|
||||||
@@ -487,7 +445,7 @@ TEST(test_viewporter_outside_null_buffer)
|
|||||||
surf = client->surface->wl_surface;
|
surf = client->surface->wl_surface;
|
||||||
|
|
||||||
/* If buffer is NULL, does not matter what the source rect is. */
|
/* 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);
|
wl_surface_attach(surf, NULL, 0, 0);
|
||||||
set_source(vp, 1000, 1000, 20, 10);
|
set_source(vp, 1000, 1000, 20, 10);
|
||||||
wp_viewport_set_destination(vp, 99, 99);
|
wp_viewport_set_destination(vp, 99, 99);
|
||||||
@@ -516,7 +474,7 @@ TEST(test_viewporter_no_surface_set_source)
|
|||||||
struct wp_viewport *vp;
|
struct wp_viewport *vp;
|
||||||
|
|
||||||
client = create_client_and_test_surface(100, 50, 123, 77);
|
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);
|
wl_surface_destroy(client->surface->wl_surface);
|
||||||
client->surface->wl_surface = NULL;
|
client->surface->wl_surface = NULL;
|
||||||
|
|
||||||
@@ -533,7 +491,7 @@ TEST(test_viewporter_no_surface_set_destination)
|
|||||||
struct wp_viewport *vp;
|
struct wp_viewport *vp;
|
||||||
|
|
||||||
client = create_client_and_test_surface(100, 50, 123, 77);
|
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);
|
wl_surface_destroy(client->surface->wl_surface);
|
||||||
client->surface->wl_surface = NULL;
|
client->surface->wl_surface = NULL;
|
||||||
|
|
||||||
@@ -550,7 +508,7 @@ TEST(test_viewporter_no_surface_destroy)
|
|||||||
struct wp_viewport *vp;
|
struct wp_viewport *vp;
|
||||||
|
|
||||||
client = create_client_and_test_surface(100, 50, 123, 77);
|
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);
|
wl_surface_destroy(client->surface->wl_surface);
|
||||||
client->surface->wl_surface = NULL;
|
client->surface->wl_surface = NULL;
|
||||||
|
|
||||||
|
|||||||
@@ -1788,3 +1788,63 @@ client_buffer_from_image_file(struct client *client,
|
|||||||
|
|
||||||
return buf;
|
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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
#include <wayland-client-protocol.h>
|
#include <wayland-client-protocol.h>
|
||||||
#include "weston-test-runner.h"
|
#include "weston-test-runner.h"
|
||||||
#include "weston-test-client-protocol.h"
|
#include "weston-test-client-protocol.h"
|
||||||
|
#include "viewporter-client-protocol.h"
|
||||||
|
|
||||||
struct client {
|
struct client {
|
||||||
struct wl_display *wl_display;
|
struct wl_display *wl_display;
|
||||||
@@ -269,4 +270,12 @@ client_buffer_from_image_file(struct client *client,
|
|||||||
const char *basename,
|
const char *basename,
|
||||||
int scale);
|
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
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user