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
test_setup(void)21 test_setup(void)
22 {
23 TAILQ_INIT(&g_iscsi.ig_head);
24 return 0;
25 }
26
27 static void
create_initiator_group_success_case(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
find_initiator_group_success_case(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
register_initiator_group_twice_case(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
add_initiator_name_success_case(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
add_initiator_name_fail_case(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
delete_all_initiator_names_success_case(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
add_netmask_success_case(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
add_netmask_fail_case(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
delete_all_netmasks_success_case(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
initiator_name_overwrite_all_to_any_case(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
netmask_overwrite_all_to_any_case(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
add_delete_initiator_names_case(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
add_duplicated_initiator_names_case(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
delete_nonexisting_initiator_names_case(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
add_delete_netmasks_case(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
add_duplicated_netmasks_case(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
delete_nonexisting_netmasks_case(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
main(int argc,char ** argv)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