blob: 4a5e1041d91cf67949a194854f909441c75f0a3f [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
Rich Evans3d536ba2015-01-14 18:58:11 +00008#define polarssl_fprintf fprintf
Paul Bakker16300582014-04-11 13:28:43 +02009#define polarssl_malloc malloc
10#define polarssl_free free
11#endif
12
Manuel Pégourié-Gonnard0ac1d2d2015-01-26 14:58:04 +010013#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C)
14#include "polarssl/memory_buffer_alloc.h"
15#endif
16
Paul Bakker19343182013-08-16 13:31:10 +020017static int test_errors = 0;
18
Paul Bakkerde56ca12013-09-15 17:05:21 +020019SUITE_PRE_DEP
20#define TEST_SUITE_ACTIVE
21
Paul Bakker8fc30b12013-11-25 13:29:43 +010022static int test_assert( int correct, const char *test )
Paul Bakker19343182013-08-16 13:31:10 +020023{
24 if( correct )
25 return( 0 );
26
27 test_errors++;
Paul Bakker55a7e902013-08-19 14:02:10 +020028 if( test_errors == 1 )
Rich Evans3d536ba2015-01-14 18:58:11 +000029 polarssl_printf( "FAILED\n" );
30 polarssl_printf( " %s\n", test );
Paul Bakker19343182013-08-16 13:31:10 +020031
32 return( 1 );
33}
34
Paul Bakkerbb20f4b2013-08-20 12:41:33 +020035#define TEST_ASSERT( TEST ) \
36 do { test_assert( (TEST) ? 1 : 0, #TEST ); \
Paul Bakker318d0fe2014-07-10 14:59:25 +020037 if( test_errors) goto exit; \
Paul Bakkerbb20f4b2013-08-20 12:41:33 +020038 } while (0)
Paul Bakker19343182013-08-16 13:31:10 +020039
40int verify_string( char **str )
41{
42 if( (*str)[0] != '"' ||
43 (*str)[strlen( *str ) - 1] != '"' )
44 {
Rich Evans3d536ba2015-01-14 18:58:11 +000045 polarssl_printf( "Expected string (with \"\") for parameter and got: %s\n", *str );
Paul Bakker19343182013-08-16 13:31:10 +020046 return( -1 );
47 }
48
49 (*str)++;
50 (*str)[strlen( *str ) - 1] = '\0';
51
52 return( 0 );
53}
54
55int verify_int( char *str, int *value )
56{
57 size_t i;
58 int minus = 0;
59 int digits = 1;
60 int hex = 0;
61
62 for( i = 0; i < strlen( str ); i++ )
63 {
64 if( i == 0 && str[i] == '-' )
65 {
66 minus = 1;
67 continue;
68 }
69
70 if( ( ( minus && i == 2 ) || ( !minus && i == 1 ) ) &&
71 str[i - 1] == '0' && str[i] == 'x' )
72 {
73 hex = 1;
74 continue;
75 }
76
Manuel Pégourié-Gonnard725afd82014-02-01 11:54:28 +010077 if( ! ( ( str[i] >= '0' && str[i] <= '9' ) ||
78 ( hex && ( ( str[i] >= 'a' && str[i] <= 'f' ) ||
79 ( str[i] >= 'A' && str[i] <= 'F' ) ) ) ) )
Paul Bakker19343182013-08-16 13:31:10 +020080 {
81 digits = 0;
82 break;
83 }
84 }
85
86 if( digits )
87 {
88 if( hex )
89 *value = strtol( str, NULL, 16 );
90 else
91 *value = strtol( str, NULL, 10 );
92
93 return( 0 );
94 }
95
96MAPPING_CODE
97
Rich Evans3d536ba2015-01-14 18:58:11 +000098 polarssl_printf( "Expected integer for parameter and got: %s\n", str );
Paul Bakker19343182013-08-16 13:31:10 +020099 return( -1 );
100}
101
Paul Bakkerde56ca12013-09-15 17:05:21 +0200102FUNCTION_CODE
103SUITE_POST_DEP
104
Paul Bakker19343182013-08-16 13:31:10 +0200105int dep_check( char *str )
106{
107 if( str == NULL )
108 return( 1 );
109
110DEP_CHECK_CODE
111
112 return( 1 );
113}
114
Paul Bakker19343182013-08-16 13:31:10 +0200115int dispatch_test(int cnt, char *params[50])
116{
117 int ret;
Paul Bakkerb34fef22013-08-20 12:06:33 +0200118 ((void) cnt);
119 ((void) params);
Paul Bakker19343182013-08-16 13:31:10 +0200120
Paul Bakkerb34fef22013-08-20 12:06:33 +0200121#if defined(TEST_SUITE_ACTIVE)
Paul Bakker19343182013-08-16 13:31:10 +0200122DISPATCH_FUNCTION
123 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000124 polarssl_fprintf( stdout, "FAILED\nSkipping unknown test function '%s'\n", params[0] );
Paul Bakker19343182013-08-16 13:31:10 +0200125 fflush( stdout );
126 return( 1 );
127 }
Paul Bakkerb34fef22013-08-20 12:06:33 +0200128#else
129 return( 3 );
130#endif
Paul Bakker19343182013-08-16 13:31:10 +0200131 return( ret );
132}
133
134int get_line( FILE *f, char *buf, size_t len )
135{
136 char *ret;
137
138 ret = fgets( buf, len, f );
139 if( ret == NULL )
140 return( -1 );
141
142 if( strlen( buf ) && buf[strlen(buf) - 1] == '\n' )
143 buf[strlen(buf) - 1] = '\0';
144 if( strlen( buf ) && buf[strlen(buf) - 1] == '\r' )
145 buf[strlen(buf) - 1] = '\0';
146
147 return( 0 );
148}
149
150int parse_arguments( char *buf, size_t len, char *params[50] )
151{
152 int cnt = 0, i;
153 char *cur = buf;
154 char *p = buf, *q;
155
156 params[cnt++] = cur;
157
158 while( *p != '\0' && p < buf + len )
159 {
160 if( *p == '\\' )
161 {
Manuel Pégourié-Gonnard2d5f1422014-01-22 16:01:17 +0100162 p++;
163 p++;
Paul Bakker19343182013-08-16 13:31:10 +0200164 continue;
165 }
166 if( *p == ':' )
167 {
168 if( p + 1 < buf + len )
169 {
170 cur = p + 1;
171 params[cnt++] = cur;
172 }
173 *p = '\0';
174 }
175
Manuel Pégourié-Gonnard2d5f1422014-01-22 16:01:17 +0100176 p++;
Paul Bakker19343182013-08-16 13:31:10 +0200177 }
178
179 // Replace newlines, question marks and colons in strings
180 for( i = 0; i < cnt; i++ )
181 {
182 p = params[i];
183 q = params[i];
184
185 while( *p != '\0' )
186 {
187 if( *p == '\\' && *(p + 1) == 'n' )
188 {
189 p += 2;
190 *(q++) = '\n';
191 }
192 else if( *p == '\\' && *(p + 1) == ':' )
193 {
194 p += 2;
195 *(q++) = ':';
196 }
197 else if( *p == '\\' && *(p + 1) == '?' )
198 {
199 p += 2;
200 *(q++) = '?';
201 }
202 else
203 *(q++) = *(p++);
204 }
205 *q = '\0';
206 }
207
208 return( cnt );
209}
210
211int main()
212{
213 int ret, i, cnt, total_errors = 0, total_tests = 0, total_skipped = 0;
214 const char *filename = "TEST_FILENAME";
215 FILE *file;
216 char buf[5000];
217 char *params[50];
218
Manuel Pégourié-Gonnard765bb312014-11-27 11:55:27 +0100219#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && \
220 !defined(TEST_SUITE_MEMORY_BUFFER_ALLOC)
Paul Bakker1337aff2013-09-29 14:45:34 +0200221 unsigned char alloc_buf[1000000];
222 memory_buffer_alloc_init( alloc_buf, sizeof(alloc_buf) );
Paul Bakker19343182013-08-16 13:31:10 +0200223#endif
224
225 file = fopen( filename, "r" );
226 if( file == NULL )
227 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000228 polarssl_fprintf( stderr, "Failed to open\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200229 return( 1 );
230 }
231
232 while( !feof( file ) )
233 {
234 int skip = 0;
235
236 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
237 break;
Rich Evans3d536ba2015-01-14 18:58:11 +0000238 polarssl_fprintf( stdout, "%s%.66s", test_errors ? "\n" : "", buf );
239 polarssl_fprintf( stdout, " " );
Paul Bakker19343182013-08-16 13:31:10 +0200240 for( i = strlen( buf ) + 1; i < 67; i++ )
Rich Evans3d536ba2015-01-14 18:58:11 +0000241 polarssl_fprintf( stdout, "." );
242 polarssl_fprintf( stdout, " " );
Paul Bakker19343182013-08-16 13:31:10 +0200243 fflush( stdout );
244
245 total_tests++;
246
247 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
248 break;
249 cnt = parse_arguments( buf, strlen(buf), params );
250
251 if( strcmp( params[0], "depends_on" ) == 0 )
252 {
253 for( i = 1; i < cnt; i++ )
254 if( dep_check( params[i] ) != 0 )
255 skip = 1;
256
257 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
258 break;
259 cnt = parse_arguments( buf, strlen(buf), params );
260 }
261
262 if( skip == 0 )
263 {
264 test_errors = 0;
265 ret = dispatch_test( cnt, params );
266 }
267
268 if( skip == 1 || ret == 3 )
269 {
270 total_skipped++;
Rich Evans3d536ba2015-01-14 18:58:11 +0000271 polarssl_fprintf( stdout, "----\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200272 fflush( stdout );
273 }
Paul Bakker33b43f12013-08-20 11:48:36 +0200274 else if( ret == 0 && test_errors == 0 )
Paul Bakker19343182013-08-16 13:31:10 +0200275 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000276 polarssl_fprintf( stdout, "PASS\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200277 fflush( stdout );
278 }
279 else if( ret == 2 )
280 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000281 polarssl_fprintf( stderr, "FAILED: FATAL PARSE ERROR\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200282 fclose(file);
283 exit( 2 );
284 }
285 else
286 total_errors++;
287
288 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
289 break;
290 if( strlen(buf) != 0 )
291 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000292 polarssl_fprintf( stderr, "Should be empty %d\n", (int) strlen(buf) );
Paul Bakker19343182013-08-16 13:31:10 +0200293 return( 1 );
294 }
295 }
296 fclose(file);
297
Rich Evans3d536ba2015-01-14 18:58:11 +0000298 polarssl_fprintf( stdout, "\n----------------------------------------------------------------------------\n\n");
Paul Bakker19343182013-08-16 13:31:10 +0200299 if( total_errors == 0 )
Rich Evans3d536ba2015-01-14 18:58:11 +0000300 polarssl_fprintf( stdout, "PASSED" );
Paul Bakker19343182013-08-16 13:31:10 +0200301 else
Rich Evans3d536ba2015-01-14 18:58:11 +0000302 polarssl_fprintf( stdout, "FAILED" );
Paul Bakker19343182013-08-16 13:31:10 +0200303
Rich Evans3d536ba2015-01-14 18:58:11 +0000304 polarssl_fprintf( stdout, " (%d / %d tests (%d skipped))\n",
Paul Bakker19343182013-08-16 13:31:10 +0200305 total_tests - total_errors, total_tests, total_skipped );
306
Manuel Pégourié-Gonnard765bb312014-11-27 11:55:27 +0100307#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && \
308 !defined(TEST_SUITE_MEMORY_BUFFER_ALLOC)
Paul Bakker1337aff2013-09-29 14:45:34 +0200309#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker19343182013-08-16 13:31:10 +0200310 memory_buffer_alloc_status();
311#endif
Paul Bakker1337aff2013-09-29 14:45:34 +0200312 memory_buffer_alloc_free();
313#endif
Paul Bakker19343182013-08-16 13:31:10 +0200314
315 return( total_errors != 0 );
316}
317