Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright (C) 2018 Intel Corporation. All rights reserved.
3 : : * Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
4 : : */
5 : :
6 : : #include "spdk/stdinc.h"
7 : :
8 : : #include "spdk_internal/cunit.h"
9 : : #include "common/lib/test_env.c"
10 : : #include "event/app.c"
11 : :
12 : : #define test_argc 6
13 : :
14 : 0 : DEFINE_STUB_V(spdk_event_call, (struct spdk_event *event));
15 : 0 : DEFINE_STUB(spdk_event_allocate, struct spdk_event *, (uint32_t core, spdk_event_fn fn, void *arg1,
16 : : void *arg2), NULL);
17 : 0 : DEFINE_STUB_V(spdk_subsystem_init, (spdk_subsystem_init_fn cb_fn, void *cb_arg));
18 : 0 : DEFINE_STUB_V(spdk_subsystem_fini, (spdk_msg_fn cb_fn, void *cb_arg));
19 : 16 : DEFINE_STUB_V(spdk_rpc_register_method, (const char *method, spdk_rpc_method_handler func,
20 : : uint32_t state_mask));
21 : 0 : DEFINE_STUB_V(spdk_rpc_register_alias_deprecated, (const char *method, const char *alias));
22 : 0 : DEFINE_STUB_V(spdk_rpc_set_state, (uint32_t state));
23 : 0 : DEFINE_STUB(spdk_rpc_get_state, uint32_t, (void), SPDK_RPC_RUNTIME);
24 : 0 : DEFINE_STUB(spdk_rpc_initialize, int, (const char *listen_addr,
25 : : const struct spdk_rpc_opts *opts), 0);
26 : 0 : DEFINE_STUB_V(spdk_rpc_set_allowlist, (const char **rpc_allowlist));
27 : 0 : DEFINE_STUB_V(spdk_rpc_finish, (void));
28 : 0 : DEFINE_STUB_V(spdk_subsystem_init_from_json_config, (const char *json_config_file,
29 : : const char *rpc_addr,
30 : : spdk_subsystem_init_fn cb_fn, void *cb_arg, bool stop_on_error));
31 : 0 : DEFINE_STUB_V(spdk_reactors_start, (void));
32 : 0 : DEFINE_STUB_V(spdk_reactors_stop, (void *arg1));
33 : 0 : DEFINE_STUB(spdk_reactors_init, int, (size_t msg_mempool_size), 0);
34 : 0 : DEFINE_STUB_V(spdk_reactors_fini, (void));
35 : : bool g_scheduling_in_progress;
36 : :
37 : : static void
38 : 0 : unittest_usage(void)
39 : : {
40 : 0 : }
41 : :
42 : : static int
43 : 8 : unittest_parse_args(int ch, char *arg)
44 : : {
45 : 8 : return 0;
46 : : }
47 : :
48 : : static void
49 : 32 : clean_opts(struct spdk_app_opts *opts)
50 : : {
51 : 32 : free(opts->pci_allowed);
52 : 32 : opts->pci_allowed = NULL;
53 : 32 : free(opts->pci_blocked);
54 : 32 : opts->pci_blocked = NULL;
55 [ - + ]: 32 : memset(opts, 0, sizeof(struct spdk_app_opts));
56 : 32 : }
57 : :
58 : : static void
59 : 4 : test_spdk_app_parse_args(void)
60 : : {
61 : : spdk_app_parse_args_rvals_t rc;
62 : 4 : struct spdk_app_opts opts = {};
63 : 4 : struct option my_options[2] = {};
64 : 4 : char *valid_argv[test_argc] = {"app_ut",
65 : : "--single-file-segments",
66 : : "-d",
67 : : "-p0",
68 : : "-B",
69 : : "0000:81:00.0"
70 : : };
71 : 4 : char *invalid_argv_BW[test_argc] = {"app_ut",
72 : : "-B",
73 : : "0000:81:00.0",
74 : : "-W",
75 : : "0000:82:00.0",
76 : : "-cspdk.conf"
77 : : };
78 : : /* currently use -z as our new option */
79 : 4 : char *argv_added_short_opt[test_argc] = {"app_ut",
80 : : "-z",
81 : : "-d",
82 : : "--single-file-segments",
83 : : "-p0",
84 : : "-cspdk.conf"
85 : : };
86 : 4 : char *argv_added_long_opt[test_argc] = {"app_ut",
87 : : "-cspdk.conf",
88 : : "-d",
89 : : "-r/var/tmp/spdk.sock",
90 : : "--test-long-opt",
91 : : "--single-file-segments"
92 : : };
93 : 4 : char *invalid_argv_missing_option[test_argc] = {"app_ut",
94 : : "-d",
95 : : "-p",
96 : : "--single-file-segments",
97 : : "--silence-noticelog",
98 : : "-R"
99 : : };
100 : :
101 : : /* Test valid arguments. Expected result: PASS */
102 : 4 : rc = spdk_app_parse_args(test_argc, valid_argv, &opts, "", NULL, unittest_parse_args, NULL);
103 : 4 : CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_SUCCESS);
104 : 4 : optind = 1;
105 : 4 : clean_opts(&opts);
106 : :
107 : : /* Test invalid short option Expected result: FAIL */
108 : 4 : rc = spdk_app_parse_args(test_argc, argv_added_short_opt, &opts, "", NULL, unittest_parse_args,
109 : : NULL);
110 : 4 : CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_FAIL);
111 : 4 : optind = 1;
112 : 4 : clean_opts(&opts);
113 : :
114 : : /* Test valid global and local options. Expected result: PASS */
115 : 4 : rc = spdk_app_parse_args(test_argc, argv_added_short_opt, &opts, "z", NULL, unittest_parse_args,
116 : : unittest_usage);
117 : 4 : CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_SUCCESS);
118 : 4 : optind = 1;
119 : 4 : clean_opts(&opts);
120 : :
121 : : /* Test invalid long option Expected result: FAIL */
122 : 4 : rc = spdk_app_parse_args(test_argc, argv_added_long_opt, &opts, "", NULL, unittest_parse_args,
123 : : NULL);
124 : 4 : CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_FAIL);
125 : 4 : optind = 1;
126 : 4 : clean_opts(&opts);
127 : :
128 : : /* Test valid global and local options. Expected result: PASS */
129 : 4 : my_options[0].name = "test-long-opt";
130 : 4 : rc = spdk_app_parse_args(test_argc, argv_added_long_opt, &opts, "", my_options, unittest_parse_args,
131 : : unittest_usage);
132 : 4 : CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_SUCCESS);
133 : 4 : optind = 1;
134 : 4 : clean_opts(&opts);
135 : :
136 : : /* Test overlapping global and local options. Expected result: FAIL */
137 : 4 : rc = spdk_app_parse_args(test_argc, valid_argv, &opts, SPDK_APP_GETOPT_STRING, NULL,
138 : : unittest_parse_args, NULL);
139 : 4 : CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_FAIL);
140 : 4 : optind = 1;
141 : 4 : clean_opts(&opts);
142 : :
143 : : /* Specify -B and -W options at the same time. Expected result: FAIL */
144 : 4 : rc = spdk_app_parse_args(test_argc, invalid_argv_BW, &opts, "", NULL, unittest_parse_args, NULL);
145 [ - + ]: 4 : SPDK_CU_ASSERT_FATAL(rc == SPDK_APP_PARSE_ARGS_FAIL);
146 : 4 : optind = 1;
147 : 4 : clean_opts(&opts);
148 : :
149 : : /* Omit necessary argument to option */
150 : 4 : rc = spdk_app_parse_args(test_argc, invalid_argv_missing_option, &opts, "", NULL,
151 : : unittest_parse_args, NULL);
152 : 4 : CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_FAIL);
153 : 4 : optind = 1;
154 : 4 : clean_opts(&opts);
155 : 4 : }
156 : :
157 : : int
158 : 4 : main(int argc, char **argv)
159 : : {
160 : 4 : CU_pSuite suite = NULL;
161 : : unsigned int num_failures;
162 : :
163 : 4 : CU_initialize_registry();
164 : :
165 : 4 : suite = CU_add_suite("app_suite", NULL, NULL);
166 : :
167 : 4 : CU_ADD_TEST(suite, test_spdk_app_parse_args);
168 : :
169 : 4 : num_failures = spdk_ut_run_tests(argc, argv, NULL);
170 : 4 : CU_cleanup_registry();
171 : :
172 : 4 : return num_failures;
173 : : }
|