1 /*
2 * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the OpenSSL license (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
8 */
9
10 #include "../testutil.h"
11 #include "internal/nelem.h"
12 #include "output.h"
13 #include "tu_local.h"
14
15 #include <string.h>
16
17 static size_t arg_count;
18 static char **args;
19 static unsigned char arg_used[1000];
20
check_arg_usage(void)21 static void check_arg_usage(void)
22 {
23 size_t i, n = arg_count < OSSL_NELEM(arg_used) ? arg_count
24 : OSSL_NELEM(arg_used);
25
26 for (i = 0; i < n; i++)
27 if (!arg_used[i+1])
28 test_printf_stderr("Warning ignored command-line argument %d: %s\n",
29 i, args[i+1]);
30 if (i < arg_count)
31 test_printf_stderr("Warning arguments %zu and later unchecked\n", i);
32 }
33
main(int argc,char * argv[])34 int main(int argc, char *argv[])
35 {
36 int ret = EXIT_FAILURE;
37
38 test_open_streams();
39
40 if (!global_init()) {
41 test_printf_stderr("Global init failed - aborting\n");
42 return ret;
43 }
44
45 arg_count = argc - 1;
46 args = argv;
47
48 setup_test_framework();
49
50 if (setup_tests())
51 ret = run_tests(argv[0]);
52 cleanup_tests();
53 check_arg_usage();
54
55 ret = pulldown_test_framework(ret);
56 test_close_streams();
57 return ret;
58 }
59
test_get_program_name(void)60 const char *test_get_program_name(void)
61 {
62 return args[0];
63 }
64
test_get_argument(size_t n)65 char *test_get_argument(size_t n)
66 {
67 if (n > arg_count)
68 return NULL;
69 if (n + 1 < OSSL_NELEM(arg_used))
70 arg_used[n + 1] = 1;
71 return args[n + 1];
72 }
73
test_get_argument_count(void)74 size_t test_get_argument_count(void)
75 {
76 return arg_count;
77 }
78
test_has_option(const char * option)79 int test_has_option(const char *option)
80 {
81 size_t i;
82
83 for (i = 1; i <= arg_count; i++)
84 if (strcmp(args[i], option) == 0) {
85 arg_used[i] = 1;
86 return 1;
87 }
88 return 0;
89 }
90
test_get_option_argument(const char * option)91 const char *test_get_option_argument(const char *option)
92 {
93 size_t i, n = strlen(option);
94
95 for (i = 1; i <= arg_count; i++)
96 if (strncmp(args[i], option, n) == 0) {
97 arg_used[i] = 1;
98 if (args[i][n] == '\0' && i + 1 < arg_count) {
99 arg_used[++i] = 1;
100 return args[i];
101 }
102 return args[i] + n;
103 }
104 return NULL;
105 }
106
107