blob: fae56f42521c25125d185754cab6633115312011 [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
Manuel Pégourié-Gonnard765bb312014-11-27 11:55:27 +0100214#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && \
215 !defined(TEST_SUITE_MEMORY_BUFFER_ALLOC)
Paul Bakker1337aff2013-09-29 14:45:34 +0200216 unsigned char alloc_buf[1000000];
217 memory_buffer_alloc_init( alloc_buf, sizeof(alloc_buf) );
Paul Bakker19343182013-08-16 13:31:10 +0200218#endif
219
220 file = fopen( filename, "r" );
221 if( file == NULL )
222 {
223 fprintf( stderr, "Failed to open\n" );
224 return( 1 );
225 }
226
227 while( !feof( file ) )
228 {
229 int skip = 0;
230
231 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
232 break;
Paul Bakker55a7e902013-08-19 14:02:10 +0200233 fprintf( stdout, "%s%.66s", test_errors ? "\n" : "", buf );
Paul Bakker19343182013-08-16 13:31:10 +0200234 fprintf( stdout, " " );
235 for( i = strlen( buf ) + 1; i < 67; i++ )
236 fprintf( stdout, "." );
237 fprintf( stdout, " " );
238 fflush( stdout );
239
240 total_tests++;
241
242 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
243 break;
244 cnt = parse_arguments( buf, strlen(buf), params );
245
246 if( strcmp( params[0], "depends_on" ) == 0 )
247 {
248 for( i = 1; i < cnt; i++ )
249 if( dep_check( params[i] ) != 0 )
250 skip = 1;
251
252 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
253 break;
254 cnt = parse_arguments( buf, strlen(buf), params );
255 }
256
257 if( skip == 0 )
258 {
259 test_errors = 0;
260 ret = dispatch_test( cnt, params );
261 }
262
263 if( skip == 1 || ret == 3 )
264 {
265 total_skipped++;
Paul Bakkerb34fef22013-08-20 12:06:33 +0200266 fprintf( stdout, "----\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200267 fflush( stdout );
268 }
Paul Bakker33b43f12013-08-20 11:48:36 +0200269 else if( ret == 0 && test_errors == 0 )
Paul Bakker19343182013-08-16 13:31:10 +0200270 {
271 fprintf( stdout, "PASS\n" );
272 fflush( stdout );
273 }
274 else if( ret == 2 )
275 {
276 fprintf( stderr, "FAILED: FATAL PARSE ERROR\n" );
277 fclose(file);
278 exit( 2 );
279 }
280 else
281 total_errors++;
282
283 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
284 break;
285 if( strlen(buf) != 0 )
286 {
Paul Bakker55a7e902013-08-19 14:02:10 +0200287 fprintf( stderr, "Should be empty %d\n", (int) strlen(buf) );
Paul Bakker19343182013-08-16 13:31:10 +0200288 return( 1 );
289 }
290 }
291 fclose(file);
292
293 fprintf( stdout, "\n----------------------------------------------------------------------------\n\n");
294 if( total_errors == 0 )
295 fprintf( stdout, "PASSED" );
296 else
297 fprintf( stdout, "FAILED" );
298
299 fprintf( stdout, " (%d / %d tests (%d skipped))\n",
300 total_tests - total_errors, total_tests, total_skipped );
301
Manuel Pégourié-Gonnard765bb312014-11-27 11:55:27 +0100302#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && \
303 !defined(TEST_SUITE_MEMORY_BUFFER_ALLOC)
Paul Bakker1337aff2013-09-29 14:45:34 +0200304#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker19343182013-08-16 13:31:10 +0200305 memory_buffer_alloc_status();
306#endif
Paul Bakker1337aff2013-09-29 14:45:34 +0200307 memory_buffer_alloc_free();
308#endif
Paul Bakker19343182013-08-16 13:31:10 +0200309
310 return( total_errors != 0 );
311}
312