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_rpc_server_finish, (const char *listen_addr));
29 : 0 : DEFINE_STUB_V(spdk_rpc_server_pause, (const char *listen_addr));
30 : 0 : DEFINE_STUB_V(spdk_rpc_server_resume, (const char *listen_addr));
31 : 0 : DEFINE_STUB_V(spdk_subsystem_init_from_json_config, (const char *json_config_file,
32 : : const char *rpc_addr,
33 : : spdk_subsystem_init_fn cb_fn, void *cb_arg, bool stop_on_error));
34 : 0 : DEFINE_STUB_V(spdk_subsystem_load_config, (void *json, ssize_t json_size,
35 : : spdk_subsystem_init_fn cb_fn, void *cb_arg, bool stop_on_error));
36 : 0 : DEFINE_STUB_V(spdk_reactors_start, (void));
37 : 0 : DEFINE_STUB_V(spdk_reactors_stop, (void *arg1));
38 [ # # ]: 0 : DEFINE_STUB(spdk_reactors_init, int, (size_t msg_mempool_size), 0);
39 : 0 : DEFINE_STUB_V(spdk_reactors_fini, (void));
40 : : bool g_scheduling_in_progress;
41 : :
42 : 4 : SPDK_LOG_REGISTER_COMPONENT(app_rpc);
43 : :
44 : : static void
45 : 0 : unittest_usage(void)
46 : : {
47 : 0 : }
48 : :
49 : : static int
50 : 8 : unittest_parse_args(int ch, char *arg)
51 : : {
52 : 8 : return 0;
53 : : }
54 : :
55 : : static void
56 : 32 : clean_opts(struct spdk_app_opts *opts)
57 : : {
58 : 32 : free(opts->pci_allowed);
59 : 32 : opts->pci_allowed = NULL;
60 : 32 : free(opts->pci_blocked);
61 : 32 : opts->pci_blocked = NULL;
62 [ - + ]: 32 : memset(opts, 0, sizeof(struct spdk_app_opts));
63 : 32 : }
64 : :
65 : : static void
66 : 4 : test_spdk_app_parse_args(void)
67 : : {
68 : : spdk_app_parse_args_rvals_t rc;
69 : 4 : struct spdk_app_opts opts = {};
70 : 4 : struct option my_options[2] = {};
71 : 4 : char *valid_argv[test_argc] = {"app_ut",
72 : : "--single-file-segments",
73 : : "-d",
74 : : "-p0",
75 : : "-B",
76 : : "0000:81:00.0"
77 : : };
78 : 4 : char *invalid_argv_BA[test_argc] = {"app_ut",
79 : : "-B",
80 : : "0000:81:00.0",
81 : : "-A",
82 : : "0000:82:00.0",
83 : : "-cspdk.conf"
84 : : };
85 : : /* currently use -z as our new option */
86 : 4 : char *argv_added_short_opt[test_argc] = {"app_ut",
87 : : "-z",
88 : : "-d",
89 : : "--single-file-segments",
90 : : "-p0",
91 : : "-cspdk.conf"
92 : : };
93 : 4 : char *argv_added_long_opt[test_argc] = {"app_ut",
94 : : "-cspdk.conf",
95 : : "-d",
96 : : "-r/var/tmp/spdk.sock",
97 : : "--test-long-opt",
98 : : "--single-file-segments"
99 : : };
100 : 4 : char *invalid_argv_missing_option[test_argc] = {"app_ut",
101 : : "-d",
102 : : "-p",
103 : : "--single-file-segments",
104 : : "--silence-noticelog",
105 : : "-R"
106 : : };
107 : :
108 : : /* Test valid arguments. Expected result: PASS */
109 : 4 : rc = spdk_app_parse_args(test_argc, valid_argv, &opts, "", NULL, unittest_parse_args, NULL);
110 : 4 : CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_SUCCESS);
111 : 4 : optind = 1;
112 : 4 : clean_opts(&opts);
113 : :
114 : : /* Test invalid short option Expected result: FAIL */
115 : 4 : rc = spdk_app_parse_args(test_argc, argv_added_short_opt, &opts, "", NULL, unittest_parse_args,
116 : : NULL);
117 : 4 : CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_FAIL);
118 : 4 : optind = 1;
119 : 4 : clean_opts(&opts);
120 : :
121 : : /* Test valid global and local options. Expected result: PASS */
122 : 4 : rc = spdk_app_parse_args(test_argc, argv_added_short_opt, &opts, "z", NULL, unittest_parse_args,
123 : : unittest_usage);
124 : 4 : CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_SUCCESS);
125 : 4 : optind = 1;
126 : 4 : clean_opts(&opts);
127 : :
128 : : /* Test invalid long option Expected result: FAIL */
129 : 4 : rc = spdk_app_parse_args(test_argc, argv_added_long_opt, &opts, "", NULL, unittest_parse_args,
130 : : NULL);
131 : 4 : CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_FAIL);
132 : 4 : optind = 1;
133 : 4 : clean_opts(&opts);
134 : :
135 : : /* Test valid global and local options. Expected result: PASS */
136 : 4 : my_options[0].name = "test-long-opt";
137 : 4 : rc = spdk_app_parse_args(test_argc, argv_added_long_opt, &opts, "", my_options, unittest_parse_args,
138 : : unittest_usage);
139 : 4 : CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_SUCCESS);
140 : 4 : optind = 1;
141 : 4 : clean_opts(&opts);
142 : :
143 : : /* Test overlapping global and local options. Expected result: FAIL */
144 : 4 : rc = spdk_app_parse_args(test_argc, valid_argv, &opts, SPDK_APP_GETOPT_STRING, NULL,
145 : : unittest_parse_args, NULL);
146 : 4 : CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_FAIL);
147 : 4 : optind = 1;
148 : 4 : clean_opts(&opts);
149 : :
150 : : /* Specify -B and -A options at the same time. Expected result: FAIL */
151 : 4 : rc = spdk_app_parse_args(test_argc, invalid_argv_BA, &opts, "", NULL, unittest_parse_args, NULL);
152 [ - + ]: 4 : SPDK_CU_ASSERT_FATAL(rc == SPDK_APP_PARSE_ARGS_FAIL);
153 : 4 : optind = 1;
154 : 4 : clean_opts(&opts);
155 : :
156 : : /* Omit necessary argument to option */
157 : 4 : rc = spdk_app_parse_args(test_argc, invalid_argv_missing_option, &opts, "", NULL,
158 : : unittest_parse_args, NULL);
159 : 4 : CU_ASSERT_EQUAL(rc, SPDK_APP_PARSE_ARGS_FAIL);
160 : 4 : optind = 1;
161 : 4 : clean_opts(&opts);
162 : 4 : }
163 : :
164 : : int
165 : 4 : main(int argc, char **argv)
166 : : {
167 : 4 : CU_pSuite suite = NULL;
168 : : unsigned int num_failures;
169 : :
170 : 4 : CU_initialize_registry();
171 : :
172 : 4 : suite = CU_add_suite("app_suite", NULL, NULL);
173 : :
174 : 4 : CU_ADD_TEST(suite, test_spdk_app_parse_args);
175 : :
176 : 4 : num_failures = spdk_ut_run_tests(argc, argv, NULL);
177 : 4 : CU_cleanup_registry();
178 : :
179 : 4 : return num_failures;
180 : : }
|