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_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_set_error_action(CUEA_ABORT); 560 CU_initialize_registry(); 561 562 suite = CU_add_suite("init_grp_suite", test_setup, NULL); 563 564 CU_ADD_TEST(suite, create_initiator_group_success_case); 565 CU_ADD_TEST(suite, find_initiator_group_success_case); 566 CU_ADD_TEST(suite, register_initiator_group_twice_case); 567 CU_ADD_TEST(suite, add_initiator_name_success_case); 568 CU_ADD_TEST(suite, add_initiator_name_fail_case); 569 CU_ADD_TEST(suite, delete_all_initiator_names_success_case); 570 CU_ADD_TEST(suite, add_netmask_success_case); 571 CU_ADD_TEST(suite, add_netmask_fail_case); 572 CU_ADD_TEST(suite, delete_all_netmasks_success_case); 573 CU_ADD_TEST(suite, initiator_name_overwrite_all_to_any_case); 574 CU_ADD_TEST(suite, netmask_overwrite_all_to_any_case); 575 CU_ADD_TEST(suite, add_delete_initiator_names_case); 576 CU_ADD_TEST(suite, add_duplicated_initiator_names_case); 577 CU_ADD_TEST(suite, delete_nonexisting_initiator_names_case); 578 CU_ADD_TEST(suite, add_delete_netmasks_case); 579 CU_ADD_TEST(suite, add_duplicated_netmasks_case); 580 CU_ADD_TEST(suite, delete_nonexisting_netmasks_case); 581 582 CU_basic_set_mode(CU_BRM_VERBOSE); 583 CU_basic_run_tests(); 584 num_failures = CU_get_number_of_failures(); 585 CU_cleanup_registry(); 586 return num_failures; 587 } 588