[v8,05/12] kselftest: arm64: extend test_init functionalities
diff mbox series

Message ID 20191009082611.9441-6-cristian.marussi@arm.com
State New
Headers show
Series
  • Add arm64/signal initial kselftest support
Related show

Commit Message

Cristian Marussi Oct. 9, 2019, 8:26 a.m. UTC
Extend signal testing framework to allow the definition of a custom per
test initialization function to be run at the end of the common test_init
after test setup phase has completed and before test-run routine.

This custom per-test initialization function also enables the test writer
to decide on its own when forcibly skip the test itself using standard KSFT
mechanism.

Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
---
v7 --> v8
- per test .init() helper added new in v8 (splitted out of v7 05/11)
---
 .../selftests/arm64/signal/test_signals.c     |  6 ++--
 .../selftests/arm64/signal/test_signals.h     |  7 ++--
 .../arm64/signal/test_signals_utils.c         | 32 +++++++++++++------
 .../arm64/signal/test_signals_utils.h         |  1 +
 4 files changed, 31 insertions(+), 15 deletions(-)

Comments

Dave Martin Oct. 9, 2019, 11:32 a.m. UTC | #1
On Wed, Oct 09, 2019 at 09:26:04AM +0100, Cristian Marussi wrote:
> Extend signal testing framework to allow the definition of a custom per
> test initialization function to be run at the end of the common test_init
> after test setup phase has completed and before test-run routine.
> 
> This custom per-test initialization function also enables the test writer
> to decide on its own when forcibly skip the test itself using standard KSFT
> mechanism.
> 
> Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>

Reviewed-by: Dave Martin <Dave.Martin@arm.com>

> ---
> v7 --> v8
> - per test .init() helper added new in v8 (splitted out of v7 05/11)
> ---
>  .../selftests/arm64/signal/test_signals.c     |  6 ++--
>  .../selftests/arm64/signal/test_signals.h     |  7 ++--
>  .../arm64/signal/test_signals_utils.c         | 32 +++++++++++++------
>  .../arm64/signal/test_signals_utils.h         |  1 +
>  4 files changed, 31 insertions(+), 15 deletions(-)
> 
> diff --git a/tools/testing/selftests/arm64/signal/test_signals.c b/tools/testing/selftests/arm64/signal/test_signals.c
> index cb970346b280..416b1ff43199 100644
> --- a/tools/testing/selftests/arm64/signal/test_signals.c
> +++ b/tools/testing/selftests/arm64/signal/test_signals.c
> @@ -19,11 +19,11 @@ int main(int argc, char *argv[])
>  	current = &tde;
>  
>  	ksft_print_msg("%s :: %s\n", current->name, current->descr);
> -	if (test_setup(current)) {
> +	if (test_setup(current) && test_init(current)) {
>  		test_run(current);
> -		test_result(current);
>  		test_cleanup(current);
>  	}
> +	test_result(current);
>  
> -	return current->pass ? KSFT_PASS : KSFT_FAIL;
> +	return current->result;
>  }
> diff --git a/tools/testing/selftests/arm64/signal/test_signals.h b/tools/testing/selftests/arm64/signal/test_signals.h
> index 3fd4499f00bf..901521188202 100644
> --- a/tools/testing/selftests/arm64/signal/test_signals.h
> +++ b/tools/testing/selftests/arm64/signal/test_signals.h
> @@ -84,17 +84,20 @@ struct tdescr {
>  	unsigned int		timeout;
>  	bool			triggered;
>  	bool			pass;
> +	unsigned int		result;
>  	/* optional sa_flags for the installed handler */
>  	int			sa_flags;
>  	ucontext_t		saved_uc;
>  	/* optional test private data */
>  	void                    *priv;
>  
> -	/* a custom setup function to be called before test starts */
> +	/* a custom setup: called alternatively to default_setup */
>  	int (*setup)(struct tdescr *td);
> +	/* a custom init: called by default test init after test_setup */
> +	bool (*init)(struct tdescr *td);
>  	/* a custom cleanup function called before test exits */
>  	void (*cleanup)(struct tdescr *td);
> -	/* an optional function to be used as a trigger for test starting */
> +	/* an optional function to be used as a trigger for starting test */
>  	int (*trigger)(struct tdescr *td);
>  	/*
>  	 * the actual test-core: invoked differently depending on the
> diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.c b/tools/testing/selftests/arm64/signal/test_signals_utils.c
> index ff24db6f9d06..e8bbe36c2660 100644
> --- a/tools/testing/selftests/arm64/signal/test_signals_utils.c
> +++ b/tools/testing/selftests/arm64/signal/test_signals_utils.c
> @@ -11,6 +11,8 @@
>  #include <linux/auxvec.h>
>  #include <ucontext.h>
>  
> +#include <kselftest.h>
> +
>  #include "test_signals.h"
>  #include "test_signals_utils.h"
>  #include "testcases/testcases.h"
> @@ -54,12 +56,18 @@ static void unblock_signal(int signum)
>  
>  static void default_result(struct tdescr *td, bool force_exit)
>  {
> -	if (td->pass)
> +	if (td->result == KSFT_SKIP) {
> +		fprintf(stderr, "==>> completed. SKIP.\n");
> +	} else if (td->pass) {
>  		fprintf(stderr, "==>> completed. PASS(1)\n");
> -	else
> +		td->result = KSFT_PASS;
> +	} else {
>  		fprintf(stdout, "==>> completed. FAIL(0)\n");
> +		td->result = KSFT_FAIL;
> +	}
> +
>  	if (force_exit)
> -		exit(td->pass ? EXIT_SUCCESS : EXIT_FAILURE);
> +		exit(td->result);
>  }
>  
>  /*
> @@ -211,7 +219,7 @@ static inline int default_trigger(struct tdescr *td)
>  	return !raise(td->sig_trig);
>  }
>  
> -static int test_init(struct tdescr *td)
> +int test_init(struct tdescr *td)
>  {
>  	td->minsigstksz = getauxval(AT_MINSIGSTKSZ);
>  	if (!td->minsigstksz)
> @@ -224,8 +232,6 @@ static int test_init(struct tdescr *td)
>  		 * Checking for CPU required features using both the
>  		 * auxval and the arm64 MRS Emulation to read sysregs.
>  		 */
> -		if (getauxval(AT_HWCAP) & HWCAP_SSBS)
> -			td->feats_supported |= FEAT_SSBS;
>  		if (getauxval(AT_HWCAP) & HWCAP_CPUID) {
>  			uint64_t val = 0;
>  
> @@ -250,7 +256,14 @@ static int test_init(struct tdescr *td)
>  						~td->feats_supported));
>  	}
>  
> +	/* Perform test specific additional initialization */
> +	if (td->init && !td->init(td)) {
> +		fprintf(stderr, "FAILED Testcase initialization.\n");
> +		return 0;
> +	}
>  	td->initialized = 1;
> +	fprintf(stderr, "Testcase initialized.\n");
> +
>  	return 1;
>  }
>  
> @@ -262,9 +275,8 @@ int test_setup(struct tdescr *td)
>  	assert(td->name);
>  	assert(td->run);
>  
> -	if (!test_init(td))
> -		return 0;
> -
> +	/* Default result is FAIL if test setup fails */
> +	td->result = KSFT_FAIL;
>  	if (td->setup)
>  		return td->setup(td);
>  	else
> @@ -285,7 +297,7 @@ int test_run(struct tdescr *td)
>  
>  void test_result(struct tdescr *td)
>  {
> -	if (td->check_result)
> +	if (td->initialized && td->result != KSFT_SKIP && td->check_result)
>  		td->check_result(td);
>  	default_result(td, 0);
>  }
> diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.h b/tools/testing/selftests/arm64/signal/test_signals_utils.h
> index 47a7592b7c53..5e3a2b7aaa8b 100644
> --- a/tools/testing/selftests/arm64/signal/test_signals_utils.h
> +++ b/tools/testing/selftests/arm64/signal/test_signals_utils.h
> @@ -6,6 +6,7 @@
>  
>  #include "test_signals.h"
>  
> +int test_init(struct tdescr *td);
>  int test_setup(struct tdescr *td);
>  void test_cleanup(struct tdescr *td);
>  int test_run(struct tdescr *td);
> -- 
> 2.17.1
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Cristian Marussi Oct. 9, 2019, 11:57 a.m. UTC | #2
On 09/10/2019 12:32, Dave Martin wrote:
> On Wed, Oct 09, 2019 at 09:26:04AM +0100, Cristian Marussi wrote:
>> Extend signal testing framework to allow the definition of a custom per
>> test initialization function to be run at the end of the common test_init
>> after test setup phase has completed and before test-run routine.
>>
>> This custom per-test initialization function also enables the test writer
>> to decide on its own when forcibly skip the test itself using standard KSFT
>> mechanism.
>>
>> Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
> 
> Reviewed-by: Dave Martin <Dave.Martin@arm.com>
> 

Thanks

Cristian
>> ---
>> v7 --> v8
>> - per test .init() helper added new in v8 (splitted out of v7 05/11)
>> ---
>>  .../selftests/arm64/signal/test_signals.c     |  6 ++--
>>  .../selftests/arm64/signal/test_signals.h     |  7 ++--
>>  .../arm64/signal/test_signals_utils.c         | 32 +++++++++++++------
>>  .../arm64/signal/test_signals_utils.h         |  1 +
>>  4 files changed, 31 insertions(+), 15 deletions(-)
>>
>> diff --git a/tools/testing/selftests/arm64/signal/test_signals.c b/tools/testing/selftests/arm64/signal/test_signals.c
>> index cb970346b280..416b1ff43199 100644
>> --- a/tools/testing/selftests/arm64/signal/test_signals.c
>> +++ b/tools/testing/selftests/arm64/signal/test_signals.c
>> @@ -19,11 +19,11 @@ int main(int argc, char *argv[])
>>  	current = &tde;
>>  
>>  	ksft_print_msg("%s :: %s\n", current->name, current->descr);
>> -	if (test_setup(current)) {
>> +	if (test_setup(current) && test_init(current)) {
>>  		test_run(current);
>> -		test_result(current);
>>  		test_cleanup(current);
>>  	}
>> +	test_result(current);
>>  
>> -	return current->pass ? KSFT_PASS : KSFT_FAIL;
>> +	return current->result;
>>  }
>> diff --git a/tools/testing/selftests/arm64/signal/test_signals.h b/tools/testing/selftests/arm64/signal/test_signals.h
>> index 3fd4499f00bf..901521188202 100644
>> --- a/tools/testing/selftests/arm64/signal/test_signals.h
>> +++ b/tools/testing/selftests/arm64/signal/test_signals.h
>> @@ -84,17 +84,20 @@ struct tdescr {
>>  	unsigned int		timeout;
>>  	bool			triggered;
>>  	bool			pass;
>> +	unsigned int		result;
>>  	/* optional sa_flags for the installed handler */
>>  	int			sa_flags;
>>  	ucontext_t		saved_uc;
>>  	/* optional test private data */
>>  	void                    *priv;
>>  
>> -	/* a custom setup function to be called before test starts */
>> +	/* a custom setup: called alternatively to default_setup */
>>  	int (*setup)(struct tdescr *td);
>> +	/* a custom init: called by default test init after test_setup */
>> +	bool (*init)(struct tdescr *td);
>>  	/* a custom cleanup function called before test exits */
>>  	void (*cleanup)(struct tdescr *td);
>> -	/* an optional function to be used as a trigger for test starting */
>> +	/* an optional function to be used as a trigger for starting test */
>>  	int (*trigger)(struct tdescr *td);
>>  	/*
>>  	 * the actual test-core: invoked differently depending on the
>> diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.c b/tools/testing/selftests/arm64/signal/test_signals_utils.c
>> index ff24db6f9d06..e8bbe36c2660 100644
>> --- a/tools/testing/selftests/arm64/signal/test_signals_utils.c
>> +++ b/tools/testing/selftests/arm64/signal/test_signals_utils.c
>> @@ -11,6 +11,8 @@
>>  #include <linux/auxvec.h>
>>  #include <ucontext.h>
>>  
>> +#include <kselftest.h>
>> +
>>  #include "test_signals.h"
>>  #include "test_signals_utils.h"
>>  #include "testcases/testcases.h"
>> @@ -54,12 +56,18 @@ static void unblock_signal(int signum)
>>  
>>  static void default_result(struct tdescr *td, bool force_exit)
>>  {
>> -	if (td->pass)
>> +	if (td->result == KSFT_SKIP) {
>> +		fprintf(stderr, "==>> completed. SKIP.\n");
>> +	} else if (td->pass) {
>>  		fprintf(stderr, "==>> completed. PASS(1)\n");
>> -	else
>> +		td->result = KSFT_PASS;
>> +	} else {
>>  		fprintf(stdout, "==>> completed. FAIL(0)\n");
>> +		td->result = KSFT_FAIL;
>> +	}
>> +
>>  	if (force_exit)
>> -		exit(td->pass ? EXIT_SUCCESS : EXIT_FAILURE);
>> +		exit(td->result);
>>  }
>>  
>>  /*
>> @@ -211,7 +219,7 @@ static inline int default_trigger(struct tdescr *td)
>>  	return !raise(td->sig_trig);
>>  }
>>  
>> -static int test_init(struct tdescr *td)
>> +int test_init(struct tdescr *td)
>>  {
>>  	td->minsigstksz = getauxval(AT_MINSIGSTKSZ);
>>  	if (!td->minsigstksz)
>> @@ -224,8 +232,6 @@ static int test_init(struct tdescr *td)
>>  		 * Checking for CPU required features using both the
>>  		 * auxval and the arm64 MRS Emulation to read sysregs.
>>  		 */
>> -		if (getauxval(AT_HWCAP) & HWCAP_SSBS)
>> -			td->feats_supported |= FEAT_SSBS;
>>  		if (getauxval(AT_HWCAP) & HWCAP_CPUID) {
>>  			uint64_t val = 0;
>>  
>> @@ -250,7 +256,14 @@ static int test_init(struct tdescr *td)
>>  						~td->feats_supported));
>>  	}
>>  
>> +	/* Perform test specific additional initialization */
>> +	if (td->init && !td->init(td)) {
>> +		fprintf(stderr, "FAILED Testcase initialization.\n");
>> +		return 0;
>> +	}
>>  	td->initialized = 1;
>> +	fprintf(stderr, "Testcase initialized.\n");
>> +
>>  	return 1;
>>  }
>>  
>> @@ -262,9 +275,8 @@ int test_setup(struct tdescr *td)
>>  	assert(td->name);
>>  	assert(td->run);
>>  
>> -	if (!test_init(td))
>> -		return 0;
>> -
>> +	/* Default result is FAIL if test setup fails */
>> +	td->result = KSFT_FAIL;
>>  	if (td->setup)
>>  		return td->setup(td);
>>  	else
>> @@ -285,7 +297,7 @@ int test_run(struct tdescr *td)
>>  
>>  void test_result(struct tdescr *td)
>>  {
>> -	if (td->check_result)
>> +	if (td->initialized && td->result != KSFT_SKIP && td->check_result)
>>  		td->check_result(td);
>>  	default_result(td, 0);
>>  }
>> diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.h b/tools/testing/selftests/arm64/signal/test_signals_utils.h
>> index 47a7592b7c53..5e3a2b7aaa8b 100644
>> --- a/tools/testing/selftests/arm64/signal/test_signals_utils.h
>> +++ b/tools/testing/selftests/arm64/signal/test_signals_utils.h
>> @@ -6,6 +6,7 @@
>>  
>>  #include "test_signals.h"
>>  
>> +int test_init(struct tdescr *td);
>>  int test_setup(struct tdescr *td);
>>  void test_cleanup(struct tdescr *td);
>>  int test_run(struct tdescr *td);
>> -- 
>> 2.17.1
>>
>>
>> _______________________________________________
>> linux-arm-kernel mailing list
>> linux-arm-kernel@lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Patch
diff mbox series

diff --git a/tools/testing/selftests/arm64/signal/test_signals.c b/tools/testing/selftests/arm64/signal/test_signals.c
index cb970346b280..416b1ff43199 100644
--- a/tools/testing/selftests/arm64/signal/test_signals.c
+++ b/tools/testing/selftests/arm64/signal/test_signals.c
@@ -19,11 +19,11 @@  int main(int argc, char *argv[])
 	current = &tde;
 
 	ksft_print_msg("%s :: %s\n", current->name, current->descr);
-	if (test_setup(current)) {
+	if (test_setup(current) && test_init(current)) {
 		test_run(current);
-		test_result(current);
 		test_cleanup(current);
 	}
+	test_result(current);
 
-	return current->pass ? KSFT_PASS : KSFT_FAIL;
+	return current->result;
 }
diff --git a/tools/testing/selftests/arm64/signal/test_signals.h b/tools/testing/selftests/arm64/signal/test_signals.h
index 3fd4499f00bf..901521188202 100644
--- a/tools/testing/selftests/arm64/signal/test_signals.h
+++ b/tools/testing/selftests/arm64/signal/test_signals.h
@@ -84,17 +84,20 @@  struct tdescr {
 	unsigned int		timeout;
 	bool			triggered;
 	bool			pass;
+	unsigned int		result;
 	/* optional sa_flags for the installed handler */
 	int			sa_flags;
 	ucontext_t		saved_uc;
 	/* optional test private data */
 	void                    *priv;
 
-	/* a custom setup function to be called before test starts */
+	/* a custom setup: called alternatively to default_setup */
 	int (*setup)(struct tdescr *td);
+	/* a custom init: called by default test init after test_setup */
+	bool (*init)(struct tdescr *td);
 	/* a custom cleanup function called before test exits */
 	void (*cleanup)(struct tdescr *td);
-	/* an optional function to be used as a trigger for test starting */
+	/* an optional function to be used as a trigger for starting test */
 	int (*trigger)(struct tdescr *td);
 	/*
 	 * the actual test-core: invoked differently depending on the
diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.c b/tools/testing/selftests/arm64/signal/test_signals_utils.c
index ff24db6f9d06..e8bbe36c2660 100644
--- a/tools/testing/selftests/arm64/signal/test_signals_utils.c
+++ b/tools/testing/selftests/arm64/signal/test_signals_utils.c
@@ -11,6 +11,8 @@ 
 #include <linux/auxvec.h>
 #include <ucontext.h>
 
+#include <kselftest.h>
+
 #include "test_signals.h"
 #include "test_signals_utils.h"
 #include "testcases/testcases.h"
@@ -54,12 +56,18 @@  static void unblock_signal(int signum)
 
 static void default_result(struct tdescr *td, bool force_exit)
 {
-	if (td->pass)
+	if (td->result == KSFT_SKIP) {
+		fprintf(stderr, "==>> completed. SKIP.\n");
+	} else if (td->pass) {
 		fprintf(stderr, "==>> completed. PASS(1)\n");
-	else
+		td->result = KSFT_PASS;
+	} else {
 		fprintf(stdout, "==>> completed. FAIL(0)\n");
+		td->result = KSFT_FAIL;
+	}
+
 	if (force_exit)
-		exit(td->pass ? EXIT_SUCCESS : EXIT_FAILURE);
+		exit(td->result);
 }
 
 /*
@@ -211,7 +219,7 @@  static inline int default_trigger(struct tdescr *td)
 	return !raise(td->sig_trig);
 }
 
-static int test_init(struct tdescr *td)
+int test_init(struct tdescr *td)
 {
 	td->minsigstksz = getauxval(AT_MINSIGSTKSZ);
 	if (!td->minsigstksz)
@@ -224,8 +232,6 @@  static int test_init(struct tdescr *td)
 		 * Checking for CPU required features using both the
 		 * auxval and the arm64 MRS Emulation to read sysregs.
 		 */
-		if (getauxval(AT_HWCAP) & HWCAP_SSBS)
-			td->feats_supported |= FEAT_SSBS;
 		if (getauxval(AT_HWCAP) & HWCAP_CPUID) {
 			uint64_t val = 0;
 
@@ -250,7 +256,14 @@  static int test_init(struct tdescr *td)
 						~td->feats_supported));
 	}
 
+	/* Perform test specific additional initialization */
+	if (td->init && !td->init(td)) {
+		fprintf(stderr, "FAILED Testcase initialization.\n");
+		return 0;
+	}
 	td->initialized = 1;
+	fprintf(stderr, "Testcase initialized.\n");
+
 	return 1;
 }
 
@@ -262,9 +275,8 @@  int test_setup(struct tdescr *td)
 	assert(td->name);
 	assert(td->run);
 
-	if (!test_init(td))
-		return 0;
-
+	/* Default result is FAIL if test setup fails */
+	td->result = KSFT_FAIL;
 	if (td->setup)
 		return td->setup(td);
 	else
@@ -285,7 +297,7 @@  int test_run(struct tdescr *td)
 
 void test_result(struct tdescr *td)
 {
-	if (td->check_result)
+	if (td->initialized && td->result != KSFT_SKIP && td->check_result)
 		td->check_result(td);
 	default_result(td, 0);
 }
diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.h b/tools/testing/selftests/arm64/signal/test_signals_utils.h
index 47a7592b7c53..5e3a2b7aaa8b 100644
--- a/tools/testing/selftests/arm64/signal/test_signals_utils.h
+++ b/tools/testing/selftests/arm64/signal/test_signals_utils.h
@@ -6,6 +6,7 @@ 
 
 #include "test_signals.h"
 
+int test_init(struct tdescr *td);
 int test_setup(struct tdescr *td);
 void test_cleanup(struct tdescr *td);
 int test_run(struct tdescr *td);