]> git.proxmox.com Git - ceph.git/blame - ceph/src/spdk/test/unit/lib/iscsi/portal_grp.c/portal_grp_ut.c
import 15.2.0 Octopus source
[ceph.git] / ceph / src / spdk / test / unit / lib / iscsi / portal_grp.c / portal_grp_ut.c
CommitLineData
11fdf7f2
TL
1/*-
2 * BSD LICENSE
3 *
4 * Copyright (c) Intel Corporation.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
16 * distribution.
17 * * Neither the name of Intel Corporation nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34#include "spdk/stdinc.h"
35#include "spdk/event.h"
36
37#include "spdk_cunit.h"
38
9f95a23c
TL
39#include "common/lib/test_env.c"
40#include "common/lib/test_sock.c"
41
11fdf7f2
TL
42#include "../common.c"
43#include "iscsi/portal_grp.c"
44#include "unit/lib/json_mock.c"
45
9f95a23c
TL
46#include "spdk_internal/thread.h"
47
48DEFINE_STUB(spdk_iscsi_conn_construct, int,
49 (struct spdk_iscsi_portal *portal, struct spdk_sock *sock),
50 0);
51
11fdf7f2
TL
52struct spdk_iscsi_globals g_spdk_iscsi;
53
54static int
55test_setup(void)
56{
57 TAILQ_INIT(&g_spdk_iscsi.portal_head);
58 TAILQ_INIT(&g_spdk_iscsi.pg_head);
59 pthread_mutex_init(&g_spdk_iscsi.mutex, NULL);
60 return 0;
61}
62
63static void
64portal_create_ipv4_normal_case(void)
65{
66 struct spdk_iscsi_portal *p;
67
68 const char *host = "192.168.2.0";
69 const char *port = "3260";
70 const char *cpumask = "1";
71
72 p = spdk_iscsi_portal_create(host, port, cpumask);
73 CU_ASSERT(p != NULL);
74
75 spdk_iscsi_portal_destroy(p);
76 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
77}
78
79static void
80portal_create_ipv6_normal_case(void)
81{
82 struct spdk_iscsi_portal *p;
83
84 const char *host = "[2001:ad6:1234::]";
85 const char *port = "3260";
86 const char *cpumask = "1";
87
88 p = spdk_iscsi_portal_create(host, port, cpumask);
89 CU_ASSERT(p != NULL);
90
91 spdk_iscsi_portal_destroy(p);
92 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
93}
94
95static void
96portal_create_ipv4_wildcard_case(void)
97{
98 struct spdk_iscsi_portal *p;
99
100 const char *host = "*";
101 const char *port = "3260";
102 const char *cpumask = "1";
103
104 p = spdk_iscsi_portal_create(host, port, cpumask);
105 CU_ASSERT(p != NULL);
106
107 spdk_iscsi_portal_destroy(p);
108 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
109}
110
111static void
112portal_create_ipv6_wildcard_case(void)
113{
114 struct spdk_iscsi_portal *p;
115
116 const char *host = "[*]";
117 const char *port = "3260";
118 const char *cpumask = "1";
119
120 p = spdk_iscsi_portal_create(host, port, cpumask);
121 CU_ASSERT(p != NULL);
122
123 spdk_iscsi_portal_destroy(p);
124 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
125}
126
127static void
128portal_create_cpumask_null_case(void)
129{
130 struct spdk_iscsi_portal *p;
131
132 const char *host = "192.168.2.0";
133 const char *port = "3260";
134 const char *cpumask = NULL;
135
136 p = spdk_iscsi_portal_create(host, port, cpumask);
137 CU_ASSERT(p != NULL);
138
139 spdk_iscsi_portal_destroy(p);
140 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
141}
142
143static void
144portal_create_cpumask_no_bit_on_case(void)
145{
146 struct spdk_iscsi_portal *p;
147
148 const char *host = "192.168.2.0";
149 const char *port = "3260";
150 const char *cpumask = "0";
151
152 p = spdk_iscsi_portal_create(host, port, cpumask);
153 CU_ASSERT(p == NULL);
154}
155
156static void
157portal_create_twice_case(void)
158{
159 struct spdk_iscsi_portal *p1, *p2;
160
161 const char *host = "192.168.2.0";
162 const char *port = "3260";
163 const char *cpumask = "1";
164
165 p1 = spdk_iscsi_portal_create(host, port, cpumask);
166 CU_ASSERT(p1 != NULL);
167
168 p2 = spdk_iscsi_portal_create(host, port, cpumask);
169 CU_ASSERT(p2 == NULL);
170
171 spdk_iscsi_portal_destroy(p1);
172 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
173}
174
175static void
176parse_portal_ipv4_normal_case(void)
177{
178 const char *string = "192.168.2.0:3260@1";
179 const char *host_str = "192.168.2.0";
180 const char *port_str = "3260";
181 struct spdk_cpuset *cpumask_val;
182 struct spdk_iscsi_portal *p = NULL;
183 int rc;
184
185 cpumask_val = spdk_cpuset_alloc();
186 SPDK_CU_ASSERT_FATAL(cpumask_val != NULL);
187
188 spdk_cpuset_set_cpu(cpumask_val, 0, true);
189
9f95a23c 190 rc = iscsi_parse_portal(string, &p, 0);
11fdf7f2
TL
191 CU_ASSERT(rc == 0);
192 SPDK_CU_ASSERT_FATAL(p != NULL);
193 CU_ASSERT(strcmp(p->host, host_str) == 0);
194 CU_ASSERT(strcmp(p->port, port_str) == 0);
195 CU_ASSERT(spdk_cpuset_equal(p->cpumask, cpumask_val));
196
197 spdk_iscsi_portal_destroy(p);
198 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
199
200 spdk_cpuset_free(cpumask_val);
201}
202
203static void
204parse_portal_ipv6_normal_case(void)
205{
206 const char *string = "[2001:ad6:1234::]:3260@1";
207 const char *host_str = "[2001:ad6:1234::]";
208 const char *port_str = "3260";
209 struct spdk_cpuset *cpumask_val;
210 struct spdk_iscsi_portal *p = NULL;
211 int rc;
212
213 cpumask_val = spdk_cpuset_alloc();
214 SPDK_CU_ASSERT_FATAL(cpumask_val != NULL);
215
216 spdk_cpuset_set_cpu(cpumask_val, 0, true);
217
9f95a23c 218 rc = iscsi_parse_portal(string, &p, 0);
11fdf7f2
TL
219 CU_ASSERT(rc == 0);
220 SPDK_CU_ASSERT_FATAL(p != NULL);
221 CU_ASSERT(strcmp(p->host, host_str) == 0);
222 CU_ASSERT(strcmp(p->port, port_str) == 0);
223 CU_ASSERT(spdk_cpuset_equal(p->cpumask, cpumask_val));
224
225 spdk_iscsi_portal_destroy(p);
226 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
227
228 spdk_cpuset_free(cpumask_val);
229}
230
231static void
232parse_portal_ipv4_skip_cpumask_case(void)
233{
234 const char *string = "192.168.2.0:3260";
235 const char *host_str = "192.168.2.0";
236 const char *port_str = "3260";
237 struct spdk_cpuset *cpumask_val;
238 struct spdk_iscsi_portal *p = NULL;
239 int rc;
240
241 cpumask_val = spdk_app_get_core_mask();
242
9f95a23c 243 rc = iscsi_parse_portal(string, &p, 0);
11fdf7f2
TL
244 CU_ASSERT(rc == 0);
245 SPDK_CU_ASSERT_FATAL(p != NULL);
246 CU_ASSERT(strcmp(p->host, host_str) == 0);
247 CU_ASSERT(strcmp(p->port, port_str) == 0);
248 CU_ASSERT(spdk_cpuset_equal(p->cpumask, cpumask_val));
249
250 spdk_iscsi_portal_destroy(p);
251 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
252}
253
254static void
255parse_portal_ipv6_skip_cpumask_case(void)
256{
257 const char *string = "[2001:ad6:1234::]:3260";
258 const char *host_str = "[2001:ad6:1234::]";
259 const char *port_str = "3260";
260 struct spdk_cpuset *cpumask_val;
261 struct spdk_iscsi_portal *p = NULL;
262 int rc;
263
264 cpumask_val = spdk_app_get_core_mask();
265
9f95a23c 266 rc = iscsi_parse_portal(string, &p, 0);
11fdf7f2
TL
267 CU_ASSERT(rc == 0);
268 SPDK_CU_ASSERT_FATAL(p != NULL);
269 CU_ASSERT(strcmp(p->host, host_str) == 0);
270 CU_ASSERT(strcmp(p->port, port_str) == 0);
271 CU_ASSERT(spdk_cpuset_equal(p->cpumask, cpumask_val));
272
273 spdk_iscsi_portal_destroy(p);
274 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
275}
276
277static void
278parse_portal_ipv4_skip_port_and_cpumask_case(void)
279{
280 const char *string = "192.168.2.0";
281 const char *host_str = "192.168.2.0";
282 const char *port_str = "3260";
283 struct spdk_cpuset *cpumask_val;
284 struct spdk_iscsi_portal *p = NULL;
285 int rc;
286
287 cpumask_val = spdk_app_get_core_mask();
288
9f95a23c 289 rc = iscsi_parse_portal(string, &p, 0);
11fdf7f2
TL
290 CU_ASSERT(rc == 0);
291 SPDK_CU_ASSERT_FATAL(p != NULL);
292 CU_ASSERT(strcmp(p->host, host_str) == 0);
293 CU_ASSERT(strcmp(p->port, port_str) == 0);
294 CU_ASSERT(spdk_cpuset_equal(p->cpumask, cpumask_val));
295
296 spdk_iscsi_portal_destroy(p);
297 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
298}
299
300static void
301parse_portal_ipv6_skip_port_and_cpumask_case(void)
302{
303 const char *string = "[2001:ad6:1234::]";
304 const char *host_str = "[2001:ad6:1234::]";
305 const char *port_str = "3260";
306 struct spdk_cpuset *cpumask_val;
307 struct spdk_iscsi_portal *p = NULL;
308 int rc;
309
310 cpumask_val = spdk_app_get_core_mask();
311
9f95a23c 312 rc = iscsi_parse_portal(string, &p, 0);
11fdf7f2
TL
313 CU_ASSERT(rc == 0);
314 SPDK_CU_ASSERT_FATAL(p != NULL);
315 CU_ASSERT(strcmp(p->host, host_str) == 0);
316 CU_ASSERT(strcmp(p->port, port_str) == 0);
317 CU_ASSERT(spdk_cpuset_equal(p->cpumask, cpumask_val));
318
319 spdk_iscsi_portal_destroy(p);
320 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
321}
322
323static void
324portal_grp_register_unregister_case(void)
325{
326 struct spdk_iscsi_portal *p;
327 struct spdk_iscsi_portal_grp *pg1, *pg2;
328 int rc;
329 const char *host = "192.168.2.0";
330 const char *port = "3260";
331 const char *cpumask = "1";
332
333 pg1 = spdk_iscsi_portal_grp_create(1);
334 CU_ASSERT(pg1 != NULL);
335
336 p = spdk_iscsi_portal_create(host, port, cpumask);
337 CU_ASSERT(p != NULL);
338
339 spdk_iscsi_portal_grp_add_portal(pg1, p);
340
341 rc = spdk_iscsi_portal_grp_register(pg1);
342 CU_ASSERT(rc == 0);
343
344 pg2 = spdk_iscsi_portal_grp_unregister(1);
345 CU_ASSERT(pg2 != NULL);
346 CU_ASSERT(pg1 == pg2);
347
348 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.pg_head));
349
350 spdk_iscsi_portal_grp_destroy(pg1);
351
352 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
353}
354
355static void
356portal_grp_register_twice_case(void)
357{
358 struct spdk_iscsi_portal *p;
359 struct spdk_iscsi_portal_grp *pg1, *pg2;
360 int rc;
361 const char *host = "192.168.2.0";
362 const char *port = "3260";
363 const char *cpumask = "1";
364
365 pg1 = spdk_iscsi_portal_grp_create(1);
366 CU_ASSERT(pg1 != NULL);
367
368 p = spdk_iscsi_portal_create(host, port, cpumask);
369 CU_ASSERT(p != NULL);
370
371 spdk_iscsi_portal_grp_add_portal(pg1, p);
372
373 rc = spdk_iscsi_portal_grp_register(pg1);
374 CU_ASSERT(rc == 0);
375
376 rc = spdk_iscsi_portal_grp_register(pg1);
377 CU_ASSERT(rc != 0);
378
379 pg2 = spdk_iscsi_portal_grp_unregister(1);
380 CU_ASSERT(pg2 != NULL);
381 CU_ASSERT(pg1 == pg2);
382
383 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.pg_head));
384
385 spdk_iscsi_portal_grp_destroy(pg1);
386
387 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
388}
389
390static void
391portal_grp_add_delete_case(void)
392{
9f95a23c
TL
393 struct spdk_sock sock = {};
394 struct spdk_thread *thread;
11fdf7f2
TL
395 struct spdk_iscsi_portal_grp *pg1, *pg2;
396 struct spdk_iscsi_portal *p;
397 int rc;
398
9f95a23c
TL
399 thread = spdk_thread_create(NULL, NULL);
400 spdk_set_thread(thread);
401
11fdf7f2
TL
402 const char *host = "192.168.2.0";
403 const char *port = "3260";
404 const char *cpumask = "1";
405
406 /* internal of add_portal_group */
407 pg1 = spdk_iscsi_portal_grp_create(1);
408 CU_ASSERT(pg1 != NULL);
409
410 p = spdk_iscsi_portal_create(host, port, cpumask);
411 CU_ASSERT(p != NULL);
412
413 spdk_iscsi_portal_grp_add_portal(pg1, p);
414
9f95a23c 415 MOCK_SET(spdk_sock_listen, &sock);
11fdf7f2
TL
416 rc = spdk_iscsi_portal_grp_open(pg1);
417 CU_ASSERT(rc == 0);
9f95a23c 418 MOCK_CLEAR_P(spdk_sock_listen);
11fdf7f2
TL
419
420 rc = spdk_iscsi_portal_grp_register(pg1);
421 CU_ASSERT(rc == 0);
422
423 /* internal of delete_portal_group */
424 pg2 = spdk_iscsi_portal_grp_unregister(1);
425 CU_ASSERT(pg2 != NULL);
426 CU_ASSERT(pg1 == pg2);
427
428 spdk_iscsi_portal_grp_release(pg2);
429
430 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
431 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.pg_head));
9f95a23c
TL
432
433 spdk_thread_exit(thread);
434 spdk_thread_destroy(thread);
435}
436
437static void
438portal_grp_add_delete_twice_case(void)
439{
440 struct spdk_sock sock = {};
441 struct spdk_thread *thread;
442 struct spdk_iscsi_portal_grp *pg1, *pg2;
443 struct spdk_iscsi_portal *p;
444 int rc;
445
446 const char *host = "192.168.2.0";
447 const char *port1 = "3260", *port2 = "3261";
448 const char *cpumask = "1";
449
450 thread = spdk_thread_create(NULL, NULL);
451 spdk_set_thread(thread);
452
453 /* internal of add_portal_group related */
454 pg1 = spdk_iscsi_portal_grp_create(1);
455 CU_ASSERT(pg1 != NULL);
456
457 p = spdk_iscsi_portal_create(host, port1, cpumask);
458 CU_ASSERT(p != NULL);
459
460 spdk_iscsi_portal_grp_add_portal(pg1, p);
461
462 MOCK_SET(spdk_sock_listen, &sock);
463 rc = spdk_iscsi_portal_grp_open(pg1);
464 CU_ASSERT(rc == 0);
465
466 rc = spdk_iscsi_portal_grp_register(pg1);
467 CU_ASSERT(rc == 0);
468
469 /* internal of add_portal_group related */
470 pg2 = spdk_iscsi_portal_grp_create(2);
471 CU_ASSERT(pg2 != NULL);
472
473 p = spdk_iscsi_portal_create(host, port2, cpumask);
474 CU_ASSERT(p != NULL);
475
476 spdk_iscsi_portal_grp_add_portal(pg2, p);
477
478 rc = spdk_iscsi_portal_grp_open(pg2);
479 CU_ASSERT(rc == 0);
480
481 rc = spdk_iscsi_portal_grp_register(pg2);
482 CU_ASSERT(rc == 0);
483
484 /* internal of destroy_portal_group related */
485 iscsi_portal_grp_close(pg1);
486 iscsi_portal_grp_close(pg2);
487
488 spdk_iscsi_portal_grps_destroy();
489
490 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head));
491 CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.pg_head));
492
493 MOCK_CLEAR_P(spdk_sock_listen);
494 spdk_thread_exit(thread);
495 spdk_thread_destroy(thread);
11fdf7f2
TL
496}
497
498int
499main(int argc, char **argv)
500{
501 CU_pSuite suite = NULL;
502 unsigned int num_failures;
503
504 if (CU_initialize_registry() != CUE_SUCCESS) {
505 return CU_get_error();
506 }
507
508 suite = CU_add_suite("portal_grp_suite", test_setup, NULL);
509 if (suite == NULL) {
510 CU_cleanup_registry();
511 return CU_get_error();
512 }
513
514 if (
515 CU_add_test(suite, "portal create ipv4 normal case",
516 portal_create_ipv4_normal_case) == NULL
517 || CU_add_test(suite, "portal create ipv6 normal case",
518 portal_create_ipv6_normal_case) == NULL
519 || CU_add_test(suite, "portal create ipv4 wildcard case",
520 portal_create_ipv4_wildcard_case) == NULL
521 || CU_add_test(suite, "portal create ipv6 wildcard case",
522 portal_create_ipv6_wildcard_case) == NULL
523 || CU_add_test(suite, "portal create cpumask NULL case",
524 portal_create_cpumask_null_case) == NULL
525 || CU_add_test(suite, "portal create cpumask no bit on case",
526 portal_create_cpumask_no_bit_on_case) == NULL
527 || CU_add_test(suite, "portal create twice case",
528 portal_create_twice_case) == NULL
529 || CU_add_test(suite, "parse portal ipv4 normal case",
530 parse_portal_ipv4_normal_case) == NULL
531 || CU_add_test(suite, "parse portal ipv6 normal case",
532 parse_portal_ipv6_normal_case) == NULL
533 || CU_add_test(suite, "parse portal ipv4 skip cpumask case",
534 parse_portal_ipv4_skip_cpumask_case) == NULL
535 || CU_add_test(suite, "parse portal ipv6 skip cpumask case",
536 parse_portal_ipv6_skip_cpumask_case) == NULL
537 || CU_add_test(suite, "parse portal ipv4 skip port and cpumask case",
538 parse_portal_ipv4_skip_port_and_cpumask_case) == NULL
539 || CU_add_test(suite, "parse portal ipv6 skip port and cpumask case",
540 parse_portal_ipv6_skip_port_and_cpumask_case) == NULL
541 || CU_add_test(suite, "portal group register/unregister case",
542 portal_grp_register_unregister_case) == NULL
543 || CU_add_test(suite, "portal group register twice case",
544 portal_grp_register_twice_case) == NULL
545 || CU_add_test(suite, "portal group add/delete case",
546 portal_grp_add_delete_case) == NULL
9f95a23c
TL
547 || CU_add_test(suite, "portal group add/delete twice case",
548 portal_grp_add_delete_twice_case) == NULL
11fdf7f2
TL
549 ) {
550 CU_cleanup_registry();
551 return CU_get_error();
552 }
553
554 CU_basic_set_mode(CU_BRM_VERBOSE);
555 CU_basic_run_tests();
556 num_failures = CU_get_number_of_failures();
557 CU_cleanup_registry();
558 return num_failures;
559}