On Fri, Feb 07, 2014 at 09:34:48AM +0100, Emilio Pozuelo Monfort wrote: > From: Emilio Pozuelo Monfort <emilio.pozu...@collabora.co.uk> > > We were calling exit(0) when tests were skipped, which counted > them as passed instead of skipped. Fix this by properly exiting > with 77 (which is what automake expects for skipped tests) from > the tests themselves, then returning 77 again from weston-test-runner > if all the tests were skipped. Finally the weston-test.so module > catches weston-test-runner's exit code and uses it as an exit code, > which is what automake will see and use.
All 6 patches applied, thanks. Kristian > > Signed-off-by: Emilio Pozuelo Monfort <emilio.pozu...@collabora.co.uk> > --- > tests/weston-test-client-helper.c | 8 +++++--- > tests/weston-test-runner.c | 41 > ++++++++++++++++++++++++++++----------- > tests/weston-test.c | 6 ++++++ > 3 files changed, 41 insertions(+), 14 deletions(-) > > diff --git a/tests/weston-test-client-helper.c > b/tests/weston-test-client-helper.c > index 399aa44..186b395 100644 > --- a/tests/weston-test-client-helper.c > +++ b/tests/weston-test-client-helper.c > @@ -505,9 +505,11 @@ skip(const char *fmt, ...) > vfprintf(stderr, fmt, argp); > va_end(argp); > > - /* automake tests uses exit code 77, but we don't have a good > - * way to make weston exit with that from here. */ > - exit(0); > + /* automake tests uses exit code 77. weston-test-runner will see > + * this and use it, and then weston-test's sigchld handler (in the > + * weston process) will use that as an exit status, which is what > + * automake will see in the end. */ > + exit(77); > } > > static void > diff --git a/tests/weston-test-runner.c b/tests/weston-test-runner.c > index 4274b39..ef45bae 100644 > --- a/tests/weston-test-runner.c > +++ b/tests/weston-test-runner.c > @@ -32,6 +32,8 @@ > #include <signal.h> > #include "weston-test-runner.h" > > +#define SKIP 77 > + > extern const struct weston_test __start_test_section, __stop_test_section; > > static const struct weston_test * > @@ -67,6 +69,7 @@ static int > exec_and_report_test(const struct weston_test *t, void *test_data, int > iteration) > { > int success = 0; > + int skip = 0; > int hardfail = 0; > siginfo_t info; > > @@ -91,6 +94,8 @@ exec_and_report_test(const struct weston_test *t, void > *test_data, int iteration > fprintf(stderr, "exit status %d", info.si_status); > if (info.si_status == EXIT_SUCCESS) > success = 1; > + else if (info.si_status == SKIP) > + skip = 1; > break; > case CLD_KILLED: > case CLD_DUMPED: > @@ -106,7 +111,10 @@ exec_and_report_test(const struct weston_test *t, void > *test_data, int iteration > if (success && !hardfail) { > fprintf(stderr, ", pass.\n"); > return 1; > - } else { > + } else if (skip) { > + fprintf(stderr, ", skip.\n"); > + return SKIP; > + } else { > fprintf(stderr, ", fail.\n"); > return 0; > } > @@ -114,13 +122,16 @@ exec_and_report_test(const struct weston_test *t, void > *test_data, int iteration > > /* Returns number of tests and number of pass / fail in param args */ > static int > -iterate_test(const struct weston_test *t, int *passed) > +iterate_test(const struct weston_test *t, int *passed, int *skipped) > { > - int i; > + int ret, i; > void *current_test_data = (void *) t->table_data; > for (i = 0; i < t->n_elements; ++i, current_test_data += > t->element_size) > { > - if (exec_and_report_test(t, current_test_data, i)) > + ret = exec_and_report_test(t, current_test_data, i); > + if (ret == SKIP) > + ++(*skipped); > + else if (ret) > ++(*passed); > } > > @@ -132,6 +143,7 @@ int main(int argc, char *argv[]) > const struct weston_test *t; > int total = 0; > int pass = 0; > + int skip = 0; > > if (argc == 2) { > const char *testname = argv[1]; > @@ -149,19 +161,26 @@ int main(int argc, char *argv[]) > exit(EXIT_FAILURE); > } > > - int number_passed_in_test = 0; > - total += iterate_test(t, &number_passed_in_test); > + int number_passed_in_test = 0, number_skipped_in_test = 0; > + total += iterate_test(t, &number_passed_in_test, > &number_skipped_in_test); > pass += number_passed_in_test; > + skip += number_skipped_in_test; > } else { > for (t = &__start_test_section; t < &__stop_test_section; t++) { > - int number_passed_in_test = 0; > - total += iterate_test(t, &number_passed_in_test); > + int number_passed_in_test = 0, number_skipped_in_test = > 0; > + total += iterate_test(t, &number_passed_in_test, > &number_skipped_in_test); > pass += number_passed_in_test; > + skip += number_skipped_in_test; > } > } > > - fprintf(stderr, "%d tests, %d pass, %d fail\n", > - total, pass, total - pass); > + fprintf(stderr, "%d tests, %d pass, %d skip, %d fail\n", > + total, pass, skip, total - pass - skip); > + > + if (skip == total) > + return SKIP; > + else if (pass + skip == total) > + return EXIT_SUCCESS; > > - return pass == total ? EXIT_SUCCESS : EXIT_FAILURE; > + return EXIT_FAILURE; > } > diff --git a/tests/weston-test.c b/tests/weston-test.c > index 844059d..35ccaa4 100644 > --- a/tests/weston-test.c > +++ b/tests/weston-test.c > @@ -54,6 +54,12 @@ test_client_sigchld(struct weston_process *process, int > status) > struct weston_test *test = > container_of(process, struct weston_test, process); > > + /* Chain up from weston-test-runner's exit code so that automake > + * knows the exit status and can report e.g. skipped tests. */ > + if (WIFEXITED(status) && WEXITSTATUS(status) != 0) > + exit(WEXITSTATUS(status)); > + > + /* In case the child aborted or segfaulted... */ > assert(status == 0); > > wl_display_terminate(test->compositor->wl_display); > -- > 1.9.rc1 > > _______________________________________________ > wayland-devel mailing list > wayland-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/wayland-devel _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel