[PATCH weston v2 6/6] tests: Properly report skipped tests

Kristian Høgsberg hoegsberg at gmail.com
Tue Feb 18 13:51:05 PST 2014


On Fri, Feb 07, 2014 at 09:34:48AM +0100, Emilio Pozuelo Monfort wrote:
> From: Emilio Pozuelo Monfort <emilio.pozuelo at 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.pozuelo at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list