[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