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