1 #line 1 "main_test.function"
3 #define TEST_SUITE_ACTIVE
5 int verify_string( char **str )
7 if( (*str)[0] != '"' ||
8 (*str)[strlen( *str ) - 1] != '"' )
10 mbedtls_fprintf( stderr,
11 "Expected string (with \"\") for parameter and got: %s\n", *str );
16 (*str)[strlen( *str ) - 1] = '\0';
21 int verify_int( char *str, int *value )
28 for( i = 0; i < strlen( str ); i++ )
30 if( i == 0 && str[i] == '-' )
36 if( ( ( minus && i == 2 ) || ( !minus && i == 1 ) ) &&
37 str[i - 1] == '0' && str[i] == 'x' )
43 if( ! ( ( str[i] >= '0' && str[i] <= '9' ) ||
44 ( hex && ( ( str[i] >= 'a' && str[i] <= 'f' ) ||
45 ( str[i] >= 'A' && str[i] <= 'F' ) ) ) ) )
55 *value = strtol( str, NULL, 16 );
57 *value = strtol( str, NULL, 10 );
64 mbedtls_fprintf( stderr,
65 "Expected integer for parameter and got: %s\n", str );
66 return( KEY_VALUE_MAPPING_NOT_FOUND );
70 /*----------------------------------------------------------------------------*/
76 #line !LINE_NO! "main_test.function"
79 /*----------------------------------------------------------------------------*/
80 /* Test dispatch code */
82 int dep_check( char *str )
88 #line !LINE_NO! "main_test.function"
90 return( DEPENDENCY_NOT_SUPPORTED );
93 int dispatch_test(int cnt, char *params[50])
99 #if defined(TEST_SUITE_ACTIVE)
100 ret = DISPATCH_TEST_SUCCESS;
102 // Cast to void to avoid compiler warnings
107 #line !LINE_NO! "main_test.function"
108 mbedtls_fprintf( stdout,
109 "FAILED\nSkipping unknown test function '%s'\n",
112 ret = DISPATCH_TEST_FN_NOT_FOUND;
115 ret = DISPATCH_UNSUPPORTED_SUITE;
121 /*----------------------------------------------------------------------------*/
124 #line !LINE_NO! "main_test.function"
127 "Usage: %s [OPTIONS] files...\n\n" \
128 " Command line arguments:\n" \
129 " files... One or more test data file. If no file is specified\n" \
130 " the followimg default test case is used:\n" \
133 " -v | --verbose Display full information about each test\n" \
134 " -h | --help Display this information\n\n", \
139 int get_line( FILE *f, char *buf, size_t len )
143 ret = fgets( buf, len, f );
147 if( strlen( buf ) && buf[strlen(buf) - 1] == '\n' )
148 buf[strlen(buf) - 1] = '\0';
149 if( strlen( buf ) && buf[strlen(buf) - 1] == '\r' )
150 buf[strlen(buf) - 1] = '\0';
155 int parse_arguments( char *buf, size_t len, char *params[50] )
163 while( *p != '\0' && p < buf + len )
173 if( p + 1 < buf + len )
184 /* Replace newlines, question marks and colons in strings */
185 for( i = 0; i < cnt; i++ )
192 if( *p == '\\' && *(p + 1) == 'n' )
197 else if( *p == '\\' && *(p + 1) == ':' )
202 else if( *p == '\\' && *(p + 1) == '?' )
216 static int test_snprintf( size_t n, const char ref_buf[10], int ref_ret )
219 char buf[10] = "xxxxxxxxx";
220 const char ref[10] = "xxxxxxxxx";
222 ret = mbedtls_snprintf( buf, n, "%s", "123" );
223 if( ret < 0 || (size_t) ret >= n )
226 if( strncmp( ref_buf, buf, sizeof( buf ) ) != 0 ||
228 memcmp( buf + n, ref + n, sizeof( buf ) - n ) != 0 )
236 static int run_test_snprintf( void )
238 return( test_snprintf( 0, "xxxxxxxxx", -1 ) != 0 ||
239 test_snprintf( 1, "", -1 ) != 0 ||
240 test_snprintf( 2, "1", -1 ) != 0 ||
241 test_snprintf( 3, "12", -1 ) != 0 ||
242 test_snprintf( 4, "123", 3 ) != 0 ||
243 test_snprintf( 5, "123", 3 ) != 0 );
246 int main(int argc, const char *argv[])
248 /* Local Configurations and options */
249 const char *default_filename = "TESTCASE_FILENAME";
250 const char *test_filename = NULL;
251 const char **test_files = NULL;
252 int testfile_count = 0;
253 int option_verbose = 0;
255 /* Other Local variables */
257 const char *next_arg;
258 int testfile_index, ret, i, cnt;
259 int total_errors = 0, total_tests = 0, total_skipped = 0;
266 #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && \
267 !defined(TEST_SUITE_MEMORY_BUFFER_ALLOC)
268 unsigned char alloc_buf[1000000];
269 mbedtls_memory_buffer_alloc_init( alloc_buf, sizeof(alloc_buf) );
273 * The C standard doesn't guarantee that all-bits-0 is the representation
274 * of a NULL pointer. We do however use that in our code for initializing
275 * structures, which should work on every modern platform. Let's be sure.
277 memset( &pointer, 0, sizeof( void * ) );
278 if( pointer != NULL )
280 mbedtls_fprintf( stderr, "all-bits-zero is not a NULL pointer\n" );
285 * Make sure we have a snprintf that correctly zero-terminates
287 if( run_test_snprintf() != 0 )
289 mbedtls_fprintf( stderr, "the snprintf implementation is broken\n" );
293 while( arg_index < argc)
295 next_arg = argv[ arg_index ];
297 if( strcmp(next_arg, "--verbose" ) == 0 ||
298 strcmp(next_arg, "-v" ) == 0 )
302 else if( strcmp(next_arg, "--help" ) == 0 ||
303 strcmp(next_arg, "-h" ) == 0 )
305 mbedtls_fprintf( stdout, USAGE );
306 mbedtls_exit( EXIT_SUCCESS );
310 /* Not an option, therefore treat all further arguments as the file
313 test_files = &argv[ arg_index ];
314 testfile_count = argc - arg_index;
320 /* If no files were specified, assume a default */
321 if ( test_files == NULL || testfile_count == 0 )
323 test_files = &default_filename;
327 /* Now begin to execute the tests in the testfiles */
328 for ( testfile_index = 0;
329 testfile_index < testfile_count;
332 int unmet_dep_count = 0;
333 char *unmet_dependencies[20];
335 test_filename = test_files[ testfile_index ];
337 file = fopen( test_filename, "r" );
340 mbedtls_fprintf( stderr, "Failed to open test file: %s\n",
345 while( !feof( file ) )
347 if( unmet_dep_count > 0 )
349 mbedtls_fprintf( stderr,
350 "FATAL: Dep count larger than zero at start of loop\n" );
351 mbedtls_exit( MBEDTLS_EXIT_FAILURE );
355 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
357 mbedtls_fprintf( stdout, "%s%.66s", test_errors ? "\n" : "", buf );
358 mbedtls_fprintf( stdout, " " );
359 for( i = strlen( buf ) + 1; i < 67; i++ )
360 mbedtls_fprintf( stdout, "." );
361 mbedtls_fprintf( stdout, " " );
366 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
368 cnt = parse_arguments( buf, strlen(buf), params );
370 if( strcmp( params[0], "depends_on" ) == 0 )
372 for( i = 1; i < cnt; i++ )
374 if( dep_check( params[i] ) != DEPENDENCY_SUPPORTED )
376 if( 0 == option_verbose )
378 /* Only one count is needed if not verbose */
383 unmet_dependencies[ unmet_dep_count ] = strdup(params[i]);
384 if( unmet_dependencies[ unmet_dep_count ] == NULL )
386 mbedtls_fprintf( stderr, "FATAL: Out of memory\n" );
387 mbedtls_exit( MBEDTLS_EXIT_FAILURE );
393 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
395 cnt = parse_arguments( buf, strlen(buf), params );
398 // If there are no unmet dependencies execute the test
399 if( unmet_dep_count == 0 )
403 #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
404 /* Suppress all output from the library unless we're verbose
407 if( !option_verbose )
409 stdout_fd = redirect_output( &stdout, "/dev/null" );
410 if( stdout_fd == -1 )
412 /* Redirection has failed with no stdout so exit */
416 #endif /* __unix__ || __APPLE__ __MACH__ */
418 ret = dispatch_test( cnt, params );
420 #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
421 if( !option_verbose && restore_output( &stdout, stdout_fd ) )
423 /* Redirection has failed with no stdout so exit */
426 #endif /* __unix__ || __APPLE__ __MACH__ */
430 if( unmet_dep_count > 0 || ret == DISPATCH_UNSUPPORTED_SUITE )
433 mbedtls_fprintf( stdout, "----\n" );
435 if( 1 == option_verbose && ret == DISPATCH_UNSUPPORTED_SUITE )
437 mbedtls_fprintf( stdout, " Test Suite not enabled" );
440 if( 1 == option_verbose && unmet_dep_count > 0 )
442 mbedtls_fprintf( stdout, " Unmet dependencies: " );
443 for( i = 0; i < unmet_dep_count; i++ )
445 mbedtls_fprintf(stdout, "%s ",
446 unmet_dependencies[i]);
447 free(unmet_dependencies[i]);
449 mbedtls_fprintf( stdout, "\n" );
455 else if( ret == DISPATCH_TEST_SUCCESS && test_errors == 0 )
457 mbedtls_fprintf( stdout, "PASS\n" );
460 else if( ret == DISPATCH_INVALID_TEST_DATA )
462 mbedtls_fprintf( stderr, "FAILED: FATAL PARSE ERROR\n" );
469 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
471 if( strlen(buf) != 0 )
473 mbedtls_fprintf( stderr, "Should be empty %d\n",
480 /* In case we encounter early end of file */
481 for( i = 0; i < unmet_dep_count; i++ )
482 free( unmet_dependencies[i] );
485 mbedtls_fprintf( stdout, "\n----------------------------------------------------------------------------\n\n");
486 if( total_errors == 0 )
487 mbedtls_fprintf( stdout, "PASSED" );
489 mbedtls_fprintf( stdout, "FAILED" );
491 mbedtls_fprintf( stdout, " (%d / %d tests (%d skipped))\n",
492 total_tests - total_errors, total_tests, total_skipped );
494 #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && \
495 !defined(TEST_SUITE_MEMORY_BUFFER_ALLOC)
496 #if defined(MBEDTLS_MEMORY_DEBUG)
497 mbedtls_memory_buffer_alloc_status();
499 mbedtls_memory_buffer_alloc_free();
502 #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
503 if( stdout_fd != -1 )
504 close_output( stdout );
505 #endif /* __unix__ || __APPLE__ __MACH__ */
507 return( total_errors != 0 );