blob: 318ca9aedd1f88735b11aa4b4654acbf507a3aa2 [file] [log] [blame]
Paul Bakker19343182013-08-16 13:31:10 +02001#include <stdio.h>
2#include <string.h>
3
Paul Bakker16300582014-04-11 13:28:43 +02004#if defined(POLARSSL_PLATFORM_C)
5#include "polarssl/platform.h"
6#else
7#define polarssl_printf printf
8#define polarssl_malloc malloc
9#define polarssl_free free
10#endif
11
Paul Bakker19343182013-08-16 13:31:10 +020012static int test_errors = 0;
13
Paul Bakkerde56ca12013-09-15 17:05:21 +020014SUITE_PRE_DEP
15#define TEST_SUITE_ACTIVE
16
Paul Bakker8fc30b12013-11-25 13:29:43 +010017static int test_assert( int correct, const char *test )
Paul Bakker19343182013-08-16 13:31:10 +020018{
19 if( correct )
20 return( 0 );
21
22 test_errors++;
Paul Bakker55a7e902013-08-19 14:02:10 +020023 if( test_errors == 1 )
24 printf( "FAILED\n" );
25 printf( " %s\n", test );
Paul Bakker19343182013-08-16 13:31:10 +020026
27 return( 1 );
28}
29
Paul Bakkerbb20f4b2013-08-20 12:41:33 +020030#define TEST_ASSERT( TEST ) \
31 do { test_assert( (TEST) ? 1 : 0, #TEST ); \
Paul Bakker318d0fe2014-07-10 14:59:25 +020032 if( test_errors) goto exit; \
Paul Bakkerbb20f4b2013-08-20 12:41:33 +020033 } while (0)
Paul Bakker19343182013-08-16 13:31:10 +020034
35int verify_string( char **str )
36{
37 if( (*str)[0] != '"' ||
38 (*str)[strlen( *str ) - 1] != '"' )
39 {
40 printf( "Expected string (with \"\") for parameter and got: %s\n", *str );
41 return( -1 );
42 }
43
44 (*str)++;
45 (*str)[strlen( *str ) - 1] = '\0';
46
47 return( 0 );
48}
49
50int verify_int( char *str, int *value )
51{
52 size_t i;
53 int minus = 0;
54 int digits = 1;
55 int hex = 0;
56
57 for( i = 0; i < strlen( str ); i++ )
58 {
59 if( i == 0 && str[i] == '-' )
60 {
61 minus = 1;
62 continue;
63 }
64
65 if( ( ( minus && i == 2 ) || ( !minus && i == 1 ) ) &&
66 str[i - 1] == '0' && str[i] == 'x' )
67 {
68 hex = 1;
69 continue;
70 }
71
Manuel Pégourié-Gonnard725afd82014-02-01 11:54:28 +010072 if( ! ( ( str[i] >= '0' && str[i] <= '9' ) ||
73 ( hex && ( ( str[i] >= 'a' && str[i] <= 'f' ) ||
74 ( str[i] >= 'A' && str[i] <= 'F' ) ) ) ) )
Paul Bakker19343182013-08-16 13:31:10 +020075 {
76 digits = 0;
77 break;
78 }
79 }
80
81 if( digits )
82 {
83 if( hex )
84 *value = strtol( str, NULL, 16 );
85 else
86 *value = strtol( str, NULL, 10 );
87
88 return( 0 );
89 }
90
91MAPPING_CODE
92
93 printf( "Expected integer for parameter and got: %s\n", str );
94 return( -1 );
95}
96
Paul Bakkerde56ca12013-09-15 17:05:21 +020097FUNCTION_CODE
98SUITE_POST_DEP
99
Paul Bakker19343182013-08-16 13:31:10 +0200100int dep_check( char *str )
101{
102 if( str == NULL )
103 return( 1 );
104
105DEP_CHECK_CODE
106
107 return( 1 );
108}
109
Paul Bakker19343182013-08-16 13:31:10 +0200110int dispatch_test(int cnt, char *params[50])
111{
112 int ret;
Paul Bakkerb34fef22013-08-20 12:06:33 +0200113 ((void) cnt);
114 ((void) params);
Paul Bakker19343182013-08-16 13:31:10 +0200115
Paul Bakkerb34fef22013-08-20 12:06:33 +0200116#if defined(TEST_SUITE_ACTIVE)
Paul Bakker19343182013-08-16 13:31:10 +0200117DISPATCH_FUNCTION
118 {
119 fprintf( stdout, "FAILED\nSkipping unknown test function '%s'\n", params[0] );
120 fflush( stdout );
121 return( 1 );
122 }
Paul Bakkerb34fef22013-08-20 12:06:33 +0200123#else
124 return( 3 );
125#endif
Paul Bakker19343182013-08-16 13:31:10 +0200126 return( ret );
127}
128
129int get_line( FILE *f, char *buf, size_t len )
130{
131 char *ret;
132
133 ret = fgets( buf, len, f );
134 if( ret == NULL )
135 return( -1 );
136
137 if( strlen( buf ) && buf[strlen(buf) - 1] == '\n' )
138 buf[strlen(buf) - 1] = '\0';
139 if( strlen( buf ) && buf[strlen(buf) - 1] == '\r' )
140 buf[strlen(buf) - 1] = '\0';
141
142 return( 0 );
143}
144
145int parse_arguments( char *buf, size_t len, char *params[50] )
146{
147 int cnt = 0, i;
148 char *cur = buf;
149 char *p = buf, *q;
150
151 params[cnt++] = cur;
152
153 while( *p != '\0' && p < buf + len )
154 {
155 if( *p == '\\' )
156 {
Manuel Pégourié-Gonnard2d5f1422014-01-22 16:01:17 +0100157 p++;
158 p++;
Paul Bakker19343182013-08-16 13:31:10 +0200159 continue;
160 }
161 if( *p == ':' )
162 {
163 if( p + 1 < buf + len )
164 {
165 cur = p + 1;
166 params[cnt++] = cur;
167 }
168 *p = '\0';
169 }
170
Manuel Pégourié-Gonnard2d5f1422014-01-22 16:01:17 +0100171 p++;
Paul Bakker19343182013-08-16 13:31:10 +0200172 }
173
174 // Replace newlines, question marks and colons in strings
175 for( i = 0; i < cnt; i++ )
176 {
177 p = params[i];
178 q = params[i];
179
180 while( *p != '\0' )
181 {
182 if( *p == '\\' && *(p + 1) == 'n' )
183 {
184 p += 2;
185 *(q++) = '\n';
186 }
187 else if( *p == '\\' && *(p + 1) == ':' )
188 {
189 p += 2;
190 *(q++) = ':';
191 }
192 else if( *p == '\\' && *(p + 1) == '?' )
193 {
194 p += 2;
195 *(q++) = '?';
196 }
197 else
198 *(q++) = *(p++);
199 }
200 *q = '\0';
201 }
202
203 return( cnt );
204}
205
206int main()
207{
208 int ret, i, cnt, total_errors = 0, total_tests = 0, total_skipped = 0;
209 const char *filename = "TEST_FILENAME";
210 FILE *file;
211 char buf[5000];
212 char *params[50];
213
214#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C)
Paul Bakker1337aff2013-09-29 14:45:34 +0200215 unsigned char alloc_buf[1000000];
216 memory_buffer_alloc_init( alloc_buf, sizeof(alloc_buf) );
Paul Bakker19343182013-08-16 13:31:10 +0200217#endif
218
219 file = fopen( filename, "r" );
220 if( file == NULL )
221 {
222 fprintf( stderr, "Failed to open\n" );
223 return( 1 );
224 }
225
226 while( !feof( file ) )
227 {
228 int skip = 0;
229
230 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
231 break;
Paul Bakker55a7e902013-08-19 14:02:10 +0200232 fprintf( stdout, "%s%.66s", test_errors ? "\n" : "", buf );
Paul Bakker19343182013-08-16 13:31:10 +0200233 fprintf( stdout, " " );
234 for( i = strlen( buf ) + 1; i < 67; i++ )
235 fprintf( stdout, "." );
236 fprintf( stdout, " " );
237 fflush( stdout );
238
239 total_tests++;
240
241 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
242 break;
243 cnt = parse_arguments( buf, strlen(buf), params );
244
245 if( strcmp( params[0], "depends_on" ) == 0 )
246 {
247 for( i = 1; i < cnt; i++ )
248 if( dep_check( params[i] ) != 0 )
249 skip = 1;
250
251 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
252 break;
253 cnt = parse_arguments( buf, strlen(buf), params );
254 }
255
256 if( skip == 0 )
257 {
258 test_errors = 0;
259 ret = dispatch_test( cnt, params );
260 }
261
262 if( skip == 1 || ret == 3 )
263 {
264 total_skipped++;
Paul Bakkerb34fef22013-08-20 12:06:33 +0200265 fprintf( stdout, "----\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200266 fflush( stdout );
267 }
Paul Bakker33b43f12013-08-20 11:48:36 +0200268 else if( ret == 0 && test_errors == 0 )
Paul Bakker19343182013-08-16 13:31:10 +0200269 {
270 fprintf( stdout, "PASS\n" );
271 fflush( stdout );
272 }
273 else if( ret == 2 )
274 {
275 fprintf( stderr, "FAILED: FATAL PARSE ERROR\n" );
276 fclose(file);
277 exit( 2 );
278 }
279 else
280 total_errors++;
281
282 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
283 break;
284 if( strlen(buf) != 0 )
285 {
Paul Bakker55a7e902013-08-19 14:02:10 +0200286 fprintf( stderr, "Should be empty %d\n", (int) strlen(buf) );
Paul Bakker19343182013-08-16 13:31:10 +0200287 return( 1 );
288 }
289 }
290 fclose(file);
291
292 fprintf( stdout, "\n----------------------------------------------------------------------------\n\n");
293 if( total_errors == 0 )
294 fprintf( stdout, "PASSED" );
295 else
296 fprintf( stdout, "FAILED" );
297
298 fprintf( stdout, " (%d / %d tests (%d skipped))\n",
299 total_tests - total_errors, total_tests, total_skipped );
300
Paul Bakker1337aff2013-09-29 14:45:34 +0200301#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C)
302#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker19343182013-08-16 13:31:10 +0200303 memory_buffer_alloc_status();
304#endif
Paul Bakker1337aff2013-09-29 14:45:34 +0200305 memory_buffer_alloc_free();
306#endif
Paul Bakker19343182013-08-16 13:31:10 +0200307
308 return( total_errors != 0 );
309}
310