blob: c64d9be8a5d6013b6319e5b33ad98629a1cdf55c [file] [log] [blame]
Paul Bakker19343182013-08-16 13:31:10 +02001#include <stdio.h>
2#include <string.h>
3
4static int test_errors = 0;
5
Paul Bakkerde56ca12013-09-15 17:05:21 +02006SUITE_PRE_DEP
7#define TEST_SUITE_ACTIVE
8
Paul Bakker19343182013-08-16 13:31:10 +02009static int test_assert( int correct, char *test )
10{
11 if( correct )
12 return( 0 );
13
14 test_errors++;
Paul Bakker55a7e902013-08-19 14:02:10 +020015 if( test_errors == 1 )
16 printf( "FAILED\n" );
17 printf( " %s\n", test );
Paul Bakker19343182013-08-16 13:31:10 +020018
19 return( 1 );
20}
21
Paul Bakkerbb20f4b2013-08-20 12:41:33 +020022#define TEST_ASSERT( TEST ) \
23 do { test_assert( (TEST) ? 1 : 0, #TEST ); \
24 if( test_errors) return; \
25 } while (0)
Paul Bakker19343182013-08-16 13:31:10 +020026
27int verify_string( char **str )
28{
29 if( (*str)[0] != '"' ||
30 (*str)[strlen( *str ) - 1] != '"' )
31 {
32 printf( "Expected string (with \"\") for parameter and got: %s\n", *str );
33 return( -1 );
34 }
35
36 (*str)++;
37 (*str)[strlen( *str ) - 1] = '\0';
38
39 return( 0 );
40}
41
42int verify_int( char *str, int *value )
43{
44 size_t i;
45 int minus = 0;
46 int digits = 1;
47 int hex = 0;
48
49 for( i = 0; i < strlen( str ); i++ )
50 {
51 if( i == 0 && str[i] == '-' )
52 {
53 minus = 1;
54 continue;
55 }
56
57 if( ( ( minus && i == 2 ) || ( !minus && i == 1 ) ) &&
58 str[i - 1] == '0' && str[i] == 'x' )
59 {
60 hex = 1;
61 continue;
62 }
63
64 if( str[i] < '0' || str[i] > '9' )
65 {
66 digits = 0;
67 break;
68 }
69 }
70
71 if( digits )
72 {
73 if( hex )
74 *value = strtol( str, NULL, 16 );
75 else
76 *value = strtol( str, NULL, 10 );
77
78 return( 0 );
79 }
80
81MAPPING_CODE
82
83 printf( "Expected integer for parameter and got: %s\n", str );
84 return( -1 );
85}
86
Paul Bakkerde56ca12013-09-15 17:05:21 +020087FUNCTION_CODE
88SUITE_POST_DEP
89
Paul Bakker19343182013-08-16 13:31:10 +020090int dep_check( char *str )
91{
92 if( str == NULL )
93 return( 1 );
94
95DEP_CHECK_CODE
96
97 return( 1 );
98}
99
Paul Bakker19343182013-08-16 13:31:10 +0200100int dispatch_test(int cnt, char *params[50])
101{
102 int ret;
Paul Bakkerb34fef22013-08-20 12:06:33 +0200103 ((void) cnt);
104 ((void) params);
Paul Bakker19343182013-08-16 13:31:10 +0200105
Paul Bakkerb34fef22013-08-20 12:06:33 +0200106#if defined(TEST_SUITE_ACTIVE)
Paul Bakker19343182013-08-16 13:31:10 +0200107DISPATCH_FUNCTION
108 {
109 fprintf( stdout, "FAILED\nSkipping unknown test function '%s'\n", params[0] );
110 fflush( stdout );
111 return( 1 );
112 }
Paul Bakkerb34fef22013-08-20 12:06:33 +0200113#else
114 return( 3 );
115#endif
Paul Bakker19343182013-08-16 13:31:10 +0200116 return( ret );
117}
118
119int get_line( FILE *f, char *buf, size_t len )
120{
121 char *ret;
122
123 ret = fgets( buf, len, f );
124 if( ret == NULL )
125 return( -1 );
126
127 if( strlen( buf ) && buf[strlen(buf) - 1] == '\n' )
128 buf[strlen(buf) - 1] = '\0';
129 if( strlen( buf ) && buf[strlen(buf) - 1] == '\r' )
130 buf[strlen(buf) - 1] = '\0';
131
132 return( 0 );
133}
134
135int parse_arguments( char *buf, size_t len, char *params[50] )
136{
137 int cnt = 0, i;
138 char *cur = buf;
139 char *p = buf, *q;
140
141 params[cnt++] = cur;
142
143 while( *p != '\0' && p < buf + len )
144 {
145 if( *p == '\\' )
146 {
147 *p++;
148 *p++;
149 continue;
150 }
151 if( *p == ':' )
152 {
153 if( p + 1 < buf + len )
154 {
155 cur = p + 1;
156 params[cnt++] = cur;
157 }
158 *p = '\0';
159 }
160
161 *p++;
162 }
163
164 // Replace newlines, question marks and colons in strings
165 for( i = 0; i < cnt; i++ )
166 {
167 p = params[i];
168 q = params[i];
169
170 while( *p != '\0' )
171 {
172 if( *p == '\\' && *(p + 1) == 'n' )
173 {
174 p += 2;
175 *(q++) = '\n';
176 }
177 else if( *p == '\\' && *(p + 1) == ':' )
178 {
179 p += 2;
180 *(q++) = ':';
181 }
182 else if( *p == '\\' && *(p + 1) == '?' )
183 {
184 p += 2;
185 *(q++) = '?';
186 }
187 else
188 *(q++) = *(p++);
189 }
190 *q = '\0';
191 }
192
193 return( cnt );
194}
195
196int main()
197{
198 int ret, i, cnt, total_errors = 0, total_tests = 0, total_skipped = 0;
199 const char *filename = "TEST_FILENAME";
200 FILE *file;
201 char buf[5000];
202 char *params[50];
203
204#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C)
Paul Bakker1337aff2013-09-29 14:45:34 +0200205 unsigned char alloc_buf[1000000];
206 memory_buffer_alloc_init( alloc_buf, sizeof(alloc_buf) );
Paul Bakker19343182013-08-16 13:31:10 +0200207#endif
208
209 file = fopen( filename, "r" );
210 if( file == NULL )
211 {
212 fprintf( stderr, "Failed to open\n" );
213 return( 1 );
214 }
215
216 while( !feof( file ) )
217 {
218 int skip = 0;
219
220 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
221 break;
Paul Bakker55a7e902013-08-19 14:02:10 +0200222 fprintf( stdout, "%s%.66s", test_errors ? "\n" : "", buf );
Paul Bakker19343182013-08-16 13:31:10 +0200223 fprintf( stdout, " " );
224 for( i = strlen( buf ) + 1; i < 67; i++ )
225 fprintf( stdout, "." );
226 fprintf( stdout, " " );
227 fflush( stdout );
228
229 total_tests++;
230
231 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
232 break;
233 cnt = parse_arguments( buf, strlen(buf), params );
234
235 if( strcmp( params[0], "depends_on" ) == 0 )
236 {
237 for( i = 1; i < cnt; i++ )
238 if( dep_check( params[i] ) != 0 )
239 skip = 1;
240
241 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
242 break;
243 cnt = parse_arguments( buf, strlen(buf), params );
244 }
245
246 if( skip == 0 )
247 {
248 test_errors = 0;
249 ret = dispatch_test( cnt, params );
250 }
251
252 if( skip == 1 || ret == 3 )
253 {
254 total_skipped++;
Paul Bakkerb34fef22013-08-20 12:06:33 +0200255 fprintf( stdout, "----\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200256 fflush( stdout );
257 }
Paul Bakker33b43f12013-08-20 11:48:36 +0200258 else if( ret == 0 && test_errors == 0 )
Paul Bakker19343182013-08-16 13:31:10 +0200259 {
260 fprintf( stdout, "PASS\n" );
261 fflush( stdout );
262 }
263 else if( ret == 2 )
264 {
265 fprintf( stderr, "FAILED: FATAL PARSE ERROR\n" );
266 fclose(file);
267 exit( 2 );
268 }
269 else
270 total_errors++;
271
272 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
273 break;
274 if( strlen(buf) != 0 )
275 {
Paul Bakker55a7e902013-08-19 14:02:10 +0200276 fprintf( stderr, "Should be empty %d\n", (int) strlen(buf) );
Paul Bakker19343182013-08-16 13:31:10 +0200277 return( 1 );
278 }
279 }
280 fclose(file);
281
282 fprintf( stdout, "\n----------------------------------------------------------------------------\n\n");
283 if( total_errors == 0 )
284 fprintf( stdout, "PASSED" );
285 else
286 fprintf( stdout, "FAILED" );
287
288 fprintf( stdout, " (%d / %d tests (%d skipped))\n",
289 total_tests - total_errors, total_tests, total_skipped );
290
Paul Bakker1337aff2013-09-29 14:45:34 +0200291#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C)
292#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker19343182013-08-16 13:31:10 +0200293 memory_buffer_alloc_status();
294#endif
Paul Bakker1337aff2013-09-29 14:45:34 +0200295 memory_buffer_alloc_free();
296#endif
Paul Bakker19343182013-08-16 13:31:10 +0200297
298 return( total_errors != 0 );
299}
300