blob: d67d875ca066ab0a4875c03738f620e5999b37be [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
135int get_line( FILE *f, char *buf, size_t len )
136{
137 char *ret;
138
139 ret = fgets( buf, len, f );
140 if( ret == NULL )
141 return( -1 );
142
143 if( strlen( buf ) && buf[strlen(buf) - 1] == '\n' )
144 buf[strlen(buf) - 1] = '\0';
145 if( strlen( buf ) && buf[strlen(buf) - 1] == '\r' )
146 buf[strlen(buf) - 1] = '\0';
147
148 return( 0 );
149}
150
151int parse_arguments( char *buf, size_t len, char *params[50] )
152{
153 int cnt = 0, i;
154 char *cur = buf;
155 char *p = buf, *q;
156
157 params[cnt++] = cur;
158
159 while( *p != '\0' && p < buf + len )
160 {
161 if( *p == '\\' )
162 {
Manuel Pégourié-Gonnard2d5f1422014-01-22 16:01:17 +0100163 p++;
164 p++;
Paul Bakker19343182013-08-16 13:31:10 +0200165 continue;
166 }
167 if( *p == ':' )
168 {
169 if( p + 1 < buf + len )
170 {
171 cur = p + 1;
172 params[cnt++] = cur;
173 }
174 *p = '\0';
175 }
176
Manuel Pégourié-Gonnard2d5f1422014-01-22 16:01:17 +0100177 p++;
Paul Bakker19343182013-08-16 13:31:10 +0200178 }
179
180 // Replace newlines, question marks and colons in strings
181 for( i = 0; i < cnt; i++ )
182 {
183 p = params[i];
184 q = params[i];
185
186 while( *p != '\0' )
187 {
188 if( *p == '\\' && *(p + 1) == 'n' )
189 {
190 p += 2;
191 *(q++) = '\n';
192 }
193 else if( *p == '\\' && *(p + 1) == ':' )
194 {
195 p += 2;
196 *(q++) = ':';
197 }
198 else if( *p == '\\' && *(p + 1) == '?' )
199 {
200 p += 2;
201 *(q++) = '?';
202 }
203 else
204 *(q++) = *(p++);
205 }
206 *q = '\0';
207 }
208
209 return( cnt );
210}
211
212int main()
213{
214 int ret, i, cnt, total_errors = 0, total_tests = 0, total_skipped = 0;
215 const char *filename = "TEST_FILENAME";
216 FILE *file;
217 char buf[5000];
218 char *params[50];
219
Manuel Pégourié-Gonnard765bb312014-11-27 11:55:27 +0100220#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && \
221 !defined(TEST_SUITE_MEMORY_BUFFER_ALLOC)
Paul Bakker1337aff2013-09-29 14:45:34 +0200222 unsigned char alloc_buf[1000000];
223 memory_buffer_alloc_init( alloc_buf, sizeof(alloc_buf) );
Paul Bakker19343182013-08-16 13:31:10 +0200224#endif
225
226 file = fopen( filename, "r" );
227 if( file == NULL )
228 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000229 polarssl_fprintf( stderr, "Failed to open\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200230 return( 1 );
231 }
232
233 while( !feof( file ) )
234 {
235 int skip = 0;
236
237 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
238 break;
Rich Evans3d536ba2015-01-14 18:58:11 +0000239 polarssl_fprintf( stdout, "%s%.66s", test_errors ? "\n" : "", buf );
240 polarssl_fprintf( stdout, " " );
Paul Bakker19343182013-08-16 13:31:10 +0200241 for( i = strlen( buf ) + 1; i < 67; i++ )
Rich Evans3d536ba2015-01-14 18:58:11 +0000242 polarssl_fprintf( stdout, "." );
243 polarssl_fprintf( stdout, " " );
Paul Bakker19343182013-08-16 13:31:10 +0200244 fflush( stdout );
245
246 total_tests++;
247
248 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
249 break;
250 cnt = parse_arguments( buf, strlen(buf), params );
251
252 if( strcmp( params[0], "depends_on" ) == 0 )
253 {
254 for( i = 1; i < cnt; i++ )
255 if( dep_check( params[i] ) != 0 )
256 skip = 1;
257
258 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
259 break;
260 cnt = parse_arguments( buf, strlen(buf), params );
261 }
262
263 if( skip == 0 )
264 {
265 test_errors = 0;
266 ret = dispatch_test( cnt, params );
267 }
268
269 if( skip == 1 || ret == 3 )
270 {
271 total_skipped++;
Rich Evans3d536ba2015-01-14 18:58:11 +0000272 polarssl_fprintf( stdout, "----\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200273 fflush( stdout );
274 }
Paul Bakker33b43f12013-08-20 11:48:36 +0200275 else if( ret == 0 && test_errors == 0 )
Paul Bakker19343182013-08-16 13:31:10 +0200276 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000277 polarssl_fprintf( stdout, "PASS\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200278 fflush( stdout );
279 }
280 else if( ret == 2 )
281 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000282 polarssl_fprintf( stderr, "FAILED: FATAL PARSE ERROR\n" );
Paul Bakker19343182013-08-16 13:31:10 +0200283 fclose(file);
Rich Evans77d36382015-01-30 12:12:11 +0000284 polarssl_exit( 2 );
Paul Bakker19343182013-08-16 13:31:10 +0200285 }
286 else
287 total_errors++;
288
289 if( ( ret = get_line( file, buf, sizeof(buf) ) ) != 0 )
290 break;
291 if( strlen(buf) != 0 )
292 {
Rich Evans3d536ba2015-01-14 18:58:11 +0000293 polarssl_fprintf( stderr, "Should be empty %d\n", (int) strlen(buf) );
Paul Bakker19343182013-08-16 13:31:10 +0200294 return( 1 );
295 }
296 }
297 fclose(file);
298
Rich Evans3d536ba2015-01-14 18:58:11 +0000299 polarssl_fprintf( stdout, "\n----------------------------------------------------------------------------\n\n");
Paul Bakker19343182013-08-16 13:31:10 +0200300 if( total_errors == 0 )
Rich Evans3d536ba2015-01-14 18:58:11 +0000301 polarssl_fprintf( stdout, "PASSED" );
Paul Bakker19343182013-08-16 13:31:10 +0200302 else
Rich Evans3d536ba2015-01-14 18:58:11 +0000303 polarssl_fprintf( stdout, "FAILED" );
Paul Bakker19343182013-08-16 13:31:10 +0200304
Rich Evans3d536ba2015-01-14 18:58:11 +0000305 polarssl_fprintf( stdout, " (%d / %d tests (%d skipped))\n",
Paul Bakker19343182013-08-16 13:31:10 +0200306 total_tests - total_errors, total_tests, total_skipped );
307
Manuel Pégourié-Gonnard765bb312014-11-27 11:55:27 +0100308#if defined(POLARSSL_MEMORY_BUFFER_ALLOC_C) && \
309 !defined(TEST_SUITE_MEMORY_BUFFER_ALLOC)
Paul Bakker1337aff2013-09-29 14:45:34 +0200310#if defined(POLARSSL_MEMORY_DEBUG)
Paul Bakker19343182013-08-16 13:31:10 +0200311 memory_buffer_alloc_status();
312#endif
Paul Bakker1337aff2013-09-29 14:45:34 +0200313 memory_buffer_alloc_free();
314#endif
Paul Bakker19343182013-08-16 13:31:10 +0200315
316 return( total_errors != 0 );
317}
318