On Wed, 19 Nov 2014 15:06:24 -0800
Bryce Harrington <br...@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 <br...@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

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to