xref: /spdk/test/unit/lib/scsi/dev.c/dev_ut.c (revision 712a3f69d32632bf6c862f00200f7f437d3f7529)
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