]>
git.ipfire.org Git - thirdparty/openssl.git/blob - test/testutil/driver.c
0b50e2ae1603a29606b5d50eed2aa09c6d4ddcbe
2 * Copyright 2016-2021 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 #include "../testutil.h"
17 #include "internal/nelem.h"
18 #include <openssl/bio.h>
20 #include "platform.h" /* From libapps */
23 # define strdup _strdup
28 * Declares the structures needed to register each test case function.
30 typedef struct test_info
{
31 const char *test_case_name
;
32 int (*test_fn
) (void);
33 int (*param_test_fn
)(int idx
);
40 static TEST_INFO all_tests
[1024];
41 static int num_tests
= 0;
42 static int show_list
= 0;
43 static int single_test
= -1;
44 static int single_iter
= -1;
47 static int rand_order
= 0;
50 * A parameterised test runs a loop of test cases.
51 * |num_test_cases| counts the total number of non-subtest test cases
54 static int num_test_cases
= 0;
56 static int process_shared_options(void);
59 void add_test(const char *test_case_name
, int (*test_fn
) (void))
61 assert(num_tests
!= OSSL_NELEM(all_tests
));
62 all_tests
[num_tests
].test_case_name
= test_case_name
;
63 all_tests
[num_tests
].test_fn
= test_fn
;
64 all_tests
[num_tests
].num
= -1;
69 void add_all_tests(const char *test_case_name
, int(*test_fn
)(int idx
),
72 assert(num_tests
!= OSSL_NELEM(all_tests
));
73 all_tests
[num_tests
].test_case_name
= test_case_name
;
74 all_tests
[num_tests
].param_test_fn
= test_fn
;
75 all_tests
[num_tests
].num
= num
;
76 all_tests
[num_tests
].subtest
= subtest
;
81 num_test_cases
+= num
;
84 static int gcd(int a
, int b
)
94 static void set_seed(int s
)
98 seed
= (int)time(NULL
);
99 test_random_seed(seed
);
103 int setup_test_framework(int argc
, char *argv
[])
105 char *test_seed
= getenv("OPENSSL_TEST_RAND_ORDER");
106 char *TAP_levels
= getenv("HARNESS_OSSL_LEVEL");
108 if (TAP_levels
!= NULL
)
109 level
= 4 * atoi(TAP_levels
);
110 test_adjust_streams_tap_level(level
);
111 if (test_seed
!= NULL
) {
113 set_seed(atoi(test_seed
));
118 #if defined(OPENSSL_SYS_VMS) && defined(__DECC)
119 argv
= copy_argv(&argc
, argv
);
120 #elif defined(_WIN32)
122 * Replace argv[] with UTF-8 encoded strings.
124 win32_utf8argv(&argc
, &argv
);
127 if (!opt_init(argc
, argv
, test_get_options()))
134 * This can only be called after setup() has run, since num_tests and
135 * all_tests[] are setup at this point
137 static int check_single_test_params(char *name
, char *testname
, char *itname
)
141 for (i
= 0; i
< num_tests
; ++i
) {
142 if (strcmp(name
, all_tests
[i
].test_case_name
) == 0) {
148 single_test
= atoi(name
);
152 /* if only iteration is specified, assume we want the first test */
153 if (single_test
== -1 && single_iter
!= -1)
156 if (single_test
!= -1) {
157 if (single_test
< 1 || single_test
> num_tests
) {
158 test_printf_stderr("Invalid -%s value "
159 "(Value must be a valid test name OR a value between %d..%d)\n",
160 testname
, 1, num_tests
);
164 if (single_iter
!= -1) {
165 if (all_tests
[single_test
- 1].num
== -1) {
166 test_printf_stderr("-%s option is not valid for test %d:%s\n",
169 all_tests
[single_test
- 1].test_case_name
);
171 } else if (single_iter
< 1
172 || single_iter
> all_tests
[single_test
- 1].num
) {
173 test_printf_stderr("Invalid -%s value for test %d:%s\t"
174 "(Value must be in the range %d..%d)\n",
176 all_tests
[single_test
- 1].test_case_name
,
177 1, all_tests
[single_test
- 1].num
);
184 static int process_shared_options(void)
186 OPTION_CHOICE_DEFAULT o
;
189 char *flag_test
= "";
190 char *flag_iter
= "";
191 char *testname
= NULL
;
194 while ((o
= opt_next()) != OPT_EOF
) {
196 /* Ignore any test options at this level */
202 opt_help(test_get_options());
207 case OPT_TEST_SINGLE
:
208 flag_test
= opt_flag();
209 testname
= opt_arg();
211 case OPT_TEST_ITERATION
:
212 flag_iter
= opt_flag();
213 if (!opt_int(opt_arg(), &single_iter
))
216 case OPT_TEST_INDENT
:
217 if (!opt_int(opt_arg(), &value
))
220 test_adjust_streams_tap_level(level
);
223 if (!opt_int(opt_arg(), &value
))
229 if (!check_single_test_params(testname
, flag_test
, flag_iter
))
237 int pulldown_test_framework(int ret
)
239 set_test_title(NULL
);
243 static void finalize(int success
)
248 ERR_print_errors_cb(openssl_error_cb
, NULL
);
251 static char *test_title
= NULL
;
253 void set_test_title(const char *title
)
256 test_title
= title
== NULL
? NULL
: strdup(title
);
259 PRINTF_FORMAT(2, 3) static void test_verdict(int verdict
,
260 const char *description
, ...)
267 if (verdict
== 0 && seed
!= 0)
268 test_printf_tapout("# OPENSSL_TEST_RAND_ORDER=%d\n", seed
);
269 test_printf_tapout("%s ", verdict
!= 0 ? "ok" : "not ok");
270 va_start(ap
, description
);
271 test_vprintf_tapout(description
, ap
);
273 if (verdict
== TEST_SKIP_CODE
)
274 test_printf_tapout(" # skipped");
275 test_printf_tapout("\n");
279 int run_tests(const char *test_prog_name
)
283 int ii
, i
, jj
, j
, jstep
;
284 int test_case_count
= 0;
285 int subtest_case_count
= 0;
286 int permute
[OSSL_NELEM(all_tests
)];
288 i
= process_shared_options();
295 test_printf_tapout("1..0 # Skipped: %s\n", test_prog_name
);
296 } else if (show_list
== 0 && single_test
== -1) {
298 test_printf_stdout("Subtest: %s\n", test_prog_name
);
301 test_printf_tapout("1..%d\n", num_test_cases
);
306 for (i
= 0; i
< num_tests
; i
++)
309 for (i
= num_tests
- 1; i
>= 1; i
--) {
310 j
= test_random() % (1 + i
);
312 permute
[j
] = permute
[i
];
316 for (ii
= 0; ii
!= num_tests
; ++ii
) {
319 if (single_test
!= -1 && ((i
+1) != single_test
)) {
322 else if (show_list
) {
323 if (all_tests
[i
].num
!= -1) {
324 test_printf_tapout("%d - %s (%d..%d)\n", ii
+ 1,
325 all_tests
[i
].test_case_name
, 1,
328 test_printf_tapout("%d - %s\n", ii
+ 1,
329 all_tests
[i
].test_case_name
);
332 } else if (all_tests
[i
].num
== -1) {
333 set_test_title(all_tests
[i
].test_case_name
);
334 verdict
= all_tests
[i
].test_fn();
335 finalize(verdict
!= 0);
336 test_verdict(verdict
, "%d - %s", test_case_count
+ 1, test_title
);
341 int num_failed_inner
= 0;
343 verdict
= TEST_SKIP_CODE
;
344 set_test_title(all_tests
[i
].test_case_name
);
345 if (all_tests
[i
].subtest
) {
347 test_adjust_streams_tap_level(level
);
348 if (single_iter
== -1) {
349 test_printf_stdout("Subtest: %s\n", test_title
);
350 test_printf_tapout("%d..%d\n", 1, all_tests
[i
].num
);
357 if (rand_order
== 0 || all_tests
[i
].num
< 3)
361 jstep
= test_random() % all_tests
[i
].num
;
362 while (jstep
== 0 || gcd(all_tests
[i
].num
, jstep
) != 1);
364 for (jj
= 0; jj
< all_tests
[i
].num
; jj
++) {
367 j
= (j
+ jstep
) % all_tests
[i
].num
;
368 if (single_iter
!= -1 && ((jj
+ 1) != single_iter
))
370 v
= all_tests
[i
].param_test_fn(j
);
375 } else if (v
!= TEST_SKIP_CODE
&& verdict
!= 0) {
381 if (all_tests
[i
].subtest
)
382 test_verdict(v
, "%d - iteration %d",
383 subtest_case_count
+ 1, j
+ 1);
385 test_verdict(v
, "%d - %s - iteration %d",
386 test_case_count
+ subtest_case_count
+ 1,
388 subtest_case_count
++;
391 if (all_tests
[i
].subtest
) {
393 test_adjust_streams_tap_level(level
);
397 if (all_tests
[i
].num
== -1 || all_tests
[i
].subtest
)
398 test_verdict(verdict
, "%d - %s", test_case_count
+ 1,
399 all_tests
[i
].test_case_name
);
409 * Glue an array of strings together and return it as an allocated string.
410 * Optionally return the whole length of this string in |out_len|
412 char *glue_strings(const char *list
[], size_t *out_len
)
418 for (i
= 0; list
[i
] != NULL
; i
++)
419 len
+= strlen(list
[i
]);
424 if (!TEST_ptr(ret
= p
= OPENSSL_malloc(len
+ 1)))
427 for (i
= 0; list
[i
] != NULL
; i
++)
428 p
+= strlen(strcpy(p
, list
[i
]));
433 char *test_mk_file_path(const char *dir
, const char *file
)
435 # ifndef OPENSSL_SYS_VMS
436 const char *sep
= "/";
438 const char *sep
= "";
440 size_t len
= strlen(dir
) + strlen(sep
) + strlen(file
) + 1;
441 char *full_file
= OPENSSL_zalloc(len
);
443 if (full_file
!= NULL
) {
444 OPENSSL_strlcpy(full_file
, dir
, len
);
445 OPENSSL_strlcat(full_file
, sep
, len
);
446 OPENSSL_strlcat(full_file
, file
, len
);