This also serves as a proof of concept of the screen capture functionality and as a demo for snapshot-based rendering verification. Implements screenshot saving clientside in the test itself.
This also demonstrates use of test-specific configuration files, in this case to disable fadein animations and background images. Signed-off-by: Bryce Harrington <[email protected]> --- Makefile.am | 20 +++- tests/internal-screenshot-test.c | 144 +++++++++++++++++++++++++++++ tests/internal-screenshot.ini | 3 + tests/reference/internal-screenshot-00.png | Bin 0 -> 5149 bytes 4 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 tests/internal-screenshot-test.c create mode 100644 tests/internal-screenshot.ini create mode 100644 tests/reference/internal-screenshot-00.png diff --git a/Makefile.am b/Makefile.am index 543c736..e860e0e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -941,7 +941,10 @@ libshared_cairo_la_SOURCES = \ # tests subdirectory # -TESTS = $(shared_tests) $(module_tests) $(weston_tests) $(ivi_tests) +TESTS = $(internal_tests) $(shared_tests) $(module_tests) $(weston_tests) $(ivi_tests) + +internal_tests = \ + internal-screenshot.weston shared_tests = \ config-parser.test \ @@ -988,6 +991,7 @@ noinst_LTLIBRARIES += \ noinst_PROGRAMS += \ $(setbacklight) \ + $(internal_tests) \ $(shared_tests) \ $(weston_tests) \ $(ivi_tests) \ @@ -1040,6 +1044,20 @@ nodist_libtest_client_la_SOURCES = \ libtest_client_la_CFLAGS = $(AM_CFLAGS) $(TEST_CLIENT_CFLAGS) libtest_client_la_LIBADD = $(TEST_CLIENT_LIBS) libshared.la libtest-runner.la + +# +# Internal tests - tests functionality of the testsuite itself +# + +internal_screenshot_weston_SOURCES = tests/internal-screenshot-test.c +internal_screenshot_weston_CFLAGS = $(AM_CFLAGS) $(TEST_CLIENT_CFLAGS) $(CAIRO_CFLAGS) +internal_screenshot_weston_LDADD = libtest-client.la $(CAIRO_LIBS) + + +# +# Weston Tests +# + bad_buffer_weston_SOURCES = tests/bad-buffer-test.c bad_buffer_weston_CFLAGS = $(AM_CFLAGS) $(TEST_CLIENT_CFLAGS) bad_buffer_weston_LDADD = libtest-client.la diff --git a/tests/internal-screenshot-test.c b/tests/internal-screenshot-test.c new file mode 100644 index 0000000..2d6f8e7 --- /dev/null +++ b/tests/internal-screenshot-test.c @@ -0,0 +1,144 @@ +/* + * Copyright © 2015 Samsung Electronics Co., Ltd + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of the copyright holders not be used in + * advertising or publicity pertaining to distribution of the software + * without specific, written prior permission. The copyright holders make + * no representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "config.h" + +#include <unistd.h> +#include <stdio.h> +#include <string.h> /* memcpy */ +#include <cairo.h> + +#include "weston-test-client-helper.h" + +char *server_parameters="--use-pixman --width=320 --height=240"; + +TEST(internal_screenshot) +{ + struct client *client; + struct surface *screenshot = NULL; + struct surface *reference = NULL; + struct rectangle clip; + const char *fname; + cairo_surface_t *reference_cairo_surface; + cairo_status_t status; + bool match = false; + bool dump_all_images = true; + + printf("Starting test\n"); + + /* Create the client */ + client = create_client_and_test_surface(100, 100, 100, 100); + assert(client); + printf("Client created\n"); + + /* Create a surface to hold the screenshot */ + screenshot = xzalloc(sizeof *screenshot); + assert(screenshot); + + /* Create and attach buffer to our surface */ + screenshot->wl_buffer = create_shm_buffer(client, + client->output->width, + client->output->height, + &screenshot->data); + screenshot->height = client->output->height; + screenshot->width = client->output->width; + assert(screenshot->wl_buffer); + screenshot->stride = screenshot->width * 4; /* meh */ + printf("Screenshot buffer created and attached to surface\n"); + + /* Take a snapshot. Result will be in screenshot->wl_buffer. */ + client->test->buffer_copy_done = 0; + weston_test_capture_screenshot(client->test->weston_test, + client->output->wl_output, + screenshot->wl_buffer); + printf("Capture request sent\n"); + while (client->test->buffer_copy_done == 0) + if (wl_display_dispatch(client->wl_display) < 0) + break; + printf("Roundtrip done\n"); + + /* FIXME: Document somewhere the orientation the screenshot is taken + * and how the clip coords are interpreted, in case of scaling/transform. + * If we're using read_pixels() just make sure it is documented somewhere. + * Protocol docs in the XML, comparison function docs in Doxygen style. + */ + + /* Load reference image */ + fname = screenshot_reference_filename("internal-screenshot", 0); + printf("Loading reference image %s\n", fname); + reference_cairo_surface = cairo_image_surface_create_from_png(fname); + status = cairo_surface_status(reference_cairo_surface); + if (status != CAIRO_STATUS_SUCCESS) { + printf("Could not open %s: %s\n", fname, cairo_status_to_string(status)); + cairo_surface_destroy(reference_cairo_surface); + assert(status != CAIRO_STATUS_SUCCESS); + } + + /* Disguise the cairo surface in a weston test surface */ + reference = xzalloc(sizeof *reference); + reference->width = cairo_image_surface_get_width(reference_cairo_surface); + reference->height = cairo_image_surface_get_height(reference_cairo_surface); + reference->data = cairo_image_surface_get_data(reference_cairo_surface); + reference->stride = cairo_image_surface_get_stride(reference_cairo_surface); + + /* Test check_surfaces_equal() + * We expect this to fail since the clock will differ from when we made the reference image + */ + match = check_surfaces_equal(screenshot, reference); + printf("Screenshot %s reference image\n", match? "equal to" : "different from"); + assert(!match); + + /* 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; + 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); + printf("Screenshot %s reference image in clipped area\n", match? "matches" : "doesn't match"); + cairo_surface_destroy(reference_cairo_surface); + free(reference); + + /* Test dumping of non-matching images */ + if (!match || dump_all_images) { + /* Write image to .png file */ + cairo_surface_t *surface; + + surface = cairo_image_surface_create_for_data(screenshot->data, + CAIRO_FORMAT_ARGB32, + screenshot->width, + screenshot->height, + screenshot->stride); + + printf("Writing PNG to disk\n"); + cairo_surface_write_to_png(surface, "clientside-screenshot.png"); + cairo_surface_destroy(surface); + } + + free(screenshot); + + printf("Test complete\n"); + assert(match); +} diff --git a/tests/internal-screenshot.ini b/tests/internal-screenshot.ini new file mode 100644 index 0000000..abc046e --- /dev/null +++ b/tests/internal-screenshot.ini @@ -0,0 +1,3 @@ +[shell] +startup-animation=none +background-color=0xCC336699 diff --git a/tests/reference/internal-screenshot-00.png b/tests/reference/internal-screenshot-00.png new file mode 100644 index 0000000000000000000000000000000000000000..5dc79576345241122f9aba308c93e5e9c7797fbd GIT binary patch literal 5149 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 M1JK>P+xD;i4Xvz{eE<Le literal 0 HcmV?d00001 -- 1.9.1 _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
