diff --git a/ChangeLog b/ChangeLog index 76d4b54ad..9fd8cce09 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,6 +14,8 @@ Security Features * Allow comments in test data files. + * The selftest program can execute a subset of the tests based on command + line arguments. Bugfix * Fix ssl_parse_record_header() to silently discard invalid DTLS records diff --git a/programs/test/selftest.c b/programs/test/selftest.c index 6279f58a9..7fd308d4f 100644 --- a/programs/test/selftest.c +++ b/programs/test/selftest.c @@ -208,9 +208,10 @@ int main( int argc, char *argv[] ) #if defined(MBEDTLS_SELF_TEST) const selftest_t *test; #endif /* MBEDTLS_SELF_TEST */ + char **argp = argc >= 1 ? argv + 1 : argv; int v; int suites_tested = 0, suites_failed = 0; -#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) +#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && defined(MBEDTLS_SELF_TEST) unsigned char buf[1000000]; #endif void *pointer; @@ -236,8 +237,13 @@ int main( int argc, char *argv[] ) return( EXIT_FAILURE ); } - if( argc == 2 && strcmp( argv[1], "-quiet" ) == 0 ) + if( argc >= 2 && ( strcmp( argv[1], "--quiet" ) == 0 || + strcmp( argv[1], "-quiet" ) == 0 || + strcmp( argv[1], "-q" ) == 0 ) ) + { v = 0; + ++argp; + } else { v = 1; @@ -250,13 +256,41 @@ int main( int argc, char *argv[] ) mbedtls_memory_buffer_alloc_init( buf, sizeof(buf) ); #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