Introduced own scripted test framework to replace fct.h and reduce
compile time
The new test framework generates a data file parsing engine plus the
templated function code. In order to 'understand' defines, during
the generation phase, a mapping is made to check for dependencies and
result code mappings.
diff --git a/tests/suites/helpers.function b/tests/suites/helpers.function
index 66af8af..881a0ac 100644
--- a/tests/suites/helpers.function
+++ b/tests/suites/helpers.function
@@ -9,6 +9,10 @@
#include <inttypes.h>
#endif
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
/*
* 32-bit integer manipulation macros (big endian)
*/
diff --git a/tests/suites/main_test.function b/tests/suites/main_test.function
new file mode 100644
index 0000000..ca2e252
--- /dev/null
+++ b/tests/suites/main_test.function
@@ -0,0 +1,283 @@
+#include <stdio.h>
+#include <string.h>
+
+static int test_errors = 0;
+
+static int test_assert( int correct, char *test )
+{
+ if( correct )
+ return( 0 );
+
+ test_errors++;
+// if( test_errors == 1 )
+ printf( "FAILED\n %s\n\n", test );
+
+ return( 1 );
+}
+
+#define TEST_ASSERT( TEST ) (test_assert((TEST) ? 1 : 0, #TEST))
+
+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 );
+}
+
+int dep_check( char *str )
+{
+ if( str == NULL )
+ return( 1 );
+
+DEP_CHECK_CODE
+
+ return( 1 );
+}
+
+FUNCTION_CODE
+int dispatch_test(int cnt, char *params[50])
+{
+ int ret;
+
+DISPATCH_FUNCTION
+ {
+ fprintf( stdout, "FAILED\nSkipping unknown test function '%s'\n", params[0] );
+ fflush( stdout );
+ return( 1 );
+ }
+
+ 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, "%.66s", 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", 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 );
+}
+