From 62d25699540a71aa42f6414cd51cedfb8d3a3392 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Fri, 2 Mar 2012 18:03:16 -0500 Subject: [PATCH] tests: Add Unit tests for wl_map and wl_array data structures We use a simple test-runner helper that runs each test in a separate process and reports the pass/fail rate at the end. --- configure.ac | 3 +- tests/Makefile.am | 8 ++++ tests/array-test.c | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/map-test.c | 47 +++++++++++++++++++++ tests/test-runner.c | 92 ++++++++++++++++++++++++++++++++++++++++ tests/test-runner.h | 14 +++++++ 6 files changed, 281 insertions(+), 1 deletion(-) create mode 100644 tests/Makefile.am create mode 100644 tests/array-test.c create mode 100644 tests/map-test.c create mode 100644 tests/test-runner.c create mode 100644 tests/test-runner.h diff --git a/configure.ac b/configure.ac index 070cc39..f5bf788 100644 --- a/configure.ac +++ b/configure.ac @@ -61,5 +61,6 @@ AC_CONFIG_FILES([Makefile src/Makefile src/wayland-server.pc src/wayland-client.pc - protocol/Makefile]) + protocol/Makefile + tests/Makefile]) AC_OUTPUT diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 0000000..2597358 --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,8 @@ +TESTS = $(check_PROGRAMS) + +check_PROGRAMS = array-test map-test + +map_test_SOURCES = map-test.c test-runner.c +array_test_SOURCES = array-test.c test-runner.c + +LDADD = $(top_builddir)/src/libwayland-util.la diff --git a/tests/array-test.c b/tests/array-test.c new file mode 100644 index 0000000..a7bf8a9 --- /dev/null +++ b/tests/array-test.c @@ -0,0 +1,118 @@ +/* + * Copyright © 2012 Intel Corporation + * + * 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 +#include +#include "../src/wayland-private.h" +#include "test-runner.h" + +TEST(array_init) +{ + const int iterations = 4122; /* this is arbitrary */ + int i; + + /* Init array an arbitray amount of times and verify the + * defaults are sensible. */ + + for (i = 0; i < iterations; i++) { + struct wl_array array; + wl_array_init(&array); + assert(array.size == 0); + assert(array.alloc == 0); + assert(array.data == 0); + } +} + +TEST(array_add) +{ + struct mydata { + int a; + unsigned b; + double c; + double d; + }; + + const int iterations = 1321; /* this is arbitrary */ + const int datasize = sizeof(struct mydata); + struct wl_array array; + int i; + + wl_array_init(&array); + + /* add some data */ + for (i = 0; i < iterations; i++) { + struct mydata* ptr = wl_array_add(&array, datasize); + assert((i + 1) * datasize == array.size); + + ptr->a = i * 3; + ptr->b = -i; + ptr->c = (double)(i); + ptr->d = (double)(i / 2.); + } + + /* verify the data */ + for (i = 0; i < iterations; ++i) { + const int index = datasize * i; + struct mydata* check = (struct mydata*)(array.data + index); + + assert(check->a == i * 3); + assert(check->b == -i); + assert(check->c == (double)(i)); + assert(check->d == (double)(i/2.)); + } + + wl_array_release(&array); +} + +TEST(array_copy) +{ + const int iterations = 1529; /* this is arbitrary */ + struct wl_array source; + struct wl_array copy; + int i; + + wl_array_init(&source); + + /* add some data */ + for (i = 0; i < iterations; i++) { + int *p = wl_array_add(&source, sizeof(int)); + *p = i * 2 + i; + } + + /* copy the array */ + wl_array_init(©); + wl_array_copy(©, &source); + + /* check the copy */ + for (i = 0; i < iterations; i++) { + const int index = sizeof(int) * i; + int *s = (int *)(source.data + index); + int *c = (int *)(copy.data + index); + + assert(*s == *c); /* verify the values are the same */ + assert(s != c); /* ensure the addresses aren't the same */ + assert(*s == i * 2 + i); /* sanity check */ + } + + wl_array_release(&source); + wl_array_release(©); +} diff --git a/tests/map-test.c b/tests/map-test.c new file mode 100644 index 0000000..448afc4 --- /dev/null +++ b/tests/map-test.c @@ -0,0 +1,47 @@ +/* + * Copyright © 2012 Intel Corporation + * + * 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 +#include +#include +#include "../src/wayland-private.h" +#include "test-runner.h" + +TEST(map_insert_new) +{ + struct wl_map map; + uint32_t i, j, k, a, b, c; + + wl_map_init(&map); + i = wl_map_insert_new(&map, WL_MAP_SERVER_SIDE, &a); + j = wl_map_insert_new(&map, WL_MAP_SERVER_SIDE, &b); + k = wl_map_insert_new(&map, WL_MAP_SERVER_SIDE, &c); + assert(i == WL_SERVER_ID_START); + assert(j == WL_SERVER_ID_START + 1); + assert(k == WL_SERVER_ID_START + 2); + + assert(wl_map_lookup(&map, i) == &a); + assert(wl_map_lookup(&map, j) == &b); + assert(wl_map_lookup(&map, k) == &c); + + wl_map_release(&map); +} diff --git a/tests/test-runner.c b/tests/test-runner.c new file mode 100644 index 0000000..80be2f7 --- /dev/null +++ b/tests/test-runner.c @@ -0,0 +1,92 @@ +/* + * Copyright © 2012 Intel Corporation + * + * 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 +#include +#include +#include +#include +#include +#include "test-runner.h" + +extern const struct test __start_test_section, __stop_test_section; + +static int +run_one_test(const char *name) +{ + const struct test *t; + + for (t = &__start_test_section; t < &__stop_test_section; t++) { + if (strcmp(t->name, name) == 0) { + t->run(); + return EXIT_SUCCESS; + } + } + + fprintf(stderr, "uknown test: \"%s\"\n", name); + + return EXIT_FAILURE; +} + +int main(int argc, char *argv[]) +{ + const struct test *t; + pid_t pid; + int i, total, pass; + siginfo_t info; + + if (argc == 2) + return run_one_test(argv[1]); + + pass = 0; + for (t = &__start_test_section; t < &__stop_test_section; t++) { + fprintf(stderr, "running \"%s\"... ", t->name); + pid = fork(); + assert(pid >= 0); + if (pid == 0) { + t->run(); + exit(EXIT_SUCCESS); + } + if (waitid(P_ALL, 0, &info, WEXITED)) { + fprintf(stderr, "waitid failed: %m\n"); + abort(); + } + + switch (info.si_code) { + case CLD_EXITED: + fprintf(stderr, "exit status %d\n", info.si_status); + if (info.si_status == EXIT_SUCCESS) + pass++; + break; + case CLD_KILLED: + case CLD_DUMPED: + fprintf(stderr, "signal %d\n", info.si_status); + break; + } + } + + total = &__stop_test_section - &__start_test_section; + fprintf(stderr, "%d tests, %d pass, %d fail\n", + total, pass, total - pass); + + return pass == total ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/tests/test-runner.h b/tests/test-runner.h new file mode 100644 index 0000000..c1fdff9 --- /dev/null +++ b/tests/test-runner.h @@ -0,0 +1,14 @@ +struct test { + const char *name; + void (*run)(void); +}; + +#define TEST(name) \ + static void name(void); \ + \ + const struct test test##name \ + __attribute__ ((section ("test_section"))) = { \ + #name, name \ + }; \ + \ + static void name(void) -- 2.7.4