selftest: allow running a subset of the tests

If given command line arguments, interpret them as test names and only
run those tests.
This commit is contained in:
Gilles Peskine 2017-12-15 15:01:27 +01:00
parent 319ac801a8
commit c82fbb4e14
2 changed files with 40 additions and 5 deletions

View file

@ -4,6 +4,8 @@ mbed TLS ChangeLog (Sorted per branch, date)
Features Features
* Allow comments in test data files. * Allow comments in test data files.
* The selftest program can execute a subset of the tests based on command
line arguments.
Bugfix Bugfix
* Fix memory leak in mbedtls_ssl_set_hostname() when called multiple times. * Fix memory leak in mbedtls_ssl_set_hostname() when called multiple times.

View file

@ -256,10 +256,14 @@ const selftest_t selftests[] =
#endif #endif
{NULL, NULL} {NULL, NULL}
}; };
#endif /* MBEDTLS_SELF_TEST */
int main( int argc, char *argv[] ) int main( int argc, char *argv[] )
{ {
#if defined(MBEDTLS_SELF_TEST)
const selftest_t *test; const selftest_t *test;
#endif /* MBEDTLS_SELF_TEST */
char **argp = argc >= 1 ? argv + 1 : argv;
int v, suites_tested = 0, suites_failed = 0; int v, suites_tested = 0, suites_failed = 0;
#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && defined(MBEDTLS_SELF_TEST)
unsigned char buf[1000000]; unsigned char buf[1000000];
@ -287,10 +291,11 @@ int main( int argc, char *argv[] )
mbedtls_exit( MBEDTLS_EXIT_FAILURE ); mbedtls_exit( MBEDTLS_EXIT_FAILURE );
} }
if( argc == 2 && ( strcmp( argv[1], "--quiet" ) == 0 || if( argc >= 2 && ( strcmp( argv[1], "--quiet" ) == 0 ||
strcmp( argv[1], "-q" ) == 0 ) ) strcmp( argv[1], "-q" ) == 0 ) )
{ {
v = 0; v = 0;
++argp;
} }
else else
{ {
@ -304,13 +309,41 @@ int main( int argc, char *argv[] )
mbedtls_memory_buffer_alloc_init( buf, sizeof(buf) ); mbedtls_memory_buffer_alloc_init( buf, sizeof(buf) );
#endif #endif
for( test = selftests; test->name != NULL; test++ ) if( *argp != NULL )
{ {
if( test->function( v ) != 0 ) /* Run the specified tests */
for( ; *argp != NULL; argp++ )
{ {
suites_failed++; for( test = selftests; test->name != NULL; test++ )
{
if( !strcmp( *argp, test->name ) )
{
if( test->function( v ) != 0 )
{
suites_failed++;
}
suites_tested++;
break;
}
}
if( test->name == NULL )
{
mbedtls_printf( " Test suite %s not available -> failed\n\n", *argp );
suites_failed++;
}
}
}
else
{
/* Run all the tests */
for( test = selftests; test->name != NULL; test++ )
{
if( test->function( v ) != 0 )
{
suites_failed++;
}
suites_tested++;
} }
suites_tested++;
} }
#else #else