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 "spdk_cunit.h" 37 38 #include "scsi/task.c" 39 #include "scsi/lun.c" 40 41 #include "spdk_internal/mock.h" 42 /* These unit tests aren't multithreads, but we need to allocate threads since 43 * the lun.c code will register pollers. 44 */ 45 #include "common/lib/ut_multithread.c" 46 47 /* Unit test bdev mockup */ 48 struct spdk_bdev { 49 int x; 50 }; 51 52 /* Unit test poller mockup */ 53 struct spdk_poller { 54 int y; 55 }; 56 57 SPDK_LOG_REGISTER_COMPONENT("scsi", SPDK_LOG_SCSI) 58 59 struct spdk_scsi_globals g_spdk_scsi; 60 61 static bool g_lun_execute_fail = false; 62 static int g_lun_execute_status = SPDK_SCSI_TASK_PENDING; 63 static uint32_t g_task_count = 0; 64 65 struct spdk_trace_histories *g_trace_histories; 66 67 DEFINE_STUB_V(_spdk_trace_record, 68 (uint64_t tsc, uint16_t tpoint_id, uint16_t poller_id, 69 uint32_t size, uint64_t object_id, uint64_t arg1)); 70 71 static void 72 spdk_lun_ut_cpl_task(struct spdk_scsi_task *task) 73 { 74 SPDK_CU_ASSERT_FATAL(g_task_count > 0); 75 g_task_count--; 76 } 77 78 static void 79 spdk_lun_ut_free_task(struct spdk_scsi_task *task) 80 { 81 } 82 83 static void 84 ut_init_task(struct spdk_scsi_task *task) 85 { 86 memset(task, 0, sizeof(*task)); 87 spdk_scsi_task_construct(task, spdk_lun_ut_cpl_task, 88 spdk_lun_ut_free_task); 89 g_task_count++; 90 } 91 92 void 93 spdk_bdev_free_io(struct spdk_bdev_io *bdev_io) 94 { 95 CU_ASSERT(0); 96 } 97 98 DEFINE_STUB(spdk_bdev_open, int, 99 (struct spdk_bdev *bdev, bool write, spdk_bdev_remove_cb_t remove_cb, 100 void *remove_ctx, struct spdk_bdev_desc **desc), 101 0); 102 103 DEFINE_STUB_V(spdk_bdev_close, (struct spdk_bdev_desc *desc)); 104 105 DEFINE_STUB(spdk_bdev_get_name, const char *, 106 (const struct spdk_bdev *bdev), "test"); 107 108 DEFINE_STUB_V(spdk_scsi_dev_queue_mgmt_task, 109 (struct spdk_scsi_dev *dev, struct spdk_scsi_task *task)); 110 111 DEFINE_STUB_V(spdk_scsi_dev_delete_lun, 112 (struct spdk_scsi_dev *dev, struct spdk_scsi_lun *lun)); 113 114 void 115 spdk_bdev_scsi_reset(struct spdk_scsi_task *task) 116 { 117 task->status = SPDK_SCSI_STATUS_GOOD; 118 task->response = SPDK_SCSI_TASK_MGMT_RESP_SUCCESS; 119 120 spdk_scsi_lun_complete_reset_task(task->lun, task); 121 } 122 123 int 124 spdk_bdev_scsi_execute(struct spdk_scsi_task *task) 125 { 126 if (g_lun_execute_fail) { 127 return -EINVAL; 128 } else { 129 task->status = SPDK_SCSI_STATUS_GOOD; 130 131 if (g_lun_execute_status == SPDK_SCSI_TASK_PENDING) { 132 return g_lun_execute_status; 133 } else if (g_lun_execute_status == SPDK_SCSI_TASK_COMPLETE) { 134 return g_lun_execute_status; 135 } else { 136 return 0; 137 } 138 } 139 } 140 141 DEFINE_STUB(spdk_bdev_get_io_channel, struct spdk_io_channel *, 142 (struct spdk_bdev_desc *desc), NULL); 143 144 static _spdk_scsi_lun * 145 lun_construct(void) 146 { 147 struct spdk_scsi_lun *lun; 148 struct spdk_bdev bdev; 149 150 lun = spdk_scsi_lun_construct(&bdev, NULL, NULL); 151 152 SPDK_CU_ASSERT_FATAL(lun != NULL); 153 return lun; 154 } 155 156 static void 157 lun_destruct(struct spdk_scsi_lun *lun) 158 { 159 /* LUN will defer its removal if there are any unfinished tasks */ 160 SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&lun->tasks)); 161 162 spdk_scsi_lun_destruct(lun); 163 } 164 165 static void 166 lun_task_mgmt_execute_abort_task_not_supported(void) 167 { 168 struct spdk_scsi_lun *lun; 169 struct spdk_scsi_task task = { 0 }; 170 struct spdk_scsi_task mgmt_task = { 0 }; 171 struct spdk_scsi_port initiator_port = { 0 }; 172 struct spdk_scsi_dev dev = { 0 }; 173 uint8_t cdb[6] = { 0 }; 174 175 lun = lun_construct(); 176 lun->dev = &dev; 177 178 ut_init_task(&mgmt_task); 179 mgmt_task.lun = lun; 180 mgmt_task.initiator_port = &initiator_port; 181 mgmt_task.function = SPDK_SCSI_TASK_FUNC_ABORT_TASK; 182 183 /* Params to add regular task to the lun->tasks */ 184 ut_init_task(&task); 185 task.lun = lun; 186 task.cdb = cdb; 187 188 spdk_scsi_lun_append_task(lun, &task); 189 spdk_scsi_lun_execute_tasks(lun); 190 191 /* task should now be on the tasks list */ 192 CU_ASSERT(!TAILQ_EMPTY(&lun->tasks)); 193 194 spdk_scsi_lun_append_mgmt_task(lun, &mgmt_task); 195 spdk_scsi_lun_execute_mgmt_task(lun); 196 197 /* task abort is not supported */ 198 CU_ASSERT(mgmt_task.response == SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED); 199 200 /* task is still on the tasks list */ 201 CU_ASSERT_EQUAL(g_task_count, 1); 202 203 spdk_scsi_lun_complete_task(lun, &task); 204 CU_ASSERT_EQUAL(g_task_count, 0); 205 206 lun_destruct(lun); 207 } 208 209 static void 210 lun_task_mgmt_execute_abort_task_all_not_supported(void) 211 { 212 struct spdk_scsi_lun *lun; 213 struct spdk_scsi_task task = { 0 }; 214 struct spdk_scsi_task mgmt_task = { 0 }; 215 struct spdk_scsi_port initiator_port = { 0 }; 216 struct spdk_scsi_dev dev = { 0 }; 217 uint8_t cdb[6] = { 0 }; 218 219 lun = lun_construct(); 220 lun->dev = &dev; 221 222 ut_init_task(&mgmt_task); 223 mgmt_task.lun = lun; 224 mgmt_task.initiator_port = &initiator_port; 225 mgmt_task.function = SPDK_SCSI_TASK_FUNC_ABORT_TASK_SET; 226 227 /* Params to add regular task to the lun->tasks */ 228 ut_init_task(&task); 229 task.initiator_port = &initiator_port; 230 task.lun = lun; 231 task.cdb = cdb; 232 233 spdk_scsi_lun_append_task(lun, &task); 234 spdk_scsi_lun_execute_tasks(lun); 235 236 /* task should now be on the tasks list */ 237 CU_ASSERT(!TAILQ_EMPTY(&lun->tasks)); 238 239 spdk_scsi_lun_append_mgmt_task(lun, &mgmt_task); 240 spdk_scsi_lun_execute_mgmt_task(lun); 241 242 /* task abort is not supported */ 243 CU_ASSERT(mgmt_task.response == SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED); 244 245 /* task is still on the tasks list */ 246 CU_ASSERT_EQUAL(g_task_count, 1); 247 248 spdk_scsi_lun_complete_task(lun, &task); 249 250 CU_ASSERT_EQUAL(g_task_count, 0); 251 252 lun_destruct(lun); 253 } 254 255 static void 256 lun_task_mgmt_execute_lun_reset(void) 257 { 258 struct spdk_scsi_lun *lun; 259 struct spdk_scsi_task mgmt_task = { 0 }; 260 struct spdk_scsi_dev dev = { 0 }; 261 262 lun = lun_construct(); 263 lun->dev = &dev; 264 265 ut_init_task(&mgmt_task); 266 mgmt_task.lun = lun; 267 mgmt_task.function = SPDK_SCSI_TASK_FUNC_LUN_RESET; 268 269 spdk_scsi_lun_append_mgmt_task(lun, &mgmt_task); 270 spdk_scsi_lun_execute_mgmt_task(lun); 271 272 /* Returns success */ 273 CU_ASSERT_EQUAL(mgmt_task.status, SPDK_SCSI_STATUS_GOOD); 274 CU_ASSERT_EQUAL(mgmt_task.response, SPDK_SCSI_TASK_MGMT_RESP_SUCCESS); 275 276 lun_destruct(lun); 277 278 CU_ASSERT_EQUAL(g_task_count, 0); 279 } 280 281 static void 282 lun_task_mgmt_execute_invalid_case(void) 283 { 284 struct spdk_scsi_lun *lun; 285 struct spdk_scsi_task mgmt_task = { 0 }; 286 struct spdk_scsi_dev dev = { 0 }; 287 288 lun = lun_construct(); 289 lun->dev = &dev; 290 291 ut_init_task(&mgmt_task); 292 mgmt_task.function = 5; 293 294 /* Pass an invalid value to the switch statement */ 295 spdk_scsi_lun_append_mgmt_task(lun, &mgmt_task); 296 spdk_scsi_lun_execute_mgmt_task(lun); 297 298 /* function code is invalid */ 299 CU_ASSERT_EQUAL(mgmt_task.response, SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED); 300 301 lun_destruct(lun); 302 303 CU_ASSERT_EQUAL(g_task_count, 0); 304 } 305 306 static void 307 lun_append_task_null_lun_task_cdb_spc_inquiry(void) 308 { 309 struct spdk_scsi_task task = { 0 }; 310 uint8_t cdb[6] = { 0 }; 311 312 ut_init_task(&task); 313 task.cdb = cdb; 314 task.cdb[0] = SPDK_SPC_INQUIRY; 315 /* alloc_len >= 4096 */ 316 task.cdb[3] = 0xFF; 317 task.cdb[4] = 0xFF; 318 task.lun = NULL; 319 320 spdk_scsi_task_process_null_lun(&task); 321 322 CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_GOOD); 323 324 spdk_scsi_task_put(&task); 325 326 /* spdk_scsi_task_process_null_lun() does not call cpl_fn */ 327 CU_ASSERT_EQUAL(g_task_count, 1); 328 g_task_count = 0; 329 } 330 331 static void 332 lun_append_task_null_lun_alloc_len_lt_4096(void) 333 { 334 struct spdk_scsi_task task = { 0 }; 335 uint8_t cdb[6] = { 0 }; 336 337 ut_init_task(&task); 338 task.cdb = cdb; 339 task.cdb[0] = SPDK_SPC_INQUIRY; 340 /* alloc_len < 4096 */ 341 task.cdb[3] = 0; 342 task.cdb[4] = 0; 343 /* alloc_len is set to a minimal value of 4096 344 * Hence, buf of size 4096 is allocated */ 345 spdk_scsi_task_process_null_lun(&task); 346 347 CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_GOOD); 348 349 spdk_scsi_task_put(&task); 350 351 /* spdk_scsi_task_process_null_lun() does not call cpl_fn */ 352 CU_ASSERT_EQUAL(g_task_count, 1); 353 g_task_count = 0; 354 } 355 356 static void 357 lun_append_task_null_lun_not_supported(void) 358 { 359 struct spdk_scsi_task task = { 0 }; 360 uint8_t cdb[6] = { 0 }; 361 362 ut_init_task(&task); 363 task.cdb = cdb; 364 task.lun = NULL; 365 366 spdk_scsi_task_process_null_lun(&task); 367 368 CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_CHECK_CONDITION); 369 /* LUN not supported; task's data transferred should be 0 */ 370 CU_ASSERT_EQUAL(task.data_transferred, 0); 371 372 /* spdk_scsi_task_process_null_lun() does not call cpl_fn */ 373 CU_ASSERT_EQUAL(g_task_count, 1); 374 g_task_count = 0; 375 } 376 377 static void 378 lun_execute_scsi_task_pending(void) 379 { 380 struct spdk_scsi_lun *lun; 381 struct spdk_scsi_task task = { 0 }; 382 struct spdk_scsi_dev dev = { 0 }; 383 384 lun = lun_construct(); 385 386 ut_init_task(&task); 387 task.lun = lun; 388 lun->dev = &dev; 389 390 g_lun_execute_fail = false; 391 g_lun_execute_status = SPDK_SCSI_TASK_PENDING; 392 393 /* the tasks list should still be empty since it has not been 394 executed yet 395 */ 396 CU_ASSERT(TAILQ_EMPTY(&lun->tasks)); 397 398 spdk_scsi_lun_append_task(lun, &task); 399 spdk_scsi_lun_execute_tasks(lun); 400 401 /* Assert the task has been successfully added to the tasks queue */ 402 CU_ASSERT(!TAILQ_EMPTY(&lun->tasks)); 403 404 /* task is still on the tasks list */ 405 CU_ASSERT_EQUAL(g_task_count, 1); 406 407 /* Need to complete task so LUN might be removed right now */ 408 spdk_scsi_lun_complete_task(lun, &task); 409 410 CU_ASSERT_EQUAL(g_task_count, 0); 411 412 lun_destruct(lun); 413 } 414 415 static void 416 lun_execute_scsi_task_complete(void) 417 { 418 struct spdk_scsi_lun *lun; 419 struct spdk_scsi_task task = { 0 }; 420 struct spdk_scsi_dev dev = { 0 }; 421 422 lun = lun_construct(); 423 424 ut_init_task(&task); 425 task.lun = lun; 426 lun->dev = &dev; 427 428 g_lun_execute_fail = false; 429 g_lun_execute_status = SPDK_SCSI_TASK_COMPLETE; 430 431 /* the tasks list should still be empty since it has not been 432 executed yet 433 */ 434 CU_ASSERT(TAILQ_EMPTY(&lun->tasks)); 435 436 spdk_scsi_lun_append_task(lun, &task); 437 spdk_scsi_lun_execute_tasks(lun); 438 439 /* Assert the task has not been added to the tasks queue */ 440 CU_ASSERT(TAILQ_EMPTY(&lun->tasks)); 441 442 lun_destruct(lun); 443 444 CU_ASSERT_EQUAL(g_task_count, 0); 445 } 446 447 static void 448 lun_destruct_success(void) 449 { 450 struct spdk_scsi_lun *lun; 451 452 lun = lun_construct(); 453 454 spdk_scsi_lun_destruct(lun); 455 456 CU_ASSERT_EQUAL(g_task_count, 0); 457 } 458 459 static void 460 lun_construct_null_ctx(void) 461 { 462 struct spdk_scsi_lun *lun; 463 464 lun = spdk_scsi_lun_construct(NULL, NULL, NULL); 465 466 /* lun should be NULL since we passed NULL for the ctx pointer. */ 467 CU_ASSERT(lun == NULL); 468 CU_ASSERT_EQUAL(g_task_count, 0); 469 } 470 471 static void 472 lun_construct_success(void) 473 { 474 struct spdk_scsi_lun *lun = lun_construct(); 475 476 lun_destruct(lun); 477 478 CU_ASSERT_EQUAL(g_task_count, 0); 479 } 480 481 static void 482 lun_reset_task_wait_scsi_task_complete(void) 483 { 484 struct spdk_scsi_lun *lun; 485 struct spdk_scsi_task task = { 0 }; 486 struct spdk_scsi_task mgmt_task = { 0 }; 487 struct spdk_scsi_dev dev = { 0 }; 488 489 lun = lun_construct(); 490 lun->dev = &dev; 491 492 ut_init_task(&task); 493 task.lun = lun; 494 495 g_lun_execute_fail = false; 496 g_lun_execute_status = SPDK_SCSI_TASK_PENDING; 497 498 ut_init_task(&mgmt_task); 499 mgmt_task.lun = lun; 500 mgmt_task.function = SPDK_SCSI_TASK_FUNC_LUN_RESET; 501 502 /* Append a task to the pending task list. */ 503 spdk_scsi_lun_append_task(lun, &task); 504 505 CU_ASSERT(!TAILQ_EMPTY(&lun->pending_tasks)); 506 507 /* Execute the task but it is still in the task list. */ 508 spdk_scsi_lun_execute_tasks(lun); 509 510 CU_ASSERT(TAILQ_EMPTY(&lun->pending_tasks)); 511 CU_ASSERT(!TAILQ_EMPTY(&lun->tasks)); 512 513 /* Append a reset task to the pending mgmt task list. */ 514 spdk_scsi_lun_append_mgmt_task(lun, &mgmt_task); 515 516 CU_ASSERT(!TAILQ_EMPTY(&lun->pending_mgmt_tasks)); 517 518 /* Execute the reset task */ 519 spdk_scsi_lun_execute_mgmt_task(lun); 520 521 /* The reset task should be still on the submitted mgmt task list and 522 * a poller is created because the task prior to the reset task is pending. 523 */ 524 CU_ASSERT(!TAILQ_EMPTY(&lun->mgmt_tasks)); 525 CU_ASSERT(lun->reset_poller != NULL); 526 527 /* Execute the poller to check if the task prior to the reset task complete. */ 528 spdk_scsi_lun_reset_check_outstanding_tasks(&mgmt_task); 529 530 CU_ASSERT(!TAILQ_EMPTY(&lun->mgmt_tasks)); 531 CU_ASSERT(lun->reset_poller != NULL); 532 533 /* Complete the task. */ 534 spdk_scsi_lun_complete_task(lun, &task); 535 536 CU_ASSERT(TAILQ_EMPTY(&lun->tasks)); 537 538 /* Execute the poller to check if the task prior to the reset task complete. */ 539 spdk_scsi_lun_reset_check_outstanding_tasks(&mgmt_task); 540 541 CU_ASSERT(TAILQ_EMPTY(&lun->mgmt_tasks)); 542 CU_ASSERT(lun->reset_poller == NULL); 543 CU_ASSERT_EQUAL(mgmt_task.status, SPDK_SCSI_STATUS_GOOD); 544 CU_ASSERT_EQUAL(mgmt_task.response, SPDK_SCSI_TASK_MGMT_RESP_SUCCESS); 545 546 lun_destruct(lun); 547 548 CU_ASSERT_EQUAL(g_task_count, 0); 549 } 550 551 static void 552 lun_reset_task_suspend_scsi_task(void) 553 { 554 struct spdk_scsi_lun *lun; 555 struct spdk_scsi_task task = { 0 }; 556 struct spdk_scsi_task mgmt_task = { 0 }; 557 struct spdk_scsi_dev dev = { 0 }; 558 559 lun = lun_construct(); 560 lun->dev = &dev; 561 562 ut_init_task(&task); 563 task.lun = lun; 564 565 g_lun_execute_fail = false; 566 g_lun_execute_status = SPDK_SCSI_TASK_COMPLETE; 567 568 ut_init_task(&mgmt_task); 569 mgmt_task.lun = lun; 570 mgmt_task.function = SPDK_SCSI_TASK_FUNC_LUN_RESET; 571 572 /* Append a reset task to the pending mgmt task list. */ 573 spdk_scsi_lun_append_mgmt_task(lun, &mgmt_task); 574 575 CU_ASSERT(!TAILQ_EMPTY(&lun->pending_mgmt_tasks)); 576 577 /* Append a task to the pending task list. */ 578 spdk_scsi_lun_append_task(lun, &task); 579 580 CU_ASSERT(!TAILQ_EMPTY(&lun->pending_tasks)); 581 582 /* Execute the task but it is still on the pending task list. */ 583 spdk_scsi_lun_execute_tasks(lun); 584 585 CU_ASSERT(!TAILQ_EMPTY(&lun->pending_tasks)); 586 587 /* Execute the reset task. The task will be executed then. */ 588 spdk_scsi_lun_execute_mgmt_task(lun); 589 590 CU_ASSERT(TAILQ_EMPTY(&lun->mgmt_tasks)); 591 CU_ASSERT(lun->reset_poller == NULL); 592 CU_ASSERT_EQUAL(mgmt_task.status, SPDK_SCSI_STATUS_GOOD); 593 CU_ASSERT_EQUAL(mgmt_task.response, SPDK_SCSI_TASK_MGMT_RESP_SUCCESS); 594 595 CU_ASSERT(TAILQ_EMPTY(&lun->pending_tasks)); 596 CU_ASSERT(TAILQ_EMPTY(&lun->tasks)); 597 598 lun_destruct(lun); 599 600 CU_ASSERT_EQUAL(g_task_count, 0); 601 } 602 603 int 604 main(int argc, char **argv) 605 { 606 CU_pSuite suite = NULL; 607 unsigned int num_failures; 608 609 if (CU_initialize_registry() != CUE_SUCCESS) { 610 return CU_get_error(); 611 } 612 613 suite = CU_add_suite("lun_suite", NULL, NULL); 614 if (suite == NULL) { 615 CU_cleanup_registry(); 616 return CU_get_error(); 617 } 618 619 if ( 620 CU_add_test(suite, "task management abort task - not supported", 621 lun_task_mgmt_execute_abort_task_not_supported) == NULL 622 || CU_add_test(suite, "task management abort task set - success", 623 lun_task_mgmt_execute_abort_task_all_not_supported) == NULL 624 || CU_add_test(suite, "task management - lun reset success", 625 lun_task_mgmt_execute_lun_reset) == NULL 626 || CU_add_test(suite, "task management - invalid option", 627 lun_task_mgmt_execute_invalid_case) == NULL 628 || CU_add_test(suite, "append task - null lun SPDK_SPC_INQUIRY", 629 lun_append_task_null_lun_task_cdb_spc_inquiry) == NULL 630 || CU_add_test(suite, "append task - allocated length less than 4096", 631 lun_append_task_null_lun_alloc_len_lt_4096) == NULL 632 || CU_add_test(suite, "append task - unsupported lun", 633 lun_append_task_null_lun_not_supported) == NULL 634 || CU_add_test(suite, "execute task - scsi task pending", 635 lun_execute_scsi_task_pending) == NULL 636 || CU_add_test(suite, "execute task - scsi task complete", 637 lun_execute_scsi_task_complete) == NULL 638 || CU_add_test(suite, "destruct task - success", lun_destruct_success) == NULL 639 || CU_add_test(suite, "construct - null ctx", lun_construct_null_ctx) == NULL 640 || CU_add_test(suite, "construct - success", lun_construct_success) == NULL 641 || CU_add_test(suite, "reset task wait for prior task completion", 642 lun_reset_task_wait_scsi_task_complete) == NULL 643 || CU_add_test(suite, "reset task suspend subsequent scsi task", 644 lun_reset_task_suspend_scsi_task) == NULL 645 ) { 646 CU_cleanup_registry(); 647 return CU_get_error(); 648 } 649 650 CU_basic_set_mode(CU_BRM_VERBOSE); 651 allocate_threads(1); 652 set_thread(0); 653 CU_basic_run_tests(); 654 free_threads(); 655 num_failures = CU_get_number_of_failures(); 656 CU_cleanup_registry(); 657 return num_failures; 658 } 659