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