blob: 5c0b53997e9644153be2b90446bd06168857e0c5 [file] [log] [blame]
Rich Evans77d36382015-01-30 12:12:11 +00001#include <string.h>
2
3#if defined(POLARSSL_PLATFORM_C)
4#include "polarssl/platform.h"
5#else
Rich Evans012acfc2015-01-30 12:12:11 +00006#include <stdio.h>
Rich Evans77d36382015-01-30 12:12:11 +00007#define polarssl_exit exit
8#define polarssl_free free
9#define polarssl_malloc malloc
10#define polarssl_fprintf fprintf
11#define polarssl_printf printf
12#endif
13
Manuel Pégourié-Gonnard0ac1d2d2015-01-26 14:58:04 +010014#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C)
15#include "polarssl/memory_buffer_alloc.h"
16#endif
17
Paul Bakker19343182013-08-16 13:31:10 +020018static int test_errors = 0;
19
Paul Bakkerde56ca12013-09-15 17:05:21 +020020SUITE_PRE_DEP
21#define TEST_SUITE_ACTIVE
22
Paul Bakker8fc30b12013-11-25 13:29:43 +010023static int test_assert( int correct, const char *test )
Paul Bakker19343182013-08-16 13:31:10 +020024{
25 if( correct )
26 return( 0 );
27
28 test_errors++;
Paul Bakker55a7e902013-08-19 14:02:10 +020029 if( test_errors == 1 )
Rich Evans3d536ba2015-01-14 18:58:11 +000030 polarssl_printf( "FAILED\n" );
31 polarssl_printf( " %s\n", test );
Paul Bakker19343182013-08-16 13:31:10 +020032
33 return( 1 );
34}
35
Paul Bakkerbb20f4b2013-08-20 12:41:33 +020036#define TEST_ASSERT( TEST ) \
37 do { test_assert( (TEST) ? 1 : 0, #TEST ); \
Paul Bakker318d0fe2014-07-10 14:59:25 +020038 if( test_errors) goto exit; \
Paul Bakkerbb20f4b2013-08-20 12:41:33 +020039 } while (0)
Paul Bakker19343182013-08-16 13:31:10 +020040
41int verify_string( char **str )
42{
43 if( (*str)[0] != '"' ||
44 (*str)[strlen( *str ) - 1] != '"' )
45 {
Rich Evans3d536ba2015-01-14 18:58:11 +000046 polarssl_printf( "Expected string (with \"\") for parameter and got: %s\n", *str );
Paul Bakker19343182013-08-16 13:31:10 +020047 return( -1 );
48 }
49
50 (*str)++;
51 (*str)[strlen( *str ) - 1] = '\0';
52
53 return( 0 );
54}
55
56int verify_int( char *str, int *value )
57{
58 size_t i;
59 int minus = 0;
60 int digits = 1;
61 int hex = 0;
62
63 for( i = 0; i < strlen( str ); i++ )
64 {
65 if( i == 0 && str[i] == '-' )
66 {
67 minus = 1;
68 continue;
69 }
70
71 if( ( ( minus && i == 2 ) || ( !minus && i == 1 ) ) &&
72 str[i - 1] == '0' && str[i] == 'x' )
73 {
74 hex = 1;
75 continue;
76 }
77
Manuel Pégourié-Gonnard725afd82014-02-01 11:54:28 +010078 if( ! ( ( str[i] >= '0' && str[i] <= '9' ) ||
79 ( hex && ( ( str[i] >= 'a' && str[i] <= 'f' ) ||
80 ( str[i] >= 'A' && str[i] <= 'F' ) ) ) ) )
Paul Bakker19343182013-08-16 13:31:10 +020081 {
82 digits = 0;
83 break;
84 }
85 }
86
87 if( digits )
88 {
89 if( hex )
90 *value = strtol( str, NULL, 16 );
91 else
92 *value = strtol( str, NULL, 10 );
93
94 return( 0 );
95 }
96
97MAPPING_CODE
98
Rich Evans3d536ba2015-01-14 18:58:11 +000099 polarssl_printf( "Expected integer for parameter and got: %s\n", str );
Paul Bakker19343182013-08-16 13:31:10 +0200100 return( -1 );
101}
102
Paul Bakkerde56ca12013-09-15 17:05:21 +0200103FUNCTION_CODE
104SUITE_POST_DEP
105
Paul Bakker19343182013-08-16 13:31:10 +0200106int dep_check( char *str )
107{
108 if( str == NULL )
109 return( 1 );
110
111DEP_CHECK_CODE
112
113 return( 1 );
114}
115
Paul Bakker19343182013-08-16 13:31:10 +0200116int dispatch_test(int cnt, char *params[50])
117{
118 int ret;
Paul Bakkerb34fef22013-08-20 12:06:33 +0200119 ((void) cnt);
120 ((void) params);
Paul Bakker19343182013-08-16 13:31:10 +0200121
Paul Bakkerb34fef22013-08-20 12:06:33 +0200122#if defined(TEST_SUITE_ACTIVE)
Paul Bakker19343182013-08-16 13:31:10 +0200123DISPATCH_FUNCTION
124 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000125 polarssl_fprintf( stdout, "FAILED\nSkipping unknown test function '%s'\n", params[0] );
Paul Bakker19343182013-08-16 13:31:10 +0200126 fflush( stdout );
127 return( 1 );
128 }
Paul Bakkerb34fef22013-08-20 12:06:33 +0200129#else
130 return( 3 );
131#endif
Paul Bakker19343182013-08-16 13:31:10 +0200132 return( ret );
133}
134
Gilles Peskinef1cc6a42017-09-29 15:45:12 +0200135/** Retrieve one input line into buf, which must have room for len
136 * bytes. The trailing line break (if any) is stripped from the result.
137 * Lines beginning with the character '#' are skipped. Lines that are
138 * more than len-1 bytes long including the trailing line break are
139 * truncated; note that the following bytes remain in the input stream.
140 *
141 * \return 0 on success, -1 on error or end of file
142 */
Paul Bakker19343182013-08-16 13:31:10 +0200143int get_line( FILE *f, char *buf, size_t len )
144{
145 char *ret;
146
Gilles Peskinef1cc6a42017-09-29 15:45:12 +0200147 do
148 {
149 ret = fgets( buf, len, f );
150 if( ret == NULL )
151 return( -1 );
152 }
153 while( buf[0] == '#' );
Paul Bakker19343182013-08-16 13:31:10 +0200154
Gilles Peskinef1cc6a42017-09-29 15:45:12 +0200155 ret = buf + strlen( buf );
156 if( ret-- > buf && *ret == '\n' )
157 *ret = '\0';
158 if( ret-- > buf && *ret == '\r' )
159 *ret = '\0';
Paul Bakker19343182013-08-16 13:31:10 +0200160
161 return( 0 );
162}
163
164int parse_arguments( char *buf, size_t len, char *params[50] )
165{
166 int cnt = 0, i;
167 char *cur = buf;
168 char *p = buf, *q;
169
170 params[cnt++] = cur;
171
172 while( *p != '\0' && p < buf + len )
173 {
174 if( *p == '\\' )
175 {
Manuel Pégourié-Gonnard2d5f1422014-01-22 16:01:17 +0100176 p++;
177 p++;
Paul Bakker19343182013-08-16 13:31:10 +0200178 continue;
179 }
180 if( *p == ':' )
181 {
182 if( p + 1 < buf + len )
183 {
184 cur = p + 1;
185 params[cnt++] = cur;
186 }
187 *p = '\0';
188 }
189
Manuel Pégourié-Gonnard2d5f1422014-01-22 16:01:17 +0100190 p++;
Paul Bakker19343182013-08-16 13:31:10 +0200191 }
192
193 // Replace newlines, question marks and colons in strings
194 for( i = 0; i < cnt; i++ )
195 {
196 p = params[i];
197 q = params[i];
198
199 while( *p != '\0' )
200 {
201 if( *p == '\\' && *(p + 1) == 'n' )
202 {
203 p += 2;
204 *(q++) = '\n';
205 }
206 else if( *p == '\\' && *(p + 1) == ':' )
207 {
208 p += 2;
209 *(q++) = ':';
210 }
211 else if( *p == '\\' && *(p + 1) == '?' )
212 {
213 p += 2;
214 *(q++) = '?';
215 }
216 else
217 *(q++) = *(p++);
218 }
219 *q = '\0';
220 }
221
222 return( cnt );
223}
224
225int main()
226{
227 int ret, i, cnt, total_errors = 0, total_tests = 0, total_skipped = 0;
228 const char *filename = "TEST_FILENAME";
229 FILE *file;
230 char buf[5000];
231 char *params[50];
232
Manuel Pégourié-Gonnard765bb312014-11-27 11:55:27 +0100233#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && \
234 !defined(TEST_SUITE_MEMORY_BUFFER_ALLOC)
Paul Bakker1337aff2013-09-29 14:45:34 +0200235 unsigned char alloc_buf[1000000];
236 memory_buffer_alloc_init( alloc_buf, sizeof(alloc_buf) );
Paul Bakker19343182013-08-16 13:31:10 +0200237#endif
238
239 file = fopen( filename, "r" );
240 if( file == NULL )
241 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000242 polarssl_fprintf( stderr, "Failed to open\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200243 return( 1 );
244 }
245
246 while( !feof( file ) )
247 {
248 int skip = 0;
249
250 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
251 break;
Rich Evans3d536ba2015-01-14 18:58:11 +0000252 polarssl_fprintf( stdout, "%s%.66s", test_errors ? "\n" : "", buf );
253 polarssl_fprintf( stdout, " " );
Paul Bakker19343182013-08-16 13:31:10 +0200254 for( i = strlen( buf ) + 1; i < 67; i++ )
Rich Evans3d536ba2015-01-14 18:58:11 +0000255 polarssl_fprintf( stdout, "." );
256 polarssl_fprintf( stdout, " " );
Paul Bakker19343182013-08-16 13:31:10 +0200257 fflush( stdout );
258
259 total_tests++;
260
261 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
262 break;
263 cnt = parse_arguments( buf, strlen(buf), params );
264
265 if( strcmp( params[0], "depends_on" ) == 0 )
266 {
267 for( i = 1; i < cnt; i++ )
268 if( dep_check( params[i] ) != 0 )
269 skip = 1;
270
271 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
272 break;
273 cnt = parse_arguments( buf, strlen(buf), params );
274 }
275
276 if( skip == 0 )
277 {
278 test_errors = 0;
279 ret = dispatch_test( cnt, params );
280 }
281
282 if( skip == 1 || ret == 3 )
283 {
284 total_skipped++;
Rich Evans3d536ba2015-01-14 18:58:11 +0000285 polarssl_fprintf( stdout, "----\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200286 fflush( stdout );
287 }
Paul Bakker33b43f12013-08-20 11:48:36 +0200288 else if( ret == 0 && test_errors == 0 )
Paul Bakker19343182013-08-16 13:31:10 +0200289 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000290 polarssl_fprintf( stdout, "PASS\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200291 fflush( stdout );
292 }
293 else if( ret == 2 )
294 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000295 polarssl_fprintf( stderr, "FAILED: FATAL PARSE ERROR\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200296 fclose(file);
Rich Evans77d36382015-01-30 12:12:11 +0000297 polarssl_exit( 2 );
Paul Bakker19343182013-08-16 13:31:10 +0200298 }
299 else
300 total_errors++;
301
302 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
303 break;
304 if( strlen(buf) != 0 )
305 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000306 polarssl_fprintf( stderr, "Should be empty %d\n", (int) strlen(buf) );
Paul Bakker19343182013-08-16 13:31:10 +0200307 return( 1 );
308 }
309 }
310 fclose(file);
311
Rich Evans3d536ba2015-01-14 18:58:11 +0000312 polarssl_fprintf( stdout, "\n----------------------------------------------------------------------------\n\n");
Paul Bakker19343182013-08-16 13:31:10 +0200313 if( total_errors == 0 )
Rich Evans3d536ba2015-01-14 18:58:11 +0000314 polarssl_fprintf( stdout, "PASSED" );
Paul Bakker19343182013-08-16 13:31:10 +0200315 else
Rich Evans3d536ba2015-01-14 18:58:11 +0000316 polarssl_fprintf( stdout, "FAILED" );
Paul Bakker19343182013-08-16 13:31:10 +0200317
Rich Evans3d536ba2015-01-14 18:58:11 +0000318 polarssl_fprintf( stdout, " (%d / %d tests (%d skipped))\n",
Paul Bakker19343182013-08-16 13:31:10 +0200319 total_tests - total_errors, total_tests, total_skipped );
320
Manuel Pégourié-Gonnard765bb312014-11-27 11:55:27 +0100321#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && \
322 !defined(TEST_SUITE_MEMORY_BUFFER_ALLOC)
Paul Bakker1337aff2013-09-29 14:45:34 +0200323#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker19343182013-08-16 13:31:10 +0200324 memory_buffer_alloc_status();
325#endif
Paul Bakker1337aff2013-09-29 14:45:34 +0200326 memory_buffer_alloc_free();
327#endif
Paul Bakker19343182013-08-16 13:31:10 +0200328
329 return( total_errors != 0 );
330}
331