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 36 #include "CUnit/Basic.h" 37 #include "spdk_cunit.h" 38 39 #include "spdk/util.h" 40 41 #include "scsi/dev.c" 42 #include "scsi/port.c" 43 44 #include "spdk_internal/mock.h" 45 46 /* Unit test bdev mockup */ 47 struct spdk_bdev { 48 char name[100]; 49 }; 50 51 static struct spdk_bdev g_bdevs[] = { 52 {"malloc0"}, 53 {"malloc1"}, 54 }; 55 56 static struct spdk_scsi_port *g_initiator_port_with_pending_tasks = NULL; 57 static struct spdk_scsi_port *g_initiator_port_with_pending_mgmt_tasks = NULL; 58 59 const char * 60 spdk_bdev_get_name(const struct spdk_bdev *bdev) 61 { 62 return bdev->name; 63 } 64 65 static struct spdk_scsi_task * 66 spdk_get_task(uint32_t *owner_task_ctr) 67 { 68 struct spdk_scsi_task *task; 69 70 task = calloc(1, sizeof(*task)); 71 if (!task) { 72 return NULL; 73 } 74 75 return task; 76 } 77 78 void 79 spdk_scsi_task_put(struct spdk_scsi_task *task) 80 { 81 free(task); 82 } 83 84 struct spdk_scsi_lun *spdk_scsi_lun_construct(struct spdk_bdev *bdev, 85 void (*hotremove_cb)(const struct spdk_scsi_lun *, void *), 86 void *hotremove_ctx) 87 { 88 struct spdk_scsi_lun *lun; 89 90 lun = calloc(1, sizeof(struct spdk_scsi_lun)); 91 SPDK_CU_ASSERT_FATAL(lun != NULL); 92 93 lun->bdev = bdev; 94 95 return lun; 96 } 97 98 void 99 spdk_scsi_lun_destruct(struct spdk_scsi_lun *lun) 100 { 101 free(lun); 102 } 103 104 struct spdk_bdev * 105 spdk_bdev_get_by_name(const char *bdev_name) 106 { 107 size_t i; 108 109 for (i = 0; i < SPDK_COUNTOF(g_bdevs); i++) { 110 if (strcmp(bdev_name, g_bdevs[i].name) == 0) { 111 return &g_bdevs[i]; 112 } 113 } 114 115 return NULL; 116 } 117 118 DEFINE_STUB_V(spdk_scsi_lun_append_mgmt_task, 119 (struct spdk_scsi_lun *lun, struct spdk_scsi_task *task)); 120 121 DEFINE_STUB_V(spdk_scsi_lun_execute_mgmt_task, (struct spdk_scsi_lun *lun)); 122 123 DEFINE_STUB_V(spdk_scsi_lun_append_task, 124 (struct spdk_scsi_lun *lun, struct spdk_scsi_task *task)); 125 126 DEFINE_STUB_V(spdk_scsi_lun_execute_tasks, (struct spdk_scsi_lun *lun)); 127 128 DEFINE_STUB(_spdk_scsi_lun_allocate_io_channel, int, 129 (struct spdk_scsi_lun *lun), 0); 130 131 DEFINE_STUB_V(_spdk_scsi_lun_free_io_channel, (struct spdk_scsi_lun *lun)); 132 133 bool 134 spdk_scsi_lun_has_pending_mgmt_tasks(const struct spdk_scsi_lun *lun, 135 const struct spdk_scsi_port *initiator_port) 136 { 137 return (g_initiator_port_with_pending_mgmt_tasks == initiator_port); 138 } 139 140 bool 141 spdk_scsi_lun_has_pending_tasks(const struct spdk_scsi_lun *lun, 142 const struct spdk_scsi_port *initiator_port) 143 { 144 return (g_initiator_port_with_pending_tasks == initiator_port); 145 } 146 147 static void 148 dev_destruct_null_dev(void) 149 { 150 /* pass null for the dev */ 151 spdk_scsi_dev_destruct(NULL, NULL, NULL); 152 } 153 154 static void 155 dev_destruct_zero_luns(void) 156 { 157 struct spdk_scsi_dev dev = { .is_allocated = 1 }; 158 159 /* No luns attached to the dev */ 160 161 /* free the dev */ 162 spdk_scsi_dev_destruct(&dev, NULL, NULL); 163 } 164 165 static void 166 dev_destruct_null_lun(void) 167 { 168 struct spdk_scsi_dev dev = { .is_allocated = 1 }; 169 170 /* pass null for the lun */ 171 dev.lun[0] = NULL; 172 173 /* free the dev */ 174 spdk_scsi_dev_destruct(&dev, NULL, NULL); 175 } 176 177 static void 178 dev_destruct_success(void) 179 { 180 struct spdk_scsi_dev dev = { .is_allocated = 1 }; 181 int rc; 182 183 /* dev with a single lun */ 184 rc = spdk_scsi_dev_add_lun(&dev, "malloc0", 0, NULL, NULL); 185 186 CU_ASSERT(rc == 0); 187 188 /* free the dev */ 189 spdk_scsi_dev_destruct(&dev, NULL, NULL); 190 191 } 192 193 static void 194 dev_construct_num_luns_zero(void) 195 { 196 struct spdk_scsi_dev *dev; 197 const char *bdev_name_list[1] = {}; 198 int lun_id_list[1] = { 0 }; 199 200 dev = spdk_scsi_dev_construct("Name", bdev_name_list, lun_id_list, 0, 201 SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI, NULL, NULL); 202 203 /* dev should be null since we passed num_luns = 0 */ 204 CU_ASSERT_TRUE(dev == NULL); 205 } 206 207 static void 208 dev_construct_no_lun_zero(void) 209 { 210 struct spdk_scsi_dev *dev; 211 const char *bdev_name_list[1] = {}; 212 int lun_id_list[1] = { 0 }; 213 214 lun_id_list[0] = 1; 215 216 dev = spdk_scsi_dev_construct("Name", bdev_name_list, lun_id_list, 1, 217 SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI, NULL, NULL); 218 219 /* dev should be null since no LUN0 was specified (lun_id_list[0] = 1) */ 220 CU_ASSERT_TRUE(dev == NULL); 221 } 222 223 static void 224 dev_construct_null_lun(void) 225 { 226 struct spdk_scsi_dev *dev; 227 const char *bdev_name_list[1] = {}; 228 int lun_id_list[1] = { 0 }; 229 230 dev = spdk_scsi_dev_construct("Name", bdev_name_list, lun_id_list, 1, 231 SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI, NULL, NULL); 232 233 /* dev should be null since no LUN0 was specified (lun_list[0] = NULL) */ 234 CU_ASSERT_TRUE(dev == NULL); 235 } 236 237 static void 238 dev_construct_name_too_long(void) 239 { 240 struct spdk_scsi_dev *dev; 241 const char *bdev_name_list[1] = {"malloc0"}; 242 int lun_id_list[1] = { 0 }; 243 char name[SPDK_SCSI_DEV_MAX_NAME + 1 + 1]; 244 245 /* Try to construct a dev with a name that is one byte longer than allowed. */ 246 memset(name, 'x', sizeof(name) - 1); 247 name[sizeof(name) - 1] = '\0'; 248 249 dev = spdk_scsi_dev_construct(name, bdev_name_list, lun_id_list, 1, 250 SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI, NULL, NULL); 251 252 CU_ASSERT(dev == NULL); 253 } 254 255 static void 256 dev_construct_success(void) 257 { 258 struct spdk_scsi_dev *dev; 259 const char *bdev_name_list[1] = {"malloc0"}; 260 int lun_id_list[1] = { 0 }; 261 262 dev = spdk_scsi_dev_construct("Name", bdev_name_list, lun_id_list, 1, 263 SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI, NULL, NULL); 264 265 /* Successfully constructs and returns a dev */ 266 CU_ASSERT_TRUE(dev != NULL); 267 268 /* free the dev */ 269 spdk_scsi_dev_destruct(dev, NULL, NULL); 270 } 271 272 static void 273 dev_construct_success_lun_zero_not_first(void) 274 { 275 struct spdk_scsi_dev *dev; 276 const char *bdev_name_list[2] = {"malloc1", "malloc0"}; 277 int lun_id_list[2] = { 1, 0 }; 278 279 dev = spdk_scsi_dev_construct("Name", bdev_name_list, lun_id_list, 2, 280 SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI, NULL, NULL); 281 282 /* Successfully constructs and returns a dev */ 283 CU_ASSERT_TRUE(dev != NULL); 284 285 /* free the dev */ 286 spdk_scsi_dev_destruct(dev, NULL, NULL); 287 } 288 289 static void 290 dev_queue_mgmt_task_success(void) 291 { 292 struct spdk_scsi_dev *dev; 293 const char *bdev_name_list[1] = {"malloc0"}; 294 int lun_id_list[1] = { 0 }; 295 struct spdk_scsi_task *task; 296 297 dev = spdk_scsi_dev_construct("Name", bdev_name_list, lun_id_list, 1, 298 SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI, NULL, NULL); 299 300 /* Successfully constructs and returns a dev */ 301 CU_ASSERT_TRUE(dev != NULL); 302 303 task = spdk_get_task(NULL); 304 305 task->function = SPDK_SCSI_TASK_FUNC_LUN_RESET; 306 spdk_scsi_dev_queue_mgmt_task(dev, task); 307 308 spdk_scsi_task_put(task); 309 310 spdk_scsi_dev_destruct(dev, NULL, NULL); 311 } 312 313 static void 314 dev_queue_task_success(void) 315 { 316 struct spdk_scsi_dev *dev; 317 const char *bdev_name_list[1] = {"malloc0"}; 318 int lun_id_list[1] = { 0 }; 319 struct spdk_scsi_task *task; 320 321 dev = spdk_scsi_dev_construct("Name", bdev_name_list, lun_id_list, 1, 322 SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI, NULL, NULL); 323 324 /* Successfully constructs and returns a dev */ 325 CU_ASSERT_TRUE(dev != NULL); 326 327 task = spdk_get_task(NULL); 328 329 spdk_scsi_dev_queue_task(dev, task); 330 331 spdk_scsi_task_put(task); 332 333 spdk_scsi_dev_destruct(dev, NULL, NULL); 334 } 335 336 static void 337 dev_stop_success(void) 338 { 339 struct spdk_scsi_dev dev = { 0 }; 340 struct spdk_scsi_task *task; 341 struct spdk_scsi_task *task_mgmt; 342 343 task = spdk_get_task(NULL); 344 345 spdk_scsi_dev_queue_task(&dev, task); 346 347 task_mgmt = spdk_get_task(NULL); 348 349 /* Enqueue the tasks into dev->task_mgmt_submit_queue */ 350 task->function = SPDK_SCSI_TASK_FUNC_LUN_RESET; 351 spdk_scsi_dev_queue_mgmt_task(&dev, task_mgmt); 352 353 spdk_scsi_task_put(task); 354 spdk_scsi_task_put(task_mgmt); 355 } 356 357 static void 358 dev_add_port_max_ports(void) 359 { 360 struct spdk_scsi_dev dev = { 0 }; 361 const char *name; 362 int id, rc; 363 364 /* dev is set to SPDK_SCSI_DEV_MAX_PORTS */ 365 dev.num_ports = SPDK_SCSI_DEV_MAX_PORTS; 366 name = "Name of Port"; 367 id = 1; 368 369 rc = spdk_scsi_dev_add_port(&dev, id, name); 370 371 /* returns -1; since the dev already has maximum 372 * number of ports (SPDK_SCSI_DEV_MAX_PORTS) */ 373 CU_ASSERT_TRUE(rc < 0); 374 } 375 376 static void 377 dev_add_port_construct_failure1(void) 378 { 379 struct spdk_scsi_dev dev = { 0 }; 380 const int port_name_length = SPDK_SCSI_PORT_MAX_NAME_LENGTH + 2; 381 char name[port_name_length]; 382 uint64_t id; 383 int rc; 384 385 dev.num_ports = 1; 386 /* Set the name such that the length exceeds SPDK_SCSI_PORT_MAX_NAME_LENGTH 387 * SPDK_SCSI_PORT_MAX_NAME_LENGTH = 256 */ 388 memset(name, 'a', port_name_length - 1); 389 name[port_name_length - 1] = '\0'; 390 id = 1; 391 392 rc = spdk_scsi_dev_add_port(&dev, id, name); 393 394 /* returns -1; since the length of the name exceeds 395 * SPDK_SCSI_PORT_MAX_NAME_LENGTH */ 396 CU_ASSERT_TRUE(rc < 0); 397 } 398 399 static void 400 dev_add_port_construct_failure2(void) 401 { 402 struct spdk_scsi_dev dev = { 0 }; 403 const char *name; 404 uint64_t id; 405 int rc; 406 407 dev.num_ports = 1; 408 name = "Name of Port"; 409 id = 1; 410 411 /* Initialize port[0] to be valid and its index is set to 1 */ 412 dev.port[0].id = id; 413 dev.port[0].is_used = 1; 414 415 rc = spdk_scsi_dev_add_port(&dev, id, name); 416 417 /* returns -1; since the dev already has a port whose index to be 1 */ 418 CU_ASSERT_TRUE(rc < 0); 419 } 420 421 static void 422 dev_add_port_success1(void) 423 { 424 struct spdk_scsi_dev dev = { 0 }; 425 const char *name; 426 int id, rc; 427 428 dev.num_ports = 1; 429 name = "Name of Port"; 430 id = 1; 431 432 rc = spdk_scsi_dev_add_port(&dev, id, name); 433 434 /* successfully adds a port */ 435 CU_ASSERT_EQUAL(rc, 0); 436 /* Assert num_ports has been incremented to 2 */ 437 CU_ASSERT_EQUAL(dev.num_ports, 2); 438 } 439 440 static void 441 dev_add_port_success2(void) 442 { 443 struct spdk_scsi_dev dev = { 0 }; 444 const char *name; 445 uint64_t id; 446 int rc; 447 448 dev.num_ports = 1; 449 name = "Name of Port"; 450 id = 1; 451 /* set id of invalid port[0] to 1. This must be ignored */ 452 dev.port[0].id = id; 453 dev.port[0].is_used = 0; 454 455 rc = spdk_scsi_dev_add_port(&dev, id, name); 456 457 /* successfully adds a port */ 458 CU_ASSERT_EQUAL(rc, 0); 459 /* Assert num_ports has been incremented to 1 */ 460 CU_ASSERT_EQUAL(dev.num_ports, 2); 461 } 462 463 static void 464 dev_add_port_success3(void) 465 { 466 struct spdk_scsi_dev dev = { 0 }; 467 const char *name; 468 uint64_t add_id; 469 int rc; 470 471 dev.num_ports = 1; 472 name = "Name of Port"; 473 dev.port[0].id = 1; 474 dev.port[0].is_used = 1; 475 add_id = 2; 476 477 /* Add a port with id = 2 */ 478 rc = spdk_scsi_dev_add_port(&dev, add_id, name); 479 480 /* successfully adds a port */ 481 CU_ASSERT_EQUAL(rc, 0); 482 /* Assert num_ports has been incremented to 2 */ 483 CU_ASSERT_EQUAL(dev.num_ports, 2); 484 } 485 486 static void 487 dev_find_port_by_id_num_ports_zero(void) 488 { 489 struct spdk_scsi_dev dev = { 0 }; 490 struct spdk_scsi_port *rp_port; 491 uint64_t id; 492 493 dev.num_ports = 0; 494 id = 1; 495 496 rp_port = spdk_scsi_dev_find_port_by_id(&dev, id); 497 498 /* returns null; since dev's num_ports is 0 */ 499 CU_ASSERT_TRUE(rp_port == NULL); 500 } 501 502 static void 503 dev_find_port_by_id_id_not_found_failure(void) 504 { 505 struct spdk_scsi_dev dev = { 0 }; 506 struct spdk_scsi_port *rp_port; 507 const char *name; 508 int rc; 509 uint64_t id, find_id; 510 511 id = 1; 512 dev.num_ports = 1; 513 name = "Name of Port"; 514 find_id = 2; 515 516 /* Add a port with id = 1 */ 517 rc = spdk_scsi_dev_add_port(&dev, id, name); 518 519 CU_ASSERT_EQUAL(rc, 0); 520 521 /* Find port with id = 2 */ 522 rp_port = spdk_scsi_dev_find_port_by_id(&dev, find_id); 523 524 /* returns null; failed to find port specified by id = 2 */ 525 CU_ASSERT_TRUE(rp_port == NULL); 526 } 527 528 static void 529 dev_find_port_by_id_success(void) 530 { 531 struct spdk_scsi_dev dev = { 0 }; 532 struct spdk_scsi_port *rp_port; 533 const char *name; 534 int rc; 535 uint64_t id; 536 537 id = 1; 538 dev.num_ports = 1; 539 name = "Name of Port"; 540 541 /* Add a port */ 542 rc = spdk_scsi_dev_add_port(&dev, id, name); 543 544 CU_ASSERT_EQUAL(rc, 0); 545 546 /* Find port by the same id as the one added above */ 547 rp_port = spdk_scsi_dev_find_port_by_id(&dev, id); 548 549 /* Successfully found port specified by id */ 550 CU_ASSERT_TRUE(rp_port != NULL); 551 if (rp_port != NULL) { 552 /* Assert the found port's id and name are same as 553 * the port added. */ 554 CU_ASSERT_EQUAL(rp_port->id, 1); 555 CU_ASSERT_STRING_EQUAL(rp_port->name, "Name of Port"); 556 } 557 } 558 559 static void 560 dev_add_lun_bdev_not_found(void) 561 { 562 int rc; 563 struct spdk_scsi_dev dev = {0}; 564 565 rc = spdk_scsi_dev_add_lun(&dev, "malloc2", 0, NULL, NULL); 566 567 SPDK_CU_ASSERT_FATAL(dev.lun[0] == NULL); 568 CU_ASSERT_NOT_EQUAL(rc, 0); 569 } 570 571 static void 572 dev_add_lun_no_free_lun_id(void) 573 { 574 int rc; 575 int i; 576 struct spdk_scsi_dev dev = {0}; 577 struct spdk_scsi_lun lun; 578 579 for (i = 0; i < SPDK_SCSI_DEV_MAX_LUN; i++) { 580 dev.lun[i] = &lun; 581 } 582 583 rc = spdk_scsi_dev_add_lun(&dev, "malloc0", -1, NULL, NULL); 584 585 CU_ASSERT_NOT_EQUAL(rc, 0); 586 } 587 588 static void 589 dev_add_lun_success1(void) 590 { 591 int rc; 592 struct spdk_scsi_dev dev = {0}; 593 594 rc = spdk_scsi_dev_add_lun(&dev, "malloc0", -1, NULL, NULL); 595 596 CU_ASSERT_EQUAL(rc, 0); 597 598 spdk_scsi_dev_destruct(&dev, NULL, NULL); 599 } 600 601 static void 602 dev_add_lun_success2(void) 603 { 604 int rc; 605 struct spdk_scsi_dev dev = {0}; 606 607 rc = spdk_scsi_dev_add_lun(&dev, "malloc0", 0, NULL, NULL); 608 609 CU_ASSERT_EQUAL(rc, 0); 610 611 spdk_scsi_dev_destruct(&dev, NULL, NULL); 612 } 613 614 static void 615 dev_check_pending_tasks(void) 616 { 617 struct spdk_scsi_dev dev = {}; 618 struct spdk_scsi_lun lun = {}; 619 struct spdk_scsi_port initiator_port = {}; 620 621 g_initiator_port_with_pending_tasks = NULL; 622 g_initiator_port_with_pending_mgmt_tasks = NULL; 623 624 CU_ASSERT(spdk_scsi_dev_has_pending_tasks(&dev, NULL) == false); 625 626 dev.lun[SPDK_SCSI_DEV_MAX_LUN - 1] = &lun; 627 628 CU_ASSERT(spdk_scsi_dev_has_pending_tasks(&dev, NULL) == true); 629 CU_ASSERT(spdk_scsi_dev_has_pending_tasks(&dev, &initiator_port) == false); 630 631 g_initiator_port_with_pending_tasks = &initiator_port; 632 CU_ASSERT(spdk_scsi_dev_has_pending_tasks(&dev, NULL) == true); 633 CU_ASSERT(spdk_scsi_dev_has_pending_tasks(&dev, &initiator_port) == true); 634 635 g_initiator_port_with_pending_tasks = NULL; 636 g_initiator_port_with_pending_mgmt_tasks = &initiator_port; 637 CU_ASSERT(spdk_scsi_dev_has_pending_tasks(&dev, NULL) == true); 638 CU_ASSERT(spdk_scsi_dev_has_pending_tasks(&dev, &initiator_port) == true); 639 } 640 641 int 642 main(int argc, char **argv) 643 { 644 CU_pSuite suite = NULL; 645 unsigned int num_failures; 646 647 CU_set_error_action(CUEA_ABORT); 648 CU_initialize_registry(); 649 650 suite = CU_add_suite("dev_suite", NULL, NULL); 651 652 CU_ADD_TEST(suite, dev_destruct_null_dev); 653 CU_ADD_TEST(suite, dev_destruct_zero_luns); 654 CU_ADD_TEST(suite, dev_destruct_null_lun); 655 CU_ADD_TEST(suite, dev_destruct_success); 656 CU_ADD_TEST(suite, dev_construct_num_luns_zero); 657 CU_ADD_TEST(suite, dev_construct_no_lun_zero); 658 CU_ADD_TEST(suite, dev_construct_null_lun); 659 CU_ADD_TEST(suite, dev_construct_name_too_long); 660 CU_ADD_TEST(suite, dev_construct_success); 661 CU_ADD_TEST(suite, dev_construct_success_lun_zero_not_first); 662 CU_ADD_TEST(suite, dev_queue_mgmt_task_success); 663 CU_ADD_TEST(suite, dev_queue_task_success); 664 CU_ADD_TEST(suite, dev_stop_success); 665 CU_ADD_TEST(suite, dev_add_port_max_ports); 666 CU_ADD_TEST(suite, dev_add_port_construct_failure1); 667 CU_ADD_TEST(suite, dev_add_port_construct_failure2); 668 CU_ADD_TEST(suite, dev_add_port_success1); 669 CU_ADD_TEST(suite, dev_add_port_success2); 670 CU_ADD_TEST(suite, dev_add_port_success3); 671 CU_ADD_TEST(suite, dev_find_port_by_id_num_ports_zero); 672 CU_ADD_TEST(suite, dev_find_port_by_id_id_not_found_failure); 673 CU_ADD_TEST(suite, dev_find_port_by_id_success); 674 CU_ADD_TEST(suite, dev_add_lun_bdev_not_found); 675 CU_ADD_TEST(suite, dev_add_lun_no_free_lun_id); 676 CU_ADD_TEST(suite, dev_add_lun_success1); 677 CU_ADD_TEST(suite, dev_add_lun_success2); 678 CU_ADD_TEST(suite, dev_check_pending_tasks); 679 680 CU_basic_set_mode(CU_BRM_VERBOSE); 681 CU_basic_run_tests(); 682 num_failures = CU_get_number_of_failures(); 683 CU_cleanup_registry(); 684 685 return num_failures; 686 } 687