Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright (C) 2017 Intel Corporation.
3 : : * All rights reserved.
4 : : */
5 : :
6 : : #include "spdk/stdinc.h"
7 : :
8 : : #include "spdk_internal/cunit.h"
9 : :
10 : : #include "common/lib/ut_multithread.c"
11 : : #include "common/lib/test_sock.c"
12 : :
13 : : #include "../common.c"
14 : : #include "iscsi/portal_grp.c"
15 : : #include "unit/lib/json_mock.c"
16 : :
17 : 0 : DEFINE_STUB(iscsi_conn_construct, int,
18 : : (struct spdk_iscsi_portal *portal, struct spdk_sock *sock),
19 : : 0);
20 [ # # ]: 0 : DEFINE_STUB(iscsi_check_chap_params, bool,
21 : : (bool disable, bool require, bool mutual, int group),
22 : : false);
23 : :
24 : : struct spdk_iscsi_globals g_iscsi;
25 : :
26 : : static int
27 : 6 : test_setup(void)
28 : : {
29 : 6 : TAILQ_INIT(&g_iscsi.portal_head);
30 : 6 : TAILQ_INIT(&g_iscsi.pg_head);
31 [ - + ]: 6 : pthread_mutex_init(&g_iscsi.mutex, NULL);
32 : 6 : return 0;
33 : : }
34 : :
35 : : static void
36 : 6 : portal_create_ipv4_normal_case(void)
37 : : {
38 : : struct spdk_iscsi_portal *p;
39 : :
40 : 6 : const char *host = "192.168.2.0";
41 : 6 : const char *port = "3260";
42 : :
43 : 6 : p = iscsi_portal_create(host, port);
44 : 6 : CU_ASSERT(p != NULL);
45 : :
46 : 6 : iscsi_portal_destroy(p);
47 : 6 : CU_ASSERT(TAILQ_EMPTY(&g_iscsi.portal_head));
48 : 6 : }
49 : :
50 : : static void
51 : 6 : portal_create_ipv6_normal_case(void)
52 : : {
53 : : struct spdk_iscsi_portal *p;
54 : :
55 : 6 : const char *host = "[2001:ad6:1234::]";
56 : 6 : const char *port = "3260";
57 : :
58 : 6 : p = iscsi_portal_create(host, port);
59 : 6 : CU_ASSERT(p != NULL);
60 : :
61 : 6 : iscsi_portal_destroy(p);
62 : 6 : CU_ASSERT(TAILQ_EMPTY(&g_iscsi.portal_head));
63 : 6 : }
64 : :
65 : : static void
66 : 6 : portal_create_ipv4_wildcard_case(void)
67 : : {
68 : : struct spdk_iscsi_portal *p;
69 : :
70 : 6 : const char *host = "*";
71 : 6 : const char *port = "3260";
72 : :
73 : 6 : p = iscsi_portal_create(host, port);
74 : 6 : CU_ASSERT(p != NULL);
75 : :
76 : 6 : iscsi_portal_destroy(p);
77 : 6 : CU_ASSERT(TAILQ_EMPTY(&g_iscsi.portal_head));
78 : 6 : }
79 : :
80 : : static void
81 : 6 : portal_create_ipv6_wildcard_case(void)
82 : : {
83 : : struct spdk_iscsi_portal *p;
84 : :
85 : 6 : const char *host = "[*]";
86 : 6 : const char *port = "3260";
87 : :
88 : 6 : p = iscsi_portal_create(host, port);
89 : 6 : CU_ASSERT(p != NULL);
90 : :
91 : 6 : iscsi_portal_destroy(p);
92 : 6 : CU_ASSERT(TAILQ_EMPTY(&g_iscsi.portal_head));
93 : 6 : }
94 : :
95 : : static void
96 : 6 : portal_create_twice_case(void)
97 : : {
98 : : struct spdk_iscsi_portal *p1, *p2;
99 : :
100 : 6 : const char *host = "192.168.2.0";
101 : 6 : const char *port = "3260";
102 : :
103 : 6 : p1 = iscsi_portal_create(host, port);
104 : 6 : CU_ASSERT(p1 != NULL);
105 : :
106 : 6 : p2 = iscsi_portal_create(host, port);
107 : 6 : CU_ASSERT(p2 == NULL);
108 : :
109 : 6 : iscsi_portal_destroy(p1);
110 : 6 : CU_ASSERT(TAILQ_EMPTY(&g_iscsi.portal_head));
111 : 6 : }
112 : :
113 : : static void
114 : 6 : portal_grp_register_unregister_case(void)
115 : : {
116 : : struct spdk_iscsi_portal *p;
117 : : struct spdk_iscsi_portal_grp *pg1, *pg2;
118 : : int rc;
119 : 6 : const char *host = "192.168.2.0";
120 : 6 : const char *port = "3260";
121 : :
122 : 6 : pg1 = iscsi_portal_grp_create(1, false);
123 : 6 : CU_ASSERT(pg1 != NULL);
124 : :
125 : 6 : p = iscsi_portal_create(host, port);
126 : 6 : CU_ASSERT(p != NULL);
127 : :
128 : 6 : iscsi_portal_grp_add_portal(pg1, p);
129 : :
130 : 6 : rc = iscsi_portal_grp_register(pg1);
131 : 6 : CU_ASSERT(rc == 0);
132 : :
133 : 6 : pg2 = iscsi_portal_grp_unregister(1);
134 : 6 : CU_ASSERT(pg2 != NULL);
135 : 6 : CU_ASSERT(pg1 == pg2);
136 : :
137 : 6 : CU_ASSERT(TAILQ_EMPTY(&g_iscsi.pg_head));
138 : :
139 : 6 : iscsi_portal_grp_destroy(pg1);
140 : :
141 : 6 : CU_ASSERT(TAILQ_EMPTY(&g_iscsi.portal_head));
142 : 6 : }
143 : :
144 : : static void
145 : 6 : portal_grp_register_twice_case(void)
146 : : {
147 : : struct spdk_iscsi_portal *p;
148 : : struct spdk_iscsi_portal_grp *pg1, *pg2;
149 : : int rc;
150 : 6 : const char *host = "192.168.2.0";
151 : 6 : const char *port = "3260";
152 : :
153 : 6 : pg1 = iscsi_portal_grp_create(1, false);
154 : 6 : CU_ASSERT(pg1 != NULL);
155 : :
156 : 6 : p = iscsi_portal_create(host, port);
157 : 6 : CU_ASSERT(p != NULL);
158 : :
159 : 6 : iscsi_portal_grp_add_portal(pg1, p);
160 : :
161 : 6 : rc = iscsi_portal_grp_register(pg1);
162 : 6 : CU_ASSERT(rc == 0);
163 : :
164 : 6 : rc = iscsi_portal_grp_register(pg1);
165 : 6 : CU_ASSERT(rc != 0);
166 : :
167 : 6 : pg2 = iscsi_portal_grp_unregister(1);
168 : 6 : CU_ASSERT(pg2 != NULL);
169 : 6 : CU_ASSERT(pg1 == pg2);
170 : :
171 : 6 : CU_ASSERT(TAILQ_EMPTY(&g_iscsi.pg_head));
172 : :
173 : 6 : iscsi_portal_grp_destroy(pg1);
174 : :
175 : 6 : CU_ASSERT(TAILQ_EMPTY(&g_iscsi.portal_head));
176 : 6 : }
177 : :
178 : : static void
179 : 6 : portal_grp_add_delete_case(void)
180 : : {
181 : 6 : struct spdk_sock sock = {};
182 : : struct spdk_iscsi_portal_grp *pg1, *pg2;
183 : : struct spdk_iscsi_portal *p;
184 : : int rc;
185 : :
186 : 6 : const char *host = "192.168.2.0";
187 : 6 : const char *port = "3260";
188 : :
189 : 6 : allocate_threads(1);
190 : 6 : set_thread(0);
191 : :
192 : : /* internal of iscsi_create_portal_group */
193 : 6 : pg1 = iscsi_portal_grp_create(1, false);
194 : 6 : CU_ASSERT(pg1 != NULL);
195 : :
196 : 6 : p = iscsi_portal_create(host, port);
197 : 6 : CU_ASSERT(p != NULL);
198 : :
199 : 6 : iscsi_portal_grp_add_portal(pg1, p);
200 : :
201 : 6 : MOCK_SET(spdk_sock_listen, &sock);
202 : 6 : rc = iscsi_portal_grp_open(pg1, false);
203 : 6 : CU_ASSERT(rc == 0);
204 : 6 : MOCK_CLEAR_P(spdk_sock_listen);
205 : :
206 : 6 : rc = iscsi_portal_grp_register(pg1);
207 : 6 : CU_ASSERT(rc == 0);
208 : :
209 : : /* internal of delete_portal_group */
210 : 6 : pg2 = iscsi_portal_grp_unregister(1);
211 : 6 : CU_ASSERT(pg2 != NULL);
212 : 6 : CU_ASSERT(pg1 == pg2);
213 : :
214 : 6 : iscsi_portal_grp_release(pg2);
215 : :
216 : 6 : poll_thread(0);
217 : :
218 : 6 : CU_ASSERT(TAILQ_EMPTY(&g_iscsi.portal_head));
219 : 6 : CU_ASSERT(TAILQ_EMPTY(&g_iscsi.pg_head));
220 : :
221 : 6 : free_threads();
222 : 6 : }
223 : :
224 : : static void
225 : 6 : portal_grp_add_delete_twice_case(void)
226 : : {
227 : 6 : struct spdk_sock sock = {};
228 : : struct spdk_iscsi_portal_grp *pg1, *pg2;
229 : : struct spdk_iscsi_portal *p;
230 : : int rc;
231 : :
232 : 6 : const char *host = "192.168.2.0";
233 : 6 : const char *port1 = "3260", *port2 = "3261";
234 : :
235 : 6 : allocate_threads(1);
236 : 6 : set_thread(0);
237 : :
238 : : /* internal of iscsi_create_portal_group related */
239 : 6 : pg1 = iscsi_portal_grp_create(1, false);
240 : 6 : CU_ASSERT(pg1 != NULL);
241 : :
242 : 6 : p = iscsi_portal_create(host, port1);
243 : 6 : CU_ASSERT(p != NULL);
244 : :
245 : 6 : iscsi_portal_grp_add_portal(pg1, p);
246 : :
247 : 6 : MOCK_SET(spdk_sock_listen, &sock);
248 : 6 : rc = iscsi_portal_grp_open(pg1, false);
249 : 6 : CU_ASSERT(rc == 0);
250 : :
251 : 6 : rc = iscsi_portal_grp_register(pg1);
252 : 6 : CU_ASSERT(rc == 0);
253 : :
254 : : /* internal of iscsi_create_portal_group related */
255 : 6 : pg2 = iscsi_portal_grp_create(2, false);
256 : 6 : CU_ASSERT(pg2 != NULL);
257 : :
258 : 6 : p = iscsi_portal_create(host, port2);
259 : 6 : CU_ASSERT(p != NULL);
260 : :
261 : 6 : iscsi_portal_grp_add_portal(pg2, p);
262 : :
263 : 6 : rc = iscsi_portal_grp_open(pg2, false);
264 : 6 : CU_ASSERT(rc == 0);
265 : :
266 : 6 : rc = iscsi_portal_grp_register(pg2);
267 : 6 : CU_ASSERT(rc == 0);
268 : :
269 : : /* internal of destroy_portal_group related */
270 : 6 : iscsi_portal_grp_close(pg1);
271 : 6 : iscsi_portal_grp_close(pg2);
272 : :
273 : 6 : poll_thread(0);
274 : :
275 : 6 : iscsi_portal_grps_destroy();
276 : :
277 : 6 : CU_ASSERT(TAILQ_EMPTY(&g_iscsi.portal_head));
278 : 6 : CU_ASSERT(TAILQ_EMPTY(&g_iscsi.pg_head));
279 : :
280 : 6 : MOCK_CLEAR_P(spdk_sock_listen);
281 : :
282 : 6 : free_threads();
283 : 6 : }
284 : :
285 : : int
286 : 6 : main(int argc, char **argv)
287 : : {
288 : 6 : CU_pSuite suite = NULL;
289 : : unsigned int num_failures;
290 : :
291 : 6 : CU_initialize_registry();
292 : :
293 : 6 : suite = CU_add_suite("portal_grp_suite", test_setup, NULL);
294 : :
295 : 6 : CU_ADD_TEST(suite, portal_create_ipv4_normal_case);
296 : 6 : CU_ADD_TEST(suite, portal_create_ipv6_normal_case);
297 : 6 : CU_ADD_TEST(suite, portal_create_ipv4_wildcard_case);
298 : 6 : CU_ADD_TEST(suite, portal_create_ipv6_wildcard_case);
299 : 6 : CU_ADD_TEST(suite, portal_create_twice_case);
300 : 6 : CU_ADD_TEST(suite, portal_grp_register_unregister_case);
301 : 6 : CU_ADD_TEST(suite, portal_grp_register_twice_case);
302 : 6 : CU_ADD_TEST(suite, portal_grp_add_delete_case);
303 : 6 : CU_ADD_TEST(suite, portal_grp_add_delete_twice_case);
304 : :
305 : 6 : num_failures = spdk_ut_run_tests(argc, argv, NULL);
306 : 6 : CU_cleanup_registry();
307 : 6 : return num_failures;
308 : : }
|