[PATCH v1 weston 09/11] tests: Add support for comparing output against reference images
Pekka Paalanen
ppaalanen at gmail.com
Mon Nov 24 03:25:15 PST 2014
On Wed, 19 Nov 2014 15:06:24 -0800
Bryce Harrington <bryce at osg.samsung.com> wrote:
> Steal Cairo's files_equal() routine to do byte comparison of the rendered
> files. Note that since the clock time will change run to run we can
> only compare against the first frame (which will be black).
Not even the first frame is actually guaranteed to be black, I think.
It's just luck at this point.
> Signed-off-by: Bryce Harrington <bryce at osg.samsung.com>
> ---
> tests/fadein-test.c | 31 +++++++++++++++++++++++++++----
> tests/weston-test-client-helper.c | 33 +++++++++++++++++++++++++++++++++
> tests/weston-test-client-helper.h | 5 +++++
> 3 files changed, 65 insertions(+), 4 deletions(-)
>
> diff --git a/tests/fadein-test.c b/tests/fadein-test.c
> index a6c284f..965bb0a 100644
> --- a/tests/fadein-test.c
> +++ b/tests/fadein-test.c
> @@ -24,27 +24,40 @@
>
> #include <unistd.h>
> #include <stdio.h>
> +#include <stdbool.h>
>
> #include "weston-test-client-helper.h"
>
> char *server_parameters="--use-pixman --width=320 --height=240";
>
> static char*
> -output_filename(const char* basename) {
> +output_filename(const char* basename, int head) {
> static const char *path = "./";
> char *filename;
>
> - if (asprintf(&filename, "%s%s", path, basename) < 0)
> + if (asprintf(&filename, "%s%s-%d.png", path, basename, head) < 0)
> filename = NULL;
>
> return filename;
> }
>
> +static char*
> +reference_filename(const char* basename, int head) {
> + static const char *path = "./tests/reference/";
> + char *filename;
> +
> + if (asprintf(&filename, "%s%s-%d.png", path, basename, head) < 0)
> + filename = NULL;
> +
> + return filename;
> +}
> +
> TEST(fadein)
> {
> struct client *client;
> char basename[32];
> char *out_path;
> + char *ref_path;
> int i;
>
> client = client_create(100, 100, 100, 100);
> @@ -52,11 +65,21 @@ TEST(fadein)
>
> for (i = 0; i < 6; i++) {
> snprintf(basename, sizeof basename, "fadein-%02d", i);
> - out_path = output_filename(basename);
> + // FIXME: Iterate over all heads
> + out_path = output_filename(basename, 0);
> + ref_path = reference_filename(basename, 0);
>
> - wl_test_record_screenshot(client->test->wl_test, out_path);
> + // FIXME: Would be preferred to pass in out_path rather than basename here...
> + wl_test_record_screenshot(client->test->wl_test, basename);
> client_roundtrip(client);
> + if (i == 0) {
> + if (files_equal(out_path, ref_path))
> + printf("%s is correct\n", out_path);
> + else
> + printf("%s doesn't match reference %s\n", out_path, ref_path);
> + }
> free (out_path);
> + free (ref_path);
>
> usleep(250000);
> }
> diff --git a/tests/weston-test-client-helper.c b/tests/weston-test-client-helper.c
> index 79097fa..72834e4 100644
> --- a/tests/weston-test-client-helper.c
> +++ b/tests/weston-test-client-helper.c
> @@ -22,6 +22,7 @@
>
> #include <config.h>
>
> +#include <stdbool.h>
> #include <stdlib.h>
> #include <stdio.h>
> #include <string.h>
> @@ -624,3 +625,35 @@ client_create(int x, int y, int width, int height)
>
> return client;
> }
> +
> +bool
> +files_equal(const char *test_filename, const char* ref_filename)
> +{
> + FILE *test, *ref;
> + int t, p;
> +
> + if (test_filename == NULL || ref_filename == NULL)
> + return false;
> +
> + test = fopen (test_filename, "rb");
> + if (test == NULL)
> + return false;
> +
> + ref = fopen (ref_filename, "rb");
> + if (ref == NULL) {
> + fclose (test);
> + return false;
> + }
> +
> + do {
> + t = getc (test);
> + p = getc (ref);
> + if (t != p)
> + break;
> + } while (t != EOF && p != EOF);
> +
> + fclose (test);
> + fclose (ref);
> +
> + return t == p; /* both EOF */
> +}
Byte by byte comparison on the raw PNG data, I didn't expect that. :-)
Well, this needs a rewrite with wl_buffer screenshots, and there we
naturally get a chance to apply some fuzz for matching as needed.
Thanks,
pq
> diff --git a/tests/weston-test-client-helper.h b/tests/weston-test-client-helper.h
> index 684afc6..20e08b1 100644
> --- a/tests/weston-test-client-helper.h
> +++ b/tests/weston-test-client-helper.h
> @@ -26,6 +26,8 @@
> #include "config.h"
>
> #include <assert.h>
> +#include <stdbool.h>
> +
> #include "weston-test-runner.h"
> #include "wayland-test-client-protocol.h"
>
> @@ -135,4 +137,7 @@ void
> expect_protocol_error(struct client *client,
> const struct wl_interface *intf, uint32_t code);
>
> +bool
> +files_equal(const char *file_1, const char *file_2);
> +
> #endif
More information about the wayland-devel
mailing list