| #include <stdio.h> |
| #include <string.h> |
| |
| static int test_errors = 0; |
| |
| SUITE_PRE_DEP |
| #define TEST_SUITE_ACTIVE |
| |
| static int test_assert( int correct, char *test ) |
| { |
| if( correct ) |
| return( 0 ); |
| |
| test_errors++; |
| if( test_errors == 1 ) |
| printf( "FAILED\n" ); |
| printf( " %s\n", test ); |
| |
| return( 1 ); |
| } |
| |
| #define TEST_ASSERT( TEST ) \ |
| do { test_assert( (TEST) ? 1 : 0, #TEST ); \ |
| if( test_errors) return; \ |
| } while (0) |
| |
| int verify_string( char **str ) |
| { |
| if( (*str)[0] != '"' || |
| (*str)[strlen( *str ) - 1] != '"' ) |
| { |
| printf( "Expected string (with \"\") for parameter and got: %s\n", *str ); |
| return( -1 ); |
| } |
| |
| (*str)++; |
| (*str)[strlen( *str ) - 1] = '\0'; |
| |
| return( 0 ); |
| } |
| |
| int verify_int( char *str, int *value ) |
| { |
| size_t i; |
| int minus = 0; |
| int digits = 1; |
| int hex = 0; |
| |
| for( i = 0; i < strlen( str ); i++ ) |
| { |
| if( i == 0 && str[i] == '-' ) |
| { |
| minus = 1; |
| continue; |
| } |
| |
| if( ( ( minus && i == 2 ) || ( !minus && i == 1 ) ) && |
| str[i - 1] == '0' && str[i] == 'x' ) |
| { |
| hex = 1; |
| continue; |
| } |
| |
| if( str[i] < '0' || str[i] > '9' ) |
| { |
| digits = 0; |
| break; |
| } |
| } |
| |
| if( digits ) |
| { |
| if( hex ) |
| *value = strtol( str, NULL, 16 ); |
| else |
| *value = strtol( str, NULL, 10 ); |
| |
| return( 0 ); |
| } |
| |
| MAPPING_CODE |
| |
| printf( "Expected integer for parameter and got: %s\n", str ); |
| return( -1 ); |
| } |
| |
| FUNCTION_CODE |
| SUITE_POST_DEP |
| |
| int dep_check( char *str ) |
| { |
| if( str == NULL ) |
| return( 1 ); |
| |
| DEP_CHECK_CODE |
| |
| return( 1 ); |
| } |
| |
| int dispatch_test(int cnt, char *params[50]) |
| { |
| int ret; |
| ((void) cnt); |
| ((void) params); |
| |
| #if defined(TEST_SUITE_ACTIVE) |
| DISPATCH_FUNCTION |
| { |
| fprintf( stdout, "FAILED\nSkipping unknown test function '%s'\n", params[0] ); |
| fflush( stdout ); |
| return( 1 ); |
| } |
| #else |
| return( 3 ); |
| #endif |
| return( ret ); |
| } |
| |
| int get_line( FILE *f, char *buf, size_t len ) |
| { |
| char *ret; |
| |
| ret = fgets( buf, len, f ); |
| if( ret == NULL ) |
| return( -1 ); |
| |
| if( strlen( buf ) && buf[strlen(buf) - 1] == '\n' ) |
| buf[strlen(buf) - 1] = '\0'; |
| if( strlen( buf ) && buf[strlen(buf) - 1] == '\r' ) |
| buf[strlen(buf) - 1] = '\0'; |
| |
| return( 0 ); |
| } |
| |
| int parse_arguments( char *buf, size_t len, char *params[50] ) |
| { |
| int cnt = 0, i; |
| char *cur = buf; |
| char *p = buf, *q; |
| |
| params[cnt++] = cur; |
| |
| while( *p != '\0' && p < buf + len ) |
| { |
| if( *p == '\\' ) |
| { |
| *p++; |
| *p++; |
| continue; |
| } |
| if( *p == ':' ) |
| { |
| if( p + 1 < buf + len ) |
| { |
| cur = p + 1; |
| params[cnt++] = cur; |
| } |
| *p = '\0'; |
| } |
| |
| *p++; |
| } |
| |
| // Replace newlines, question marks and colons in strings |
| for( i = 0; i < cnt; i++ ) |
| { |
| p = params[i]; |
| q = params[i]; |
| |
| while( *p != '\0' ) |
| { |
| if( *p == '\\' && *(p + 1) == 'n' ) |
| { |
| p += 2; |
| *(q++) = '\n'; |
| } |
| else if( *p == '\\' && *(p + 1) == ':' ) |
| { |
| p += 2; |
| *(q++) = ':'; |
| } |
| else if( *p == '\\' && *(p + 1) == '?' ) |
| { |
| p += 2; |
| *(q++) = '?'; |
| } |
| else |
| *(q++) = *(p++); |
| } |
| *q = '\0'; |
| } |
| |
| return( cnt ); |
| } |
| |
| int main() |
| { |
| int ret, i, cnt, total_errors = 0, total_tests = 0, total_skipped = 0; |
| const char *filename = "TEST_FILENAME"; |
| FILE *file; |
| char buf[5000]; |
| char *params[50]; |
| |
| #if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) |
| unsigned char buf[1000000]; |
| memory_buffer_alloc_init( buf, sizeof(buf) ); |
| #endif |
| |
| file = fopen( filename, "r" ); |
| if( file == NULL ) |
| { |
| fprintf( stderr, "Failed to open\n" ); |
| return( 1 ); |
| } |
| |
| while( !feof( file ) ) |
| { |
| int skip = 0; |
| |
| if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 ) |
| break; |
| fprintf( stdout, "%s%.66s", test_errors ? "\n" : "", buf ); |
| fprintf( stdout, " " ); |
| for( i = strlen( buf ) + 1; i < 67; i++ ) |
| fprintf( stdout, "." ); |
| fprintf( stdout, " " ); |
| fflush( stdout ); |
| |
| total_tests++; |
| |
| if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 ) |
| break; |
| cnt = parse_arguments( buf, strlen(buf), params ); |
| |
| if( strcmp( params[0], "depends_on" ) == 0 ) |
| { |
| for( i = 1; i < cnt; i++ ) |
| if( dep_check( params[i] ) != 0 ) |
| skip = 1; |
| |
| if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 ) |
| break; |
| cnt = parse_arguments( buf, strlen(buf), params ); |
| } |
| |
| if( skip == 0 ) |
| { |
| test_errors = 0; |
| ret = dispatch_test( cnt, params ); |
| } |
| |
| if( skip == 1 || ret == 3 ) |
| { |
| total_skipped++; |
| fprintf( stdout, "----\n" ); |
| fflush( stdout ); |
| } |
| else if( ret == 0 && test_errors == 0 ) |
| { |
| fprintf( stdout, "PASS\n" ); |
| fflush( stdout ); |
| } |
| else if( ret == 2 ) |
| { |
| fprintf( stderr, "FAILED: FATAL PARSE ERROR\n" ); |
| fclose(file); |
| exit( 2 ); |
| } |
| else |
| total_errors++; |
| |
| if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 ) |
| break; |
| if( strlen(buf) != 0 ) |
| { |
| fprintf( stderr, "Should be empty %d\n", (int) strlen(buf) ); |
| return( 1 ); |
| } |
| } |
| fclose(file); |
| |
| fprintf( stdout, "\n----------------------------------------------------------------------------\n\n"); |
| if( total_errors == 0 ) |
| fprintf( stdout, "PASSED" ); |
| else |
| fprintf( stdout, "FAILED" ); |
| |
| fprintf( stdout, " (%d / %d tests (%d skipped))\n", |
| total_tests - total_errors, total_tests, total_skipped ); |
| |
| #if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && defined(POLARSSL_MEMORY_DEBUG) |
| memory_buffer_alloc_status(); |
| #endif |
| |
| return( total_errors != 0 ); |
| } |
| |