blob: 9ebd9c3db7f34538a5b05c9851fe8c020127d542 [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
Manuel Pégourié-Gonnard0ac1d2d2015-01-26 14:58:04 +010012#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C)
13#include "polarssl/memory_buffer_alloc.h"
14#endif
15
Paul Bakker19343182013-08-16 13:31:10 +020016static int test_errors = 0;
17
Paul Bakkerde56ca12013-09-15 17:05:21 +020018SUITE_PRE_DEP
19#define TEST_SUITE_ACTIVE
20
Paul Bakker8fc30b12013-11-25 13:29:43 +010021static int test_assert( int correct, const char *test )
Paul Bakker19343182013-08-16 13:31:10 +020022{
23 if( correct )
24 return( 0 );
25
26 test_errors++;
Paul Bakker55a7e902013-08-19 14:02:10 +020027 if( test_errors == 1 )
28 printf( "FAILED\n" );
29 printf( " %s\n", test );
Paul Bakker19343182013-08-16 13:31:10 +020030
31 return( 1 );
32}
33
Paul Bakkerbb20f4b2013-08-20 12:41:33 +020034#define TEST_ASSERT( TEST ) \
35 do { test_assert( (TEST) ? 1 : 0, #TEST ); \
Paul Bakker318d0fe2014-07-10 14:59:25 +020036 if( test_errors) goto exit; \
Paul Bakkerbb20f4b2013-08-20 12:41:33 +020037 } while (0)
Paul Bakker19343182013-08-16 13:31:10 +020038
39int verify_string( char **str )
40{
41 if( (*str)[0] != '"' ||
42 (*str)[strlen( *str ) - 1] != '"' )
43 {
44 printf( "Expected string (with \"\") for parameter and got: %s\n", *str );
45 return( -1 );
46 }
47
48 (*str)++;
49 (*str)[strlen( *str ) - 1] = '\0';
50
51 return( 0 );
52}
53
54int verify_int( char *str, int *value )
55{
56 size_t i;
57 int minus = 0;
58 int digits = 1;
59 int hex = 0;
60
61 for( i = 0; i < strlen( str ); i++ )
62 {
63 if( i == 0 && str[i] == '-' )
64 {
65 minus = 1;
66 continue;
67 }
68
69 if( ( ( minus && i == 2 ) || ( !minus && i == 1 ) ) &&
70 str[i - 1] == '0' && str[i] == 'x' )
71 {
72 hex = 1;
73 continue;
74 }
75
Manuel Pégourié-Gonnard725afd82014-02-01 11:54:28 +010076 if( ! ( ( str[i] >= '0' && str[i] <= '9' ) ||
77 ( hex && ( ( str[i] >= 'a' && str[i] <= 'f' ) ||
78 ( str[i] >= 'A' && str[i] <= 'F' ) ) ) ) )
Paul Bakker19343182013-08-16 13:31:10 +020079 {
80 digits = 0;
81 break;
82 }
83 }
84
85 if( digits )
86 {
87 if( hex )
88 *value = strtol( str, NULL, 16 );
89 else
90 *value = strtol( str, NULL, 10 );
91
92 return( 0 );
93 }
94
95MAPPING_CODE
96
97 printf( "Expected integer for parameter and got: %s\n", str );
98 return( -1 );
99}
100
Paul Bakkerde56ca12013-09-15 17:05:21 +0200101FUNCTION_CODE
102SUITE_POST_DEP
103
Paul Bakker19343182013-08-16 13:31:10 +0200104int dep_check( char *str )
105{
106 if( str == NULL )
107 return( 1 );
108
109DEP_CHECK_CODE
110
111 return( 1 );
112}
113
Paul Bakker19343182013-08-16 13:31:10 +0200114int dispatch_test(int cnt, char *params[50])
115{
116 int ret;
Paul Bakkerb34fef22013-08-20 12:06:33 +0200117 ((void) cnt);
118 ((void) params);
Paul Bakker19343182013-08-16 13:31:10 +0200119
Paul Bakkerb34fef22013-08-20 12:06:33 +0200120#if defined(TEST_SUITE_ACTIVE)
Paul Bakker19343182013-08-16 13:31:10 +0200121DISPATCH_FUNCTION
122 {
123 fprintf( stdout, "FAILED\nSkipping unknown test function '%s'\n", params[0] );
124 fflush( stdout );
125 return( 1 );
126 }
Paul Bakkerb34fef22013-08-20 12:06:33 +0200127#else
128 return( 3 );
129#endif
Paul Bakker19343182013-08-16 13:31:10 +0200130 return( ret );
131}
132
133int get_line( FILE *f, char *buf, size_t len )
134{
135 char *ret;
136
137 ret = fgets( buf, len, f );
138 if( ret == NULL )
139 return( -1 );
140
141 if( strlen( buf ) && buf[strlen(buf) - 1] == '\n' )
142 buf[strlen(buf) - 1] = '\0';
143 if( strlen( buf ) && buf[strlen(buf) - 1] == '\r' )
144 buf[strlen(buf) - 1] = '\0';
145
146 return( 0 );
147}
148
149int parse_arguments( char *buf, size_t len, char *params[50] )
150{
151 int cnt = 0, i;
152 char *cur = buf;
153 char *p = buf, *q;
154
155 params[cnt++] = cur;
156
157 while( *p != '\0' && p < buf + len )
158 {
159 if( *p == '\\' )
160 {
Manuel Pégourié-Gonnard2d5f1422014-01-22 16:01:17 +0100161 p++;
162 p++;
Paul Bakker19343182013-08-16 13:31:10 +0200163 continue;
164 }
165 if( *p == ':' )
166 {
167 if( p + 1 < buf + len )
168 {
169 cur = p + 1;
170 params[cnt++] = cur;
171 }
172 *p = '\0';
173 }
174
Manuel Pégourié-Gonnard2d5f1422014-01-22 16:01:17 +0100175 p++;
Paul Bakker19343182013-08-16 13:31:10 +0200176 }
177
178 // Replace newlines, question marks and colons in strings
179 for( i = 0; i < cnt; i++ )
180 {
181 p = params[i];
182 q = params[i];
183
184 while( *p != '\0' )
185 {
186 if( *p == '\\' && *(p + 1) == 'n' )
187 {
188 p += 2;
189 *(q++) = '\n';
190 }
191 else if( *p == '\\' && *(p + 1) == ':' )
192 {
193 p += 2;
194 *(q++) = ':';
195 }
196 else if( *p == '\\' && *(p + 1) == '?' )
197 {
198 p += 2;
199 *(q++) = '?';
200 }
201 else
202 *(q++) = *(p++);
203 }
204 *q = '\0';
205 }
206
207 return( cnt );
208}
209
210int main()
211{
212 int ret, i, cnt, total_errors = 0, total_tests = 0, total_skipped = 0;
213 const char *filename = "TEST_FILENAME";
214 FILE *file;
215 char buf[5000];
216 char *params[50];
217
Manuel Pégourié-Gonnard765bb312014-11-27 11:55:27 +0100218#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && \
219 !defined(TEST_SUITE_MEMORY_BUFFER_ALLOC)
Paul Bakker1337aff2013-09-29 14:45:34 +0200220 unsigned char alloc_buf[1000000];
221 memory_buffer_alloc_init( alloc_buf, sizeof(alloc_buf) );
Paul Bakker19343182013-08-16 13:31:10 +0200222#endif
223
224 file = fopen( filename, "r" );
225 if( file == NULL )
226 {
227 fprintf( stderr, "Failed to open\n" );
228 return( 1 );
229 }
230
231 while( !feof( file ) )
232 {
233 int skip = 0;
234
235 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
236 break;
Paul Bakker55a7e902013-08-19 14:02:10 +0200237 fprintf( stdout, "%s%.66s", test_errors ? "\n" : "", buf );
Paul Bakker19343182013-08-16 13:31:10 +0200238 fprintf( stdout, " " );
239 for( i = strlen( buf ) + 1; i < 67; i++ )
240 fprintf( stdout, "." );
241 fprintf( stdout, " " );
242 fflush( stdout );
243
244 total_tests++;
245
246 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
247 break;
248 cnt = parse_arguments( buf, strlen(buf), params );
249
250 if( strcmp( params[0], "depends_on" ) == 0 )
251 {
252 for( i = 1; i < cnt; i++ )
253 if( dep_check( params[i] ) != 0 )
254 skip = 1;
255
256 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
257 break;
258 cnt = parse_arguments( buf, strlen(buf), params );
259 }
260
261 if( skip == 0 )
262 {
263 test_errors = 0;
264 ret = dispatch_test( cnt, params );
265 }
266
267 if( skip == 1 || ret == 3 )
268 {
269 total_skipped++;
Paul Bakkerb34fef22013-08-20 12:06:33 +0200270 fprintf( stdout, "----\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200271 fflush( stdout );
272 }
Paul Bakker33b43f12013-08-20 11:48:36 +0200273 else if( ret == 0 && test_errors == 0 )
Paul Bakker19343182013-08-16 13:31:10 +0200274 {
275 fprintf( stdout, "PASS\n" );
276 fflush( stdout );
277 }
278 else if( ret == 2 )
279 {
280 fprintf( stderr, "FAILED: FATAL PARSE ERROR\n" );
281 fclose(file);
282 exit( 2 );
283 }
284 else
285 total_errors++;
286
287 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
288 break;
289 if( strlen(buf) != 0 )
290 {
Paul Bakker55a7e902013-08-19 14:02:10 +0200291 fprintf( stderr, "Should be empty %d\n", (int) strlen(buf) );
Paul Bakker19343182013-08-16 13:31:10 +0200292 return( 1 );
293 }
294 }
295 fclose(file);
296
297 fprintf( stdout, "\n----------------------------------------------------------------------------\n\n");
298 if( total_errors == 0 )
299 fprintf( stdout, "PASSED" );
300 else
301 fprintf( stdout, "FAILED" );
302
303 fprintf( stdout, " (%d / %d tests (%d skipped))\n",
304 total_tests - total_errors, total_tests, total_skipped );
305
Manuel Pégourié-Gonnard765bb312014-11-27 11:55:27 +0100306#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && \
307 !defined(TEST_SUITE_MEMORY_BUFFER_ALLOC)
Paul Bakker1337aff2013-09-29 14:45:34 +0200308#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker19343182013-08-16 13:31:10 +0200309 memory_buffer_alloc_status();
310#endif
Paul Bakker1337aff2013-09-29 14:45:34 +0200311 memory_buffer_alloc_free();
312#endif
Paul Bakker19343182013-08-16 13:31:10 +0200313
314 return( total_errors != 0 );
315}
316