selftest: allow excluding a subset of the tests
E.g. "selftest -x timing" runs all the self-tests except timing.
diff --git a/programs/test/selftest.c b/programs/test/selftest.c
index 7fd308d..d21d47c 100644
--- a/programs/test/selftest.c
+++ b/programs/test/selftest.c
@@ -208,8 +208,9 @@
#if defined(MBEDTLS_SELF_TEST)
const selftest_t *test;
#endif /* MBEDTLS_SELF_TEST */
- char **argp = argc >= 1 ? argv + 1 : argv;
- int v;
+ char **argp;
+ int v = 1; /* v=1 for verbose mode */
+ int exclude_mode = 0;
int suites_tested = 0, suites_failed = 0;
#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && defined(MBEDTLS_SELF_TEST)
unsigned char buf[1000000];
@@ -237,18 +238,25 @@
return( EXIT_FAILURE );
}
- if( argc >= 2 && ( strcmp( argv[1], "--quiet" ) == 0 ||
- strcmp( argv[1], "-quiet" ) == 0 ||
- strcmp( argv[1], "-q" ) == 0 ) )
+ for( argp = argv + ( argc >= 1 ? 1 : argc ); *argp != NULL; ++argp )
{
- v = 0;
- ++argp;
+ if( strcmp( *argp, "--quiet" ) == 0 ||
+ strcmp( *argp, "-quiet" ) == 0 ||
+ strcmp( *argp, "-q" ) == 0 )
+ {
+ v = 0;
+ }
+ else if( strcmp( *argp, "--exclude" ) == 0 ||
+ strcmp( *argp, "-x" ) == 0 )
+ {
+ exclude_mode = 1;
+ }
+ else
+ break;
}
- else
- {
- v = 1;
+
+ if( v != 0 )
mbedtls_printf( "\n" );
- }
#if defined(MBEDTLS_SELF_TEST)
@@ -256,7 +264,7 @@
mbedtls_memory_buffer_alloc_init( buf, sizeof(buf) );
#endif
- if( *argp != NULL )
+ if( *argp != NULL && exclude_mode == 0 )
{
/* Run the specified tests */
for( ; *argp != NULL; argp++ )
@@ -282,9 +290,24 @@
}
else
{
- /* Run all the tests */
+ /* Run all the tests except excluded ones */
for( test = selftests; test->name != NULL; test++ )
{
+ if( exclude_mode )
+ {
+ char **excluded;
+ for( excluded = argp; *excluded != NULL; ++excluded )
+ {
+ if( !strcmp( *excluded, test->name ) )
+ break;
+ }
+ if( *excluded )
+ {
+ if( v )
+ mbedtls_printf( " Skip: %s\n", test->name );
+ continue;
+ }
+ }
if( test->function( v ) != 0 )
{
suites_failed++;
@@ -294,6 +317,7 @@
}
#else
+ (void) exclude_mode;
mbedtls_printf( " MBEDTLS_SELF_TEST not defined.\n" );
#endif