tests/internal-screenshot: Fix test so it doesn't expect shell surfaces
authorDerek Foreman <derekf@osg.samsung.com>
Mon, 25 May 2015 20:19:38 +0000 (15:19 -0500)
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>
Tue, 26 May 2015 08:26:06 +0000 (11:26 +0300)
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>
tests/internal-screenshot-test.c
tests/reference/internal-screenshot-00.png [deleted file]
tests/reference/internal-screenshot-bad-00.png [new file with mode: 0644]
tests/reference/internal-screenshot-good-00.png [new file with mode: 0644]

index 43aabf6a9822085f1d0a80c912d3d92bf07160b2..991761f560401659d744dd07b6fb2379286fa898 100644 (file)
@@ -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;
+               }
+}
+
 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 (file)
index 5dc7957..0000000
Binary files a/tests/reference/internal-screenshot-00.png and /dev/null differ
diff --git a/tests/reference/internal-screenshot-bad-00.png b/tests/reference/internal-screenshot-bad-00.png
new file mode 100644 (file)
index 0000000..5dc7957
Binary files /dev/null and b/tests/reference/internal-screenshot-bad-00.png differ
diff --git a/tests/reference/internal-screenshot-good-00.png b/tests/reference/internal-screenshot-good-00.png
new file mode 100644 (file)
index 0000000..7cf8045
Binary files /dev/null and b/tests/reference/internal-screenshot-good-00.png differ