[PATCH weston 2/2] internal-screenshot-test: Fix test so it doesn't expect shell surfaces

Derek Foreman derekf at osg.samsung.com
Tue May 26 10:10:07 PDT 2015


On 26/05/15 03:30 AM, Pekka Paalanen wrote:
> On Mon, 25 May 2015 15:19:38 -0500
> Derek Foreman <derekf at osg.samsung.com> wrote:
> 
>> We no longer have a race with shell startup because we create our own
>> colored surface and check that it's properly drawn.
>>
>> Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
>> ---
>>  tests/internal-screenshot-test.c                |  63 ++++++++++++++++++------
>>  tests/reference/internal-screenshot-00.png      | Bin 5149 -> 0 bytes
>>  tests/reference/internal-screenshot-bad-00.png  | Bin 0 -> 5149 bytes
>>  tests/reference/internal-screenshot-good-00.png | Bin 0 -> 970 bytes
>>  4 files changed, 49 insertions(+), 14 deletions(-)
>>  delete mode 100644 tests/reference/internal-screenshot-00.png
>>  create mode 100644 tests/reference/internal-screenshot-bad-00.png
>>  create mode 100644 tests/reference/internal-screenshot-good-00.png
>>
>> diff --git a/tests/internal-screenshot-test.c b/tests/internal-screenshot-test.c
>> index 43aabf6..991761f 100644
>> --- a/tests/internal-screenshot-test.c
>> +++ b/tests/internal-screenshot-test.c
>> @@ -184,51 +184,86 @@ capture_screenshot_of_output(struct client *client) {
>>  	return screenshot;
>>  }
>>  
>> +static void
>> +draw_stuff(char *pixels, int w, int h)
>> +{
>> +	int x, y;
>> +
>> +	for (x = 0; x < w; x++)
>> +		for (y = 0; y < h; y++) {
>> +			pixels[y * w * 4 + x * 4] = x;
>> +			pixels[y * w * 4 + x * 4 + 1] = x + y;
>> +			pixels[y * w * 4 + x * 4 + 2] = y;
>> +			pixels[y * w * 4 + x * 4 + 3] = 255;
> 
> FYI, this is endian-dependent code. Assuming pixel format
> WL_SHM_FORMAT_ARGB8888 (PIXMAN_a8r8g8b8, CAIRO_FORMAT_ARGB32), pixels
> should be handled as uint32_t type covering a whole pixel, and channels
> set as:
> 
> 	uint8_t a, r, g, b;
> 	int stride; /* bytes */
> 	uint32_t *pixel = (uint32_t *)data + y * stride / 4 + x;
> 
> 	*pixel = (a << 24) | (r << 16) | (g << 8) | b;
> 
> See
> http://cairographics.org/manual/cairo-Image-Surfaces.html#cairo-format-t

Sigh, a personal anti-pattern.  I know better.  I just sent a new patch
for that.

I left stride out since create_shm_buffer makes us an ARGB8888 buffer
with stride == width every time.

>> +		}
>> +}
>> +
>>  TEST(internal_screenshot)
>>  {
>> +	struct wl_buffer *buf;
>>  	struct client *client;
>> +	struct wl_surface *surface;
>>  	struct surface *screenshot = NULL;
>> -	struct surface *reference = NULL;
>> +	struct surface *reference_good = NULL;
>> +	struct surface *reference_bad = NULL;
>>  	struct rectangle clip;
>>  	const char *fname;
>>  	bool match = false;
>>  	bool dump_all_images = true;
>> +	void *pixels;
>>  
>>  	/* 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;
>> +
>> +	buf = create_shm_buffer(client, 100, 100, &pixels);
>> +	draw_stuff(pixels, 100, 100);
>> +	wl_surface_attach(surface, buf, 0, 0);
>> +	wl_surface_damage(surface, 0, 0, 100, 100);
>> +	wl_surface_commit(surface);
>>  
>>  	/* Take a snapshot.  Result will be in screenshot->wl_buffer. */
>>  	printf("Taking a screenshot\n");
>>  	screenshot = capture_screenshot_of_output(client);
>>  	assert(screenshot);
>>  
>> -	/* Load reference image */
>> -	fname = screenshot_reference_filename("internal-screenshot", 0);
>> -	printf("Loading reference image %s\n", fname);
>> -	reference = load_surface_from_png(fname);
>> -	assert(reference);
>> +	/* Load good reference image */
>> +	fname = screenshot_reference_filename("internal-screenshot-good", 0);
>> +	printf("Loading good reference image %s\n", fname);
>> +	reference_good = load_surface_from_png(fname);
>> +	assert(reference_good);
>> +
>> +	/* Load bad reference image */
>> +	fname = screenshot_reference_filename("internal-screenshot-bad", 0);
>> +	printf("Loading bad reference image %s\n", fname);
>> +	reference_bad = load_surface_from_png(fname);
>> +	assert(reference_bad);
>>  
>>  	/* Test check_surfaces_equal()
>> -	 * We expect this to fail since the clock will differ from when we made the reference image
>> +	 * We expect this to fail since we use a bad reference image
>>  	 */
>> -	match = check_surfaces_equal(screenshot, reference);
>> +	match = check_surfaces_equal(screenshot, reference_bad);
>>  	printf("Screenshot %s reference image\n", match? "equal to" : "different from");
>>  	assert(!match);
>> +	free(reference_bad->data);
>> +	free(reference_bad);
>>  
>>  	/* Test check_surfaces_match_in_clip()
>>  	 * Alpha-blending and other effects can cause irrelevant discrepancies, so look only
>>  	 * at a small portion of the solid-colored background
>>  	 */
>> -	clip.x = 50;
>> -	clip.y = 50;
>> -	clip.width = 101;
>> -	clip.height = 101;
>> +	clip.x = 100;
>> +	clip.y = 100;
>> +	clip.width = 100;
>> +	clip.height = 100;
>>  	printf("Clip: %d,%d %d x %d\n", clip.x, clip.y, clip.width, clip.height);
>> -	match = check_surfaces_match_in_clip(screenshot, reference, &clip);
>> +	match = check_surfaces_match_in_clip(screenshot, reference_good,
>> +					     &clip);
>>  	printf("Screenshot %s reference image in clipped area\n", match? "matches" : "doesn't match");
>> -	free(reference);
>> +	free(reference_good->data);
>> +	free(reference_good);
>>  
>>  	/* Test dumping of non-matching images */
>>  	if (!match || dump_all_images) {
>> diff --git a/tests/reference/internal-screenshot-00.png b/tests/reference/internal-screenshot-00.png
>> deleted file mode 100644
>> index 5dc79576345241122f9aba308c93e5e9c7797fbd..0000000000000000000000000000000000000000
>> GIT binary patch
> 
>>
>> diff --git a/tests/reference/internal-screenshot-bad-00.png b/tests/reference/internal-screenshot-bad-00.png
>> new file mode 100644
>> index 0000000000000000000000000000000000000000..5dc79576345241122f9aba308c93e5e9c7797fbd
>> GIT binary patch
> 
>> diff --git a/tests/reference/internal-screenshot-good-00.png b/tests/reference/internal-screenshot-good-00.png
>> new file mode 100644
>> index 0000000000000000000000000000000000000000..7cf8045f4d205ee6dcf4b1e0f71a21a87bbbdb60
>> GIT binary patch
> 
> Since we are procedurally generating these particular reference images,
> I would not save them as PNGs in git to avoid growing the size.
> However, it is valuable to see not only the failed image but also the
> expected reference image, so when the failed screencapture is saved as
> a PNG, the reference image should be too.
> 
> OTOH, saving even generated reference images as PNG in git has the
> benefit that it will expose also (unintentional) changes in the
> generator. But, that could be protected against by using a CRC (see
> e.g. Pixman).
> 
> What do you think about not saving trivially generated reference images
> in git as PNG files?

I'd like to minimize the number of binary files in git, and generating
trivial images at build time seems like a good way to do that.  Since
these files are ending up in the distributed tarballs, those could get
annoyingly large.

I think that requires a little more work than we'd like to get into
before 1.8 is out the door.

Added Jon to the CC list, since this is test related.

I think we'd need a way to compare a reference image to part of a
screenshot (sizes don't match but clip sizes do?)  This is similar if
not exactly what you suggested previously about fixing the screenshot
test, but I took a shortcut to save time

Not sure exactly how all the build infrastructure for generated
reference images needs to be implemented.

> 
> All my comments here are just for future work, and the patch is good for
> now.
> 
> This one patch pushed:
>    1223fa4..35b7f25  master -> master
> 
> This one is not enough alone to completely fix the screenshot test
> race, one more patch is needed.

That's the one you just wrote and landed?


More information about the wayland-devel mailing list