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