tests/internal-screenshot: Fix test so it doesn't expect shell surfaces

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@osg.samsung.com>
Tested-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
dev
Derek Foreman 10 years ago committed by Pekka Paalanen
parent 1223fa4be4
commit 35b7f25ae3
  1. 63
      tests/internal-screenshot-test.c
  2. 0
      tests/reference/internal-screenshot-bad-00.png
  3. BIN
      tests/reference/internal-screenshot-good-00.png

@ -184,51 +184,86 @@ capture_screenshot_of_output(struct client *client) {
return screenshot; 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;
}
}
TEST(internal_screenshot) TEST(internal_screenshot)
{ {
struct wl_buffer *buf;
struct client *client; struct client *client;
struct wl_surface *surface;
struct surface *screenshot = NULL; struct surface *screenshot = NULL;
struct surface *reference = NULL; struct surface *reference_good = NULL;
struct surface *reference_bad = NULL;
struct rectangle clip; struct rectangle clip;
const char *fname; const char *fname;
bool match = false; bool match = false;
bool dump_all_images = true; bool dump_all_images = true;
void *pixels;
/* Create the client */ /* Create the client */
printf("Creating client for test\n"); printf("Creating client for test\n");
client = create_client_and_test_surface(100, 100, 100, 100); client = create_client_and_test_surface(100, 100, 100, 100);
assert(client); 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. */ /* Take a snapshot. Result will be in screenshot->wl_buffer. */
printf("Taking a screenshot\n"); printf("Taking a screenshot\n");
screenshot = capture_screenshot_of_output(client); screenshot = capture_screenshot_of_output(client);
assert(screenshot); assert(screenshot);
/* Load reference image */ /* Load good reference image */
fname = screenshot_reference_filename("internal-screenshot", 0); fname = screenshot_reference_filename("internal-screenshot-good", 0);
printf("Loading reference image %s\n", fname); printf("Loading good reference image %s\n", fname);
reference = load_surface_from_png(fname); reference_good = load_surface_from_png(fname);
assert(reference); 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() /* 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"); printf("Screenshot %s reference image\n", match? "equal to" : "different from");
assert(!match); assert(!match);
free(reference_bad->data);
free(reference_bad);
/* Test check_surfaces_match_in_clip() /* Test check_surfaces_match_in_clip()
* Alpha-blending and other effects can cause irrelevant discrepancies, so look only * Alpha-blending and other effects can cause irrelevant discrepancies, so look only
* at a small portion of the solid-colored background * at a small portion of the solid-colored background
*/ */
clip.x = 50; clip.x = 100;
clip.y = 50; clip.y = 100;
clip.width = 101; clip.width = 100;
clip.height = 101; clip.height = 100;
printf("Clip: %d,%d %d x %d\n", clip.x, clip.y, clip.width, clip.height); 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"); 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 */ /* Test dumping of non-matching images */
if (!match || dump_all_images) { if (!match || dump_all_images) {

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 970 B

Loading…
Cancel
Save