[PATCH weston 3/3] tests: fix the cursor race in internal-screenshot
Derek Foreman
derekf at osg.samsung.com
Thu Jun 16 15:59:21 UTC 2016
On 16/06/16 05:36 AM, Pekka Paalanen wrote:
> From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
>
> This fix also depends on "compositor-headless: do not create a seat".
>
> If we lose the race against weston-desktop-shell setting cursors, which
> is very rare, we get a cursor image in the screenshot, causing the test
> to fail. This is now fixed by moving the (remaining) cursor out of the
> way.
>
> Arguably we should have better solutions for this, but that is another
> story. This is a stop-gap measure we can copy also in new
> screenshooting tests.
>
> Code and explanation on how to lose the race for sure are included.
>
> Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
> ---
> tests/internal-screenshot-test.c | 27 +++++++++++++++++++++++++++
> 1 file changed, 27 insertions(+)
>
> diff --git a/tests/internal-screenshot-test.c b/tests/internal-screenshot-test.c
> index 563aa3d..e022d20 100644
> --- a/tests/internal-screenshot-test.c
> +++ b/tests/internal-screenshot-test.c
> @@ -26,6 +26,7 @@
> #include "config.h"
>
> #include <stdio.h>
> +#include <time.h>
>
> #include "weston-test-client-helper.h"
>
> @@ -48,6 +49,27 @@ draw_stuff(void *pixels, int w, int h)
> }
> }
>
> +/*
> + * We are racing our screenshooting against weston-desktop-shell setting the
> + * cursor. If w-d-s wins, our screenshot will have a cursor shown, which makes
> + * the image comparison fail. Our window and the default pointer position are
> + * accidentally causing an overlap that intersects our test clip rectangle.
> + *
> + * This delay, if enabled, ensures this test loses that race.
> + *
> + * To actually see the failure, comment out the workaround call to
> + * weston_test_move_pointer() below.
> + */
> +static void
> +lose_the_race(void)
> +{
> +#if 0
> + struct timespec delay = { .tv_sec = 0, .tv_nsec = 100 * 1000 * 1000 };
> +
> + nanosleep(&delay, NULL);
BAAAaaaarrf. :)
I don't get the play here, this is still if 0 so does nothing, so the
race is still present.
So we're going to propagate this "fix" to other new tests, and "just"
set all these #if 0 to #if 1 before running make distcheck, or what?
I'm not really sure this is all that good even as a stop-gap measure...
Derek
> +#endif
> +}
> +
> TEST(internal_screenshot)
> {
> struct wl_buffer *buf;
> @@ -62,12 +84,17 @@ TEST(internal_screenshot)
> bool dump_all_images = true;
> void *pixels;
>
> + lose_the_race();
> +
> /* Create the client */
> printf("Creating client for test\n");
> client = create_client_and_test_surface(100, 100, 100, 100);
> assert(client);
> surface = client->surface->wl_surface;
>
> + /* Move the pointer away from the screenshot area. */
> + weston_test_move_pointer(client->test->weston_test, 0, 0);
> +
> buf = create_shm_buffer(client, 100, 100, &pixels);
> draw_stuff(pixels, 100, 100);
> wl_surface_attach(surface, buf, 0, 0);
>
More information about the wayland-devel
mailing list