diff options
Diffstat (limited to 'tools/testing/selftests/sync/sync_test.c')
| -rw-r--r-- | tools/testing/selftests/sync/sync_test.c | 71 | 
1 files changed, 46 insertions, 25 deletions
diff --git a/tools/testing/selftests/sync/sync_test.c b/tools/testing/selftests/sync/sync_test.c index 62fa666e501a..7f7938263c5c 100644 --- a/tools/testing/selftests/sync/sync_test.c +++ b/tools/testing/selftests/sync/sync_test.c @@ -31,62 +31,83 @@  #include <sys/types.h>  #include <sys/stat.h>  #include <sys/wait.h> +#include <errno.h> +#include <string.h> +#include "../kselftest.h"  #include "synctest.h"  static int run_test(int (*test)(void), char *name)  {  	int result;  	pid_t childpid; +	int ret;  	fflush(stdout);  	childpid = fork();  	if (childpid) {  		waitpid(childpid, &result, 0); -		if (WIFEXITED(result)) -			return WEXITSTATUS(result); +		if (WIFEXITED(result)) { +			ret = WEXITSTATUS(result); +			if (!ret) +				ksft_test_result_pass("[RUN]\t%s\n", name); +			else +				ksft_test_result_fail("[RUN]\t%s\n", name); +			return ret; +		}  		return 1;  	} -	printf("[RUN]\tExecuting %s\n", name);  	exit(test());  } -static int sync_api_supported(void) +static void sync_api_supported(void)  {  	struct stat sbuf; +	int ret; -	return 0 == stat("/sys/kernel/debug/sync/sw_sync", &sbuf); +	ret = stat("/sys/kernel/debug/sync/sw_sync", &sbuf); +	if (!ret) +		return; + +	if (errno == ENOENT) +		ksft_exit_skip("Sync framework not supported by kernel\n"); + +	if (errno == EACCES) +		ksft_exit_skip("Run Sync test as root.\n"); + +	ksft_exit_fail_msg("stat failed on /sys/kernel/debug/sync/sw_sync: %s", +				strerror(errno));  }  int main(void)  { -	int err = 0; +	int err; -	if (!sync_api_supported()) { -		printf("SKIP: Sync framework not supported by kernel\n"); -		return 0; -	} +	ksft_print_header(); + +	sync_api_supported(); -	printf("[RUN]\tTesting sync framework\n"); +	ksft_print_msg("[RUN]\tTesting sync framework\n"); -	err += RUN_TEST(test_alloc_timeline); -	err += RUN_TEST(test_alloc_fence); -	err += RUN_TEST(test_alloc_fence_negative); +	RUN_TEST(test_alloc_timeline); +	RUN_TEST(test_alloc_fence); +	RUN_TEST(test_alloc_fence_negative); -	err += RUN_TEST(test_fence_one_timeline_wait); -	err += RUN_TEST(test_fence_one_timeline_merge); -	err += RUN_TEST(test_fence_merge_same_fence); -	err += RUN_TEST(test_fence_multi_timeline_wait); -	err += RUN_TEST(test_stress_two_threads_shared_timeline); -	err += RUN_TEST(test_consumer_stress_multi_producer_single_consumer); -	err += RUN_TEST(test_merge_stress_random_merge); +	RUN_TEST(test_fence_one_timeline_wait); +	RUN_TEST(test_fence_one_timeline_merge); +	RUN_TEST(test_fence_merge_same_fence); +	RUN_TEST(test_fence_multi_timeline_wait); +	RUN_TEST(test_stress_two_threads_shared_timeline); +	RUN_TEST(test_consumer_stress_multi_producer_single_consumer); +	RUN_TEST(test_merge_stress_random_merge); +	err = ksft_get_fail_cnt();  	if (err) -		printf("[FAIL]\tsync errors: %d\n", err); -	else -		printf("[OK]\tsync\n"); +		ksft_exit_fail_msg("%d out of %d sync tests failed\n", +					err, ksft_test_num()); -	return !!err; +	/* need this return to keep gcc happy */ +	return ksft_exit_pass();  }  | 
