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