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