300 lines
6.3 KiB
Text
300 lines
6.3 KiB
Text
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
static int test_errors = 0;
|
|
|
|
SUITE_PRE_DEP
|
|
#define TEST_SUITE_ACTIVE
|
|
|
|
static int test_assert( int correct, const 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 alloc_buf[1000000];
|
|
memory_buffer_alloc_init( alloc_buf, sizeof(alloc_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)
|
|
#if defined(POLARSSL_MEMORY_DEBUG)
|
|
memory_buffer_alloc_status();
|
|
#endif
|
|
memory_buffer_alloc_free();
|
|
#endif
|
|
|
|
return( total_errors != 0 );
|
|
}
|
|
|