xref: /spdk/test/unit/lib/iscsi/init_grp.c/init_grp_ut.c (revision 60982c759db49b4f4579f16e3b24df0725ba4b94)
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 #include "CUnit/Basic.h"
10 
11 #include "iscsi/init_grp.c"
12 #include "unit/lib/json_mock.c"
13 
14 SPDK_LOG_REGISTER_COMPONENT(iscsi)
15 
16 struct spdk_iscsi_globals g_iscsi = {
17 	.mutex = PTHREAD_MUTEX_INITIALIZER
18 };
19 
20 static int
21 test_setup(void)
22 {
23 	TAILQ_INIT(&g_iscsi.ig_head);
24 	return 0;
25 }
26 
27 static void
28 create_initiator_group_success_case(void)
29 {
30 	struct spdk_iscsi_init_grp *ig;
31 
32 	ig = iscsi_init_grp_create(1);
33 	CU_ASSERT(ig != NULL);
34 
35 	iscsi_init_grp_destroy(ig);
36 }
37 
38 static void
39 find_initiator_group_success_case(void)
40 {
41 	struct spdk_iscsi_init_grp *ig, *tmp;
42 	int rc;
43 
44 	ig = iscsi_init_grp_create(1);
45 	CU_ASSERT(ig != NULL);
46 
47 	rc = iscsi_init_grp_register(ig);
48 	CU_ASSERT(rc == 0);
49 
50 	ig = iscsi_init_grp_find_by_tag(1);
51 	CU_ASSERT(ig != NULL);
52 
53 	tmp = iscsi_init_grp_unregister(1);
54 	CU_ASSERT(ig == tmp);
55 	iscsi_init_grp_destroy(ig);
56 
57 	ig = iscsi_init_grp_find_by_tag(1);
58 	CU_ASSERT(ig == NULL);
59 }
60 
61 static void
62 register_initiator_group_twice_case(void)
63 {
64 	struct spdk_iscsi_init_grp *ig, *tmp;
65 	int rc;
66 
67 	ig = iscsi_init_grp_create(1);
68 	CU_ASSERT(ig != NULL);
69 
70 	rc = iscsi_init_grp_register(ig);
71 	CU_ASSERT(rc == 0);
72 
73 	rc = iscsi_init_grp_register(ig);
74 	CU_ASSERT(rc != 0);
75 
76 	ig = iscsi_init_grp_find_by_tag(1);
77 	CU_ASSERT(ig != NULL);
78 
79 	tmp = iscsi_init_grp_unregister(1);
80 	CU_ASSERT(tmp == ig);
81 	iscsi_init_grp_destroy(ig);
82 
83 	ig = iscsi_init_grp_find_by_tag(1);
84 	CU_ASSERT(ig == NULL);
85 }
86 
87 static void
88 add_initiator_name_success_case(void)
89 {
90 
91 	int rc;
92 	struct spdk_iscsi_init_grp *ig;
93 	struct spdk_iscsi_initiator_name *iname;
94 	char *name1 = "iqn.2017-10.spdk.io:0001";
95 	char *name2 = "iqn.2017-10.spdk.io:0002";
96 
97 	ig = iscsi_init_grp_create(1);
98 	CU_ASSERT(ig != NULL);
99 
100 	/* add two different names to the empty name list */
101 	rc = iscsi_init_grp_add_initiator(ig, name1);
102 	CU_ASSERT(rc == 0);
103 
104 	rc = iscsi_init_grp_add_initiator(ig, name2);
105 	CU_ASSERT(rc == 0);
106 
107 	/* check if two names are added correctly. */
108 	iname = iscsi_init_grp_find_initiator(ig, name1);
109 	CU_ASSERT(iname != NULL);
110 
111 	iname = iscsi_init_grp_find_initiator(ig, name2);
112 	CU_ASSERT(iname != NULL);
113 
114 	/* restore the initial state */
115 	rc = iscsi_init_grp_delete_initiator(ig, name1);
116 	CU_ASSERT(rc == 0);
117 
118 	iname = iscsi_init_grp_find_initiator(ig, name1);
119 	CU_ASSERT(iname == NULL);
120 
121 	rc = iscsi_init_grp_delete_initiator(ig, name2);
122 	CU_ASSERT(rc == 0);
123 
124 	iname = iscsi_init_grp_find_initiator(ig, name2);
125 	CU_ASSERT(iname == NULL);
126 
127 	iscsi_init_grp_destroy(ig);
128 }
129 
130 static void
131 add_initiator_name_fail_case(void)
132 {
133 	int rc;
134 	struct spdk_iscsi_init_grp *ig;
135 	struct spdk_iscsi_initiator_name *iname;
136 	char *name1 = "iqn.2017-10.spdk.io:0001";
137 
138 	ig = iscsi_init_grp_create(1);
139 	CU_ASSERT(ig != NULL);
140 
141 	/* add an name to the full name list */
142 	ig->ninitiators = MAX_INITIATOR;
143 
144 	rc = iscsi_init_grp_add_initiator(ig, name1);
145 	CU_ASSERT(rc != 0);
146 
147 	ig->ninitiators = 0;
148 
149 	/* add the same name to the name list twice */
150 	rc = iscsi_init_grp_add_initiator(ig, name1);
151 	CU_ASSERT(rc == 0);
152 
153 	rc = iscsi_init_grp_add_initiator(ig, name1);
154 	CU_ASSERT(rc != 0);
155 
156 	/* restore the initial state */
157 	rc = iscsi_init_grp_delete_initiator(ig, name1);
158 	CU_ASSERT(rc == 0);
159 
160 	iname = iscsi_init_grp_find_initiator(ig, name1);
161 	CU_ASSERT(iname == NULL);
162 
163 	iscsi_init_grp_destroy(ig);
164 }
165 
166 static void
167 delete_all_initiator_names_success_case(void)
168 {
169 	int rc;
170 	struct spdk_iscsi_init_grp *ig;
171 	struct spdk_iscsi_initiator_name *iname;
172 	char *name1 = "iqn.2017-10.spdk.io:0001";
173 	char *name2 = "iqn.2017-10.spdk.io:0002";
174 
175 	ig = iscsi_init_grp_create(1);
176 	CU_ASSERT(ig != NULL);
177 
178 	/* add two different names to the empty name list */
179 	rc = iscsi_init_grp_add_initiator(ig, name1);
180 	CU_ASSERT(rc == 0);
181 
182 	rc = iscsi_init_grp_add_initiator(ig, name2);
183 	CU_ASSERT(rc == 0);
184 
185 	/* delete all initiator names */
186 	iscsi_init_grp_delete_all_initiators(ig);
187 
188 	/* check if two names are deleted correctly. */
189 	iname = iscsi_init_grp_find_initiator(ig, name1);
190 	CU_ASSERT(iname == NULL);
191 
192 	iname = iscsi_init_grp_find_initiator(ig, name2);
193 	CU_ASSERT(iname == NULL);
194 
195 	/* restore the initial state */
196 	iscsi_init_grp_destroy(ig);
197 }
198 
199 static void
200 add_netmask_success_case(void)
201 {
202 	int rc;
203 	struct spdk_iscsi_init_grp *ig;
204 	struct spdk_iscsi_initiator_netmask *imask;
205 	char *netmask1 = "192.168.2.0";
206 	char *netmask2 = "192.168.2.1";
207 
208 	ig = iscsi_init_grp_create(1);
209 	CU_ASSERT(ig != NULL);
210 
211 	/* add two different netmasks to the empty netmask list */
212 	rc = iscsi_init_grp_add_netmask(ig, netmask1);
213 	CU_ASSERT(rc == 0);
214 
215 	rc = iscsi_init_grp_add_netmask(ig, netmask2);
216 	CU_ASSERT(rc == 0);
217 
218 	/* check if two netmasks are added correctly. */
219 	imask = iscsi_init_grp_find_netmask(ig, netmask1);
220 	CU_ASSERT(imask != NULL);
221 
222 	imask = iscsi_init_grp_find_netmask(ig, netmask2);
223 	CU_ASSERT(imask != NULL);
224 
225 	/* restore the initial state */
226 	rc = iscsi_init_grp_delete_netmask(ig, netmask1);
227 	CU_ASSERT(rc == 0);
228 
229 	imask = iscsi_init_grp_find_netmask(ig, netmask1);
230 	CU_ASSERT(imask == NULL);
231 
232 	rc = iscsi_init_grp_delete_netmask(ig, netmask2);
233 	CU_ASSERT(rc == 0);
234 
235 	imask = iscsi_init_grp_find_netmask(ig, netmask2);
236 	CU_ASSERT(imask == NULL);
237 
238 	iscsi_init_grp_destroy(ig);
239 }
240 
241 static void
242 add_netmask_fail_case(void)
243 {
244 	int rc;
245 	struct spdk_iscsi_init_grp *ig;
246 	struct spdk_iscsi_initiator_netmask *imask;
247 	char *netmask1 = "192.168.2.0";
248 
249 	ig = iscsi_init_grp_create(1);
250 	CU_ASSERT(ig != NULL);
251 
252 	/* add an netmask to the full netmask list */
253 	ig->nnetmasks = MAX_NETMASK;
254 
255 	rc = iscsi_init_grp_add_netmask(ig, netmask1);
256 	CU_ASSERT(rc != 0);
257 
258 	ig->nnetmasks = 0;
259 
260 	/* add the same netmask to the netmask list twice */
261 	rc = iscsi_init_grp_add_netmask(ig, netmask1);
262 	CU_ASSERT(rc == 0);
263 
264 	rc = iscsi_init_grp_add_netmask(ig, netmask1);
265 	CU_ASSERT(rc != 0);
266 
267 	/* restore the initial state */
268 	rc = iscsi_init_grp_delete_netmask(ig, netmask1);
269 	CU_ASSERT(rc == 0);
270 
271 	imask = iscsi_init_grp_find_netmask(ig, netmask1);
272 	CU_ASSERT(imask == NULL);
273 
274 	iscsi_init_grp_destroy(ig);
275 }
276 
277 static void
278 delete_all_netmasks_success_case(void)
279 {
280 	int rc;
281 	struct spdk_iscsi_init_grp *ig;
282 	struct spdk_iscsi_initiator_netmask *imask;
283 	char *netmask1 = "192.168.2.0";
284 	char *netmask2 = "192.168.2.1";
285 
286 	ig = iscsi_init_grp_create(1);
287 	CU_ASSERT(ig != NULL);
288 
289 	/* add two different netmasks to the empty netmask list */
290 	rc = iscsi_init_grp_add_netmask(ig, netmask1);
291 	CU_ASSERT(rc == 0);
292 
293 	rc = iscsi_init_grp_add_netmask(ig, netmask2);
294 	CU_ASSERT(rc == 0);
295 
296 	/* delete all netmasks */
297 	iscsi_init_grp_delete_all_netmasks(ig);
298 
299 	/* check if two netmasks are deleted correctly. */
300 	imask = iscsi_init_grp_find_netmask(ig, netmask1);
301 	CU_ASSERT(imask == NULL);
302 
303 	imask = iscsi_init_grp_find_netmask(ig, netmask2);
304 	CU_ASSERT(imask == NULL);
305 
306 	/* restore the initial state */
307 	iscsi_init_grp_destroy(ig);
308 }
309 
310 static void
311 initiator_name_overwrite_all_to_any_case(void)
312 {
313 	int rc;
314 	struct spdk_iscsi_init_grp *ig;
315 	struct spdk_iscsi_initiator_name *iname;
316 	char *all = "ALL";
317 	char *any = "ANY";
318 	char *all_not = "!ALL";
319 	char *any_not = "!ANY";
320 
321 	ig = iscsi_init_grp_create(1);
322 	CU_ASSERT(ig != NULL);
323 
324 	rc = iscsi_init_grp_add_initiator(ig, all);
325 	CU_ASSERT(rc == 0);
326 
327 	iname = iscsi_init_grp_find_initiator(ig, all);
328 	CU_ASSERT(iname == NULL);
329 
330 	iname = iscsi_init_grp_find_initiator(ig, any);
331 	CU_ASSERT(iname != NULL);
332 
333 	rc = iscsi_init_grp_delete_initiator(ig, any);
334 	CU_ASSERT(rc == 0);
335 
336 	rc = iscsi_init_grp_add_initiator(ig, all_not);
337 	CU_ASSERT(rc == 0);
338 
339 	iname = iscsi_init_grp_find_initiator(ig, all_not);
340 	CU_ASSERT(iname == NULL);
341 
342 	iname = iscsi_init_grp_find_initiator(ig, any_not);
343 	CU_ASSERT(iname != NULL);
344 
345 	rc = iscsi_init_grp_delete_initiator(ig, any_not);
346 	CU_ASSERT(rc == 0);
347 
348 	iscsi_init_grp_destroy(ig);
349 }
350 
351 static void
352 netmask_overwrite_all_to_any_case(void)
353 {
354 	int rc;
355 	struct spdk_iscsi_init_grp *ig;
356 	struct spdk_iscsi_initiator_netmask *imask;
357 	char *all = "ALL";
358 	char *any = "ANY";
359 
360 	ig = iscsi_init_grp_create(1);
361 	CU_ASSERT(ig != NULL);
362 
363 	rc = iscsi_init_grp_add_netmask(ig, all);
364 	CU_ASSERT(rc == 0);
365 
366 	imask = iscsi_init_grp_find_netmask(ig, all);
367 	CU_ASSERT(imask == NULL);
368 
369 	imask = iscsi_init_grp_find_netmask(ig, any);
370 	CU_ASSERT(imask != NULL);
371 
372 	rc = iscsi_init_grp_delete_netmask(ig, any);
373 	CU_ASSERT(rc == 0);
374 
375 	iscsi_init_grp_destroy(ig);
376 }
377 
378 static void
379 add_delete_initiator_names_case(void)
380 {
381 	int rc, i;
382 	struct spdk_iscsi_init_grp *ig;
383 	struct spdk_iscsi_initiator_name *iname;
384 	char *names[3] = {"iqn.2018-02.spdk.io:0001", "iqn.2018-02.spdk.io:0002", "iqn.2018-02.spdk.io:0003"};
385 
386 	ig = iscsi_init_grp_create(1);
387 	SPDK_CU_ASSERT_FATAL(ig != NULL);
388 
389 	rc = iscsi_init_grp_add_initiators(ig, 3, names);
390 	CU_ASSERT(rc == 0);
391 
392 	for (i = 0; i < 3; i++) {
393 		iname = iscsi_init_grp_find_initiator(ig, names[i]);
394 		CU_ASSERT(iname != NULL);
395 	}
396 
397 	rc = iscsi_init_grp_delete_initiators(ig, 3, names);
398 	CU_ASSERT(rc == 0);
399 
400 	if (ig != NULL) {
401 		CU_ASSERT(TAILQ_EMPTY(&ig->initiator_head));
402 	}
403 
404 	iscsi_init_grp_destroy(ig);
405 }
406 
407 static void
408 add_duplicated_initiator_names_case(void)
409 {
410 	int rc;
411 	struct spdk_iscsi_init_grp *ig;
412 	char *names[3] = {"iqn.2018-02.spdk.io:0001", "iqn.2018-02.spdk.io:0002", "iqn.2018-02.spdk.io:0001"};
413 
414 	ig = iscsi_init_grp_create(1);
415 	SPDK_CU_ASSERT_FATAL(ig != NULL);
416 
417 	rc = iscsi_init_grp_add_initiators(ig, 3, names);
418 	CU_ASSERT(rc != 0);
419 
420 	if (ig != NULL) {
421 		CU_ASSERT(TAILQ_EMPTY(&ig->initiator_head));
422 	}
423 
424 	iscsi_init_grp_destroy(ig);
425 }
426 
427 static void
428 delete_nonexisting_initiator_names_case(void)
429 {
430 	int rc, i;
431 	struct spdk_iscsi_init_grp *ig;
432 	struct spdk_iscsi_initiator_name *iname;
433 	char *names1[3] = {"iqn.2018-02.spdk.io:0001", "iqn.2018-02.spdk.io:0002", "iqn.2018-02.spdk.io:0003"};
434 	char *names2[3] = {"iqn.2018-02.spdk.io:0001", "iqn.2018-02.spdk.io:0002", "iqn.2018-02.spdk.io:0004"};
435 
436 	ig = iscsi_init_grp_create(1);
437 	SPDK_CU_ASSERT_FATAL(ig != NULL);
438 
439 	rc = iscsi_init_grp_add_initiators(ig, 3, names1);
440 	CU_ASSERT(rc == 0);
441 
442 	for (i = 0; i < 3; i++) {
443 		iname = iscsi_init_grp_find_initiator(ig, names1[i]);
444 		CU_ASSERT(iname != NULL);
445 	}
446 
447 	rc = iscsi_init_grp_delete_initiators(ig, 3, names2);
448 	CU_ASSERT(rc != 0);
449 
450 	for (i = 0; i < 3; i++) {
451 		iname = iscsi_init_grp_find_initiator(ig, names1[i]);
452 		CU_ASSERT(iname != NULL);
453 	}
454 
455 	rc = iscsi_init_grp_delete_initiators(ig, 3, names1);
456 	CU_ASSERT(rc == 0);
457 
458 	if (ig != NULL) {
459 		CU_ASSERT(TAILQ_EMPTY(&ig->initiator_head));
460 	}
461 
462 	iscsi_init_grp_destroy(ig);
463 }
464 
465 static void
466 add_delete_netmasks_case(void)
467 {
468 	int rc, i;
469 	struct spdk_iscsi_init_grp *ig;
470 	struct spdk_iscsi_initiator_netmask *netmask;
471 	char *netmasks[3] = {"192.168.2.0", "192.168.2.1", "192.168.2.2"};
472 
473 	ig = iscsi_init_grp_create(1);
474 	SPDK_CU_ASSERT_FATAL(ig != NULL);
475 
476 	rc = iscsi_init_grp_add_netmasks(ig, 3, netmasks);
477 	CU_ASSERT(rc == 0);
478 
479 	for (i = 0; i < 3; i++) {
480 		netmask = iscsi_init_grp_find_netmask(ig, netmasks[i]);
481 		CU_ASSERT(netmask != NULL);
482 	}
483 
484 	rc = iscsi_init_grp_delete_netmasks(ig, 3, netmasks);
485 	CU_ASSERT(rc == 0);
486 
487 	if (ig != NULL) {
488 		CU_ASSERT(TAILQ_EMPTY(&ig->netmask_head));
489 	}
490 
491 	iscsi_init_grp_destroy(ig);
492 }
493 
494 static void
495 add_duplicated_netmasks_case(void)
496 {
497 	int rc;
498 	struct spdk_iscsi_init_grp *ig;
499 	char *netmasks[3] = {"192.168.2.0", "192.168.2.1", "192.168.2.0"};
500 
501 	ig = iscsi_init_grp_create(1);
502 	SPDK_CU_ASSERT_FATAL(ig != NULL);
503 
504 	rc = iscsi_init_grp_add_netmasks(ig, 3, netmasks);
505 	CU_ASSERT(rc != 0);
506 
507 	if (ig != NULL) {
508 		CU_ASSERT(TAILQ_EMPTY(&ig->netmask_head));
509 	}
510 
511 	iscsi_init_grp_destroy(ig);
512 }
513 
514 static void
515 delete_nonexisting_netmasks_case(void)
516 {
517 	int rc, i;
518 	struct spdk_iscsi_init_grp *ig;
519 	struct spdk_iscsi_initiator_netmask *netmask;
520 	char *netmasks1[3] = {"192.168.2.0", "192.168.2.1", "192.168.2.2"};
521 	char *netmasks2[3] = {"192.168.2.0", "192.168.2.1", "192.168.2.3"};
522 
523 	ig = iscsi_init_grp_create(1);
524 	SPDK_CU_ASSERT_FATAL(ig != NULL);
525 
526 	rc = iscsi_init_grp_add_netmasks(ig, 3, netmasks1);
527 	CU_ASSERT(rc == 0);
528 
529 	for (i = 0; i < 3; i++) {
530 		netmask = iscsi_init_grp_find_netmask(ig, netmasks1[i]);
531 		CU_ASSERT(netmask != NULL);
532 	}
533 
534 	rc = iscsi_init_grp_delete_netmasks(ig, 3, netmasks2);
535 	CU_ASSERT(rc != 0);
536 
537 	for (i = 0; i < 3; i++) {
538 		netmask = iscsi_init_grp_find_netmask(ig, netmasks1[i]);
539 		CU_ASSERT(netmask != NULL);
540 	}
541 
542 	rc = iscsi_init_grp_delete_netmasks(ig, 3, netmasks1);
543 	CU_ASSERT(rc == 0);
544 
545 	if (ig != NULL) {
546 		CU_ASSERT(TAILQ_EMPTY(&ig->netmask_head));
547 	}
548 
549 	iscsi_init_grp_destroy(ig);
550 }
551 
552 
553 int
554 main(int argc, char **argv)
555 {
556 	CU_pSuite	suite = NULL;
557 	unsigned int	num_failures;
558 
559 	CU_initialize_registry();
560 
561 	suite = CU_add_suite("init_grp_suite", test_setup, NULL);
562 
563 	CU_ADD_TEST(suite, create_initiator_group_success_case);
564 	CU_ADD_TEST(suite, find_initiator_group_success_case);
565 	CU_ADD_TEST(suite, register_initiator_group_twice_case);
566 	CU_ADD_TEST(suite, add_initiator_name_success_case);
567 	CU_ADD_TEST(suite, add_initiator_name_fail_case);
568 	CU_ADD_TEST(suite, delete_all_initiator_names_success_case);
569 	CU_ADD_TEST(suite, add_netmask_success_case);
570 	CU_ADD_TEST(suite, add_netmask_fail_case);
571 	CU_ADD_TEST(suite, delete_all_netmasks_success_case);
572 	CU_ADD_TEST(suite, initiator_name_overwrite_all_to_any_case);
573 	CU_ADD_TEST(suite, netmask_overwrite_all_to_any_case);
574 	CU_ADD_TEST(suite, add_delete_initiator_names_case);
575 	CU_ADD_TEST(suite, add_duplicated_initiator_names_case);
576 	CU_ADD_TEST(suite, delete_nonexisting_initiator_names_case);
577 	CU_ADD_TEST(suite, add_delete_netmasks_case);
578 	CU_ADD_TEST(suite, add_duplicated_netmasks_case);
579 	CU_ADD_TEST(suite, delete_nonexisting_netmasks_case);
580 
581 	num_failures = spdk_ut_run_tests(argc, argv, NULL);
582 	CU_cleanup_registry();
583 	return num_failures;
584 }
585