blob: 9d9ebe5f888b63900636f700d33d50449f3da524 [file] [log] [blame]
Manuel Pégourié-Gonnard0ac1d2d2015-01-26 14:58:04 +01001#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C)
2#include "polarssl/memory_buffer_alloc.h"
3#endif
4
Paul Bakker19343182013-08-16 13:31:10 +02005static int test_errors = 0;
6
Paul Bakkerde56ca12013-09-15 17:05:21 +02007SUITE_PRE_DEP
8#define TEST_SUITE_ACTIVE
9
Paul Bakker8fc30b12013-11-25 13:29:43 +010010static int test_assert( int correct, const char *test )
Paul Bakker19343182013-08-16 13:31:10 +020011{
12 if( correct )
13 return( 0 );
14
15 test_errors++;
Paul Bakker55a7e902013-08-19 14:02:10 +020016 if( test_errors == 1 )
Rich Evans3d536ba2015-01-14 18:58:11 +000017 polarssl_printf( "FAILED\n" );
18 polarssl_printf( " %s\n", test );
Paul Bakker19343182013-08-16 13:31:10 +020019
20 return( 1 );
21}
22
Paul Bakkerbb20f4b2013-08-20 12:41:33 +020023#define TEST_ASSERT( TEST ) \
24 do { test_assert( (TEST) ? 1 : 0, #TEST ); \
Paul Bakker318d0fe2014-07-10 14:59:25 +020025 if( test_errors) goto exit; \
Paul Bakkerbb20f4b2013-08-20 12:41:33 +020026 } while (0)
Paul Bakker19343182013-08-16 13:31:10 +020027
28int verify_string( char **str )
29{
30 if( (*str)[0] != '"' ||
31 (*str)[strlen( *str ) - 1] != '"' )
32 {
Rich Evans3d536ba2015-01-14 18:58:11 +000033 polarssl_printf( "Expected string (with \"\") for parameter and got: %s\n", *str );
Paul Bakker19343182013-08-16 13:31:10 +020034 return( -1 );
35 }
36
37 (*str)++;
38 (*str)[strlen( *str ) - 1] = '\0';
39
40 return( 0 );
41}
42
43int verify_int( char *str, int *value )
44{
45 size_t i;
46 int minus = 0;
47 int digits = 1;
48 int hex = 0;
49
50 for( i = 0; i < strlen( str ); i++ )
51 {
52 if( i == 0 && str[i] == '-' )
53 {
54 minus = 1;
55 continue;
56 }
57
58 if( ( ( minus && i == 2 ) || ( !minus && i == 1 ) ) &&
59 str[i - 1] == '0' && str[i] == 'x' )
60 {
61 hex = 1;
62 continue;
63 }
64
Manuel Pégourié-Gonnard725afd82014-02-01 11:54:28 +010065 if( ! ( ( str[i] >= '0' && str[i] <= '9' ) ||
66 ( hex && ( ( str[i] >= 'a' && str[i] <= 'f' ) ||
67 ( str[i] >= 'A' && str[i] <= 'F' ) ) ) ) )
Paul Bakker19343182013-08-16 13:31:10 +020068 {
69 digits = 0;
70 break;
71 }
72 }
73
74 if( digits )
75 {
76 if( hex )
77 *value = strtol( str, NULL, 16 );
78 else
79 *value = strtol( str, NULL, 10 );
80
81 return( 0 );
82 }
83
84MAPPING_CODE
85
Rich Evans3d536ba2015-01-14 18:58:11 +000086 polarssl_printf( "Expected integer for parameter and got: %s\n", str );
Paul Bakker19343182013-08-16 13:31:10 +020087 return( -1 );
88}
89
Paul Bakkerde56ca12013-09-15 17:05:21 +020090FUNCTION_CODE
91SUITE_POST_DEP
92
Paul Bakker19343182013-08-16 13:31:10 +020093int dep_check( char *str )
94{
95 if( str == NULL )
96 return( 1 );
97
98DEP_CHECK_CODE
99
100 return( 1 );
101}
102
Paul Bakker19343182013-08-16 13:31:10 +0200103int dispatch_test(int cnt, char *params[50])
104{
105 int ret;
Paul Bakkerb34fef22013-08-20 12:06:33 +0200106 ((void) cnt);
107 ((void) params);
Paul Bakker19343182013-08-16 13:31:10 +0200108
Paul Bakkerb34fef22013-08-20 12:06:33 +0200109#if defined(TEST_SUITE_ACTIVE)
Paul Bakker19343182013-08-16 13:31:10 +0200110DISPATCH_FUNCTION
111 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000112 polarssl_fprintf( stdout, "FAILED\nSkipping unknown test function '%s'\n", params[0] );
Paul Bakker19343182013-08-16 13:31:10 +0200113 fflush( stdout );
114 return( 1 );
115 }
Paul Bakkerb34fef22013-08-20 12:06:33 +0200116#else
117 return( 3 );
118#endif
Paul Bakker19343182013-08-16 13:31:10 +0200119 return( ret );
120}
121
122int get_line( FILE *f, char *buf, size_t len )
123{
124 char *ret;
125
126 ret = fgets( buf, len, f );
127 if( ret == NULL )
128 return( -1 );
129
130 if( strlen( buf ) && buf[strlen(buf) - 1] == '\n' )
131 buf[strlen(buf) - 1] = '\0';
132 if( strlen( buf ) && buf[strlen(buf) - 1] == '\r' )
133 buf[strlen(buf) - 1] = '\0';
134
135 return( 0 );
136}
137
138int parse_arguments( char *buf, size_t len, char *params[50] )
139{
140 int cnt = 0, i;
141 char *cur = buf;
142 char *p = buf, *q;
143
144 params[cnt++] = cur;
145
146 while( *p != '\0' && p < buf + len )
147 {
148 if( *p == '\\' )
149 {
Manuel Pégourié-Gonnard2d5f1422014-01-22 16:01:17 +0100150 p++;
151 p++;
Paul Bakker19343182013-08-16 13:31:10 +0200152 continue;
153 }
154 if( *p == ':' )
155 {
156 if( p + 1 < buf + len )
157 {
158 cur = p + 1;
159 params[cnt++] = cur;
160 }
161 *p = '\0';
162 }
163
Manuel Pégourié-Gonnard2d5f1422014-01-22 16:01:17 +0100164 p++;
Paul Bakker19343182013-08-16 13:31:10 +0200165 }
166
167 // Replace newlines, question marks and colons in strings
168 for( i = 0; i < cnt; i++ )
169 {
170 p = params[i];
171 q = params[i];
172
173 while( *p != '\0' )
174 {
175 if( *p == '\\' && *(p + 1) == 'n' )
176 {
177 p += 2;
178 *(q++) = '\n';
179 }
180 else if( *p == '\\' && *(p + 1) == ':' )
181 {
182 p += 2;
183 *(q++) = ':';
184 }
185 else if( *p == '\\' && *(p + 1) == '?' )
186 {
187 p += 2;
188 *(q++) = '?';
189 }
190 else
191 *(q++) = *(p++);
192 }
193 *q = '\0';
194 }
195
196 return( cnt );
197}
198
199int main()
200{
201 int ret, i, cnt, total_errors = 0, total_tests = 0, total_skipped = 0;
202 const char *filename = "TEST_FILENAME";
203 FILE *file;
204 char buf[5000];
205 char *params[50];
206
Manuel Pégourié-Gonnard765bb312014-11-27 11:55:27 +0100207#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && \
208 !defined(TEST_SUITE_MEMORY_BUFFER_ALLOC)
Paul Bakker1337aff2013-09-29 14:45:34 +0200209 unsigned char alloc_buf[1000000];
210 memory_buffer_alloc_init( alloc_buf, sizeof(alloc_buf) );
Paul Bakker19343182013-08-16 13:31:10 +0200211#endif
212
213 file = fopen( filename, "r" );
214 if( file == NULL )
215 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000216 polarssl_fprintf( stderr, "Failed to open\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200217 return( 1 );
218 }
219
220 while( !feof( file ) )
221 {
222 int skip = 0;
223
224 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
225 break;
Rich Evans3d536ba2015-01-14 18:58:11 +0000226 polarssl_fprintf( stdout, "%s%.66s", test_errors ? "\n" : "", buf );
227 polarssl_fprintf( stdout, " " );
Paul Bakker19343182013-08-16 13:31:10 +0200228 for( i = strlen( buf ) + 1; i < 67; i++ )
Rich Evans3d536ba2015-01-14 18:58:11 +0000229 polarssl_fprintf( stdout, "." );
230 polarssl_fprintf( stdout, " " );
Paul Bakker19343182013-08-16 13:31:10 +0200231 fflush( stdout );
232
233 total_tests++;
234
235 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
236 break;
237 cnt = parse_arguments( buf, strlen(buf), params );
238
239 if( strcmp( params[0], "depends_on" ) == 0 )
240 {
241 for( i = 1; i < cnt; i++ )
242 if( dep_check( params[i] ) != 0 )
243 skip = 1;
244
245 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
246 break;
247 cnt = parse_arguments( buf, strlen(buf), params );
248 }
249
250 if( skip == 0 )
251 {
252 test_errors = 0;
253 ret = dispatch_test( cnt, params );
254 }
255
256 if( skip == 1 || ret == 3 )
257 {
258 total_skipped++;
Rich Evans3d536ba2015-01-14 18:58:11 +0000259 polarssl_fprintf( stdout, "----\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200260 fflush( stdout );
261 }
Paul Bakker33b43f12013-08-20 11:48:36 +0200262 else if( ret == 0 && test_errors == 0 )
Paul Bakker19343182013-08-16 13:31:10 +0200263 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000264 polarssl_fprintf( stdout, "PASS\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200265 fflush( stdout );
266 }
267 else if( ret == 2 )
268 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000269 polarssl_fprintf( stderr, "FAILED: FATAL PARSE ERROR\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200270 fclose(file);
271 exit( 2 );
272 }
273 else
274 total_errors++;
275
276 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
277 break;
278 if( strlen(buf) != 0 )
279 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000280 polarssl_fprintf( stderr, "Should be empty %d\n", (int) strlen(buf) );
Paul Bakker19343182013-08-16 13:31:10 +0200281 return( 1 );
282 }
283 }
284 fclose(file);
285
Rich Evans3d536ba2015-01-14 18:58:11 +0000286 polarssl_fprintf( stdout, "\n----------------------------------------------------------------------------\n\n");
Paul Bakker19343182013-08-16 13:31:10 +0200287 if( total_errors == 0 )
Rich Evans3d536ba2015-01-14 18:58:11 +0000288 polarssl_fprintf( stdout, "PASSED" );
Paul Bakker19343182013-08-16 13:31:10 +0200289 else
Rich Evans3d536ba2015-01-14 18:58:11 +0000290 polarssl_fprintf( stdout, "FAILED" );
Paul Bakker19343182013-08-16 13:31:10 +0200291
Rich Evans3d536ba2015-01-14 18:58:11 +0000292 polarssl_fprintf( stdout, " (%d / %d tests (%d skipped))\n",
Paul Bakker19343182013-08-16 13:31:10 +0200293 total_tests - total_errors, total_tests, total_skipped );
294
Manuel Pégourié-Gonnard765bb312014-11-27 11:55:27 +0100295#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && \
296 !defined(TEST_SUITE_MEMORY_BUFFER_ALLOC)
Paul Bakker1337aff2013-09-29 14:45:34 +0200297#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker19343182013-08-16 13:31:10 +0200298 memory_buffer_alloc_status();
299#endif
Paul Bakker1337aff2013-09-29 14:45:34 +0200300 memory_buffer_alloc_free();
301#endif
Paul Bakker19343182013-08-16 13:31:10 +0200302
303 return( total_errors != 0 );
304}
305