5 * Copyright (c) Intel Corporation.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
12 * * Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * * Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the
18 * * Neither the name of Intel Corporation nor the names of its
19 * contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 #include "spdk_cunit.h"
37 #include "nvme/nvme_ctrlr_cmd.c"
39 #define CTRLR_CDATA_ELPE 5
41 struct nvme_request g_req
;
43 uint32_t error_num_entries
;
44 uint32_t health_log_nsid
= 1;
46 uint32_t feature_cdw11
= 1;
47 uint32_t feature_cdw12
= 1;
48 uint8_t get_feature
= 1;
49 uint32_t get_feature_cdw11
= 1;
50 uint32_t fw_img_size
= 1024;
51 uint32_t fw_img_offset
= 0;
52 uint16_t abort_cid
= 1;
53 uint16_t abort_sqid
= 1;
54 uint32_t namespace_management_nsid
= 1;
55 uint32_t format_nvme_nsid
= 1;
57 typedef void (*verify_request_fn_t
)(struct nvme_request
*req
);
58 verify_request_fn_t verify_fn
;
60 static void verify_firmware_log_page(struct nvme_request
*req
)
64 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_GET_LOG_PAGE
);
65 CU_ASSERT(req
->cmd
.nsid
== SPDK_NVME_GLOBAL_NS_TAG
);
67 temp_cdw10
= ((sizeof(struct spdk_nvme_firmware_page
) / sizeof(uint32_t) - 1) << 16) |
68 SPDK_NVME_LOG_FIRMWARE_SLOT
;
69 CU_ASSERT(req
->cmd
.cdw10
== temp_cdw10
);
72 static void verify_health_log_page(struct nvme_request
*req
)
76 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_GET_LOG_PAGE
);
77 CU_ASSERT(req
->cmd
.nsid
== health_log_nsid
);
79 temp_cdw10
= ((sizeof(struct spdk_nvme_health_information_page
) / sizeof(uint32_t) - 1) << 16) |
80 SPDK_NVME_LOG_HEALTH_INFORMATION
;
81 CU_ASSERT(req
->cmd
.cdw10
== temp_cdw10
);
84 static void verify_error_log_page(struct nvme_request
*req
)
88 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_GET_LOG_PAGE
);
89 CU_ASSERT(req
->cmd
.nsid
== SPDK_NVME_GLOBAL_NS_TAG
);
91 temp_cdw10
= (((sizeof(struct spdk_nvme_error_information_entry
) * error_num_entries
) /
92 sizeof(uint32_t) - 1) << 16) | SPDK_NVME_LOG_ERROR
;
93 CU_ASSERT(req
->cmd
.cdw10
== temp_cdw10
);
96 static void verify_set_feature_cmd(struct nvme_request
*req
)
98 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_SET_FEATURES
);
99 CU_ASSERT(req
->cmd
.cdw10
== feature
);
100 CU_ASSERT(req
->cmd
.cdw11
== feature_cdw11
);
101 CU_ASSERT(req
->cmd
.cdw12
== feature_cdw12
);
104 static void verify_get_feature_cmd(struct nvme_request
*req
)
106 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_GET_FEATURES
);
107 CU_ASSERT(req
->cmd
.cdw10
== get_feature
);
108 CU_ASSERT(req
->cmd
.cdw11
== get_feature_cdw11
);
111 static void verify_abort_cmd(struct nvme_request
*req
)
113 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_ABORT
);
114 CU_ASSERT(req
->cmd
.cdw10
== (((uint32_t)abort_cid
<< 16) | abort_sqid
));
117 static void verify_io_raw_cmd(struct nvme_request
*req
)
119 struct spdk_nvme_cmd command
= {};
121 CU_ASSERT(memcmp(&req
->cmd
, &command
, sizeof(req
->cmd
)) == 0);
124 static void verify_intel_smart_log_page(struct nvme_request
*req
)
128 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_GET_LOG_PAGE
);
129 CU_ASSERT(req
->cmd
.nsid
== health_log_nsid
);
131 temp_cdw10
= ((sizeof(struct spdk_nvme_intel_smart_information_page
) /
132 sizeof(uint32_t) - 1) << 16) |
133 SPDK_NVME_INTEL_LOG_SMART
;
134 CU_ASSERT(req
->cmd
.cdw10
== temp_cdw10
);
137 static void verify_intel_temperature_log_page(struct nvme_request
*req
)
141 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_GET_LOG_PAGE
);
143 temp_cdw10
= ((sizeof(struct spdk_nvme_intel_temperature_page
) / sizeof(uint32_t) - 1) << 16) |
144 SPDK_NVME_INTEL_LOG_TEMPERATURE
;
145 CU_ASSERT(req
->cmd
.cdw10
== temp_cdw10
);
148 static void verify_intel_read_latency_log_page(struct nvme_request
*req
)
152 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_GET_LOG_PAGE
);
154 temp_cdw10
= ((sizeof(struct spdk_nvme_intel_rw_latency_page
) / sizeof(uint32_t) - 1) << 16) |
155 SPDK_NVME_INTEL_LOG_READ_CMD_LATENCY
;
156 CU_ASSERT(req
->cmd
.cdw10
== temp_cdw10
);
159 static void verify_intel_write_latency_log_page(struct nvme_request
*req
)
163 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_GET_LOG_PAGE
);
165 temp_cdw10
= ((sizeof(struct spdk_nvme_intel_rw_latency_page
) / sizeof(uint32_t) - 1) << 16) |
166 SPDK_NVME_INTEL_LOG_WRITE_CMD_LATENCY
;
167 CU_ASSERT(req
->cmd
.cdw10
== temp_cdw10
);
170 static void verify_intel_get_log_page_directory(struct nvme_request
*req
)
174 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_GET_LOG_PAGE
);
176 temp_cdw10
= ((sizeof(struct spdk_nvme_intel_log_page_directory
) / sizeof(uint32_t) - 1) << 16) |
177 SPDK_NVME_INTEL_LOG_PAGE_DIRECTORY
;
178 CU_ASSERT(req
->cmd
.cdw10
== temp_cdw10
);
181 static void verify_intel_marketing_description_log_page(struct nvme_request
*req
)
185 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_GET_LOG_PAGE
);
187 temp_cdw10
= ((sizeof(struct spdk_nvme_intel_marketing_description_page
) / sizeof(
188 uint32_t) - 1) << 16) |
189 SPDK_NVME_INTEL_MARKETING_DESCRIPTION
;
190 CU_ASSERT(req
->cmd
.cdw10
== temp_cdw10
);
193 static void verify_namespace_attach(struct nvme_request
*req
)
195 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_NS_ATTACHMENT
);
196 CU_ASSERT(req
->cmd
.cdw10
== SPDK_NVME_NS_CTRLR_ATTACH
);
197 CU_ASSERT(req
->cmd
.nsid
== namespace_management_nsid
);
200 static void verify_namespace_detach(struct nvme_request
*req
)
202 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_NS_ATTACHMENT
);
203 CU_ASSERT(req
->cmd
.cdw10
== SPDK_NVME_NS_CTRLR_DETACH
);
204 CU_ASSERT(req
->cmd
.nsid
== namespace_management_nsid
);
207 static void verify_namespace_create(struct nvme_request
*req
)
209 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_NS_MANAGEMENT
);
210 CU_ASSERT(req
->cmd
.cdw10
== SPDK_NVME_NS_MANAGEMENT_CREATE
);
211 CU_ASSERT(req
->cmd
.nsid
== 0);
214 static void verify_namespace_delete(struct nvme_request
*req
)
216 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_NS_MANAGEMENT
);
217 CU_ASSERT(req
->cmd
.cdw10
== SPDK_NVME_NS_MANAGEMENT_DELETE
);
218 CU_ASSERT(req
->cmd
.nsid
== namespace_management_nsid
);
221 static void verify_format_nvme(struct nvme_request
*req
)
223 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_FORMAT_NVM
);
224 CU_ASSERT(req
->cmd
.cdw10
== 0);
225 CU_ASSERT(req
->cmd
.nsid
== format_nvme_nsid
);
228 static void verify_fw_commit(struct nvme_request
*req
)
230 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_FIRMWARE_COMMIT
);
231 CU_ASSERT(req
->cmd
.cdw10
== 0x09);
234 static void verify_fw_image_download(struct nvme_request
*req
)
236 CU_ASSERT(req
->cmd
.opc
== SPDK_NVME_OPC_FIRMWARE_IMAGE_DOWNLOAD
);
237 CU_ASSERT(req
->cmd
.cdw10
== (fw_img_size
>> 2) - 1);
238 CU_ASSERT(req
->cmd
.cdw11
== fw_img_offset
>> 2);
241 struct nvme_request
*
242 nvme_allocate_request(struct spdk_nvme_qpair
*qpair
,
243 const struct nvme_payload
*payload
, uint32_t payload_size
,
244 spdk_nvme_cmd_cb cb_fn
,
247 struct nvme_request
*req
= &g_req
;
249 memset(req
, 0, sizeof(*req
));
251 req
->payload
= *payload
;
252 req
->payload_size
= payload_size
;
255 req
->cb_arg
= cb_arg
;
262 struct nvme_request
*
263 nvme_allocate_request_contig(struct spdk_nvme_qpair
*qpair
, void *buffer
, uint32_t payload_size
,
264 spdk_nvme_cmd_cb cb_fn
, void *cb_arg
)
266 struct nvme_payload payload
;
268 payload
.type
= NVME_PAYLOAD_TYPE_CONTIG
;
269 payload
.u
.contig
= buffer
;
272 return nvme_allocate_request(qpair
, &payload
, payload_size
, cb_fn
, cb_arg
);
275 struct nvme_request
*
276 nvme_allocate_request_null(struct spdk_nvme_qpair
*qpair
, spdk_nvme_cmd_cb cb_fn
, void *cb_arg
)
278 return nvme_allocate_request_contig(qpair
, NULL
, 0, cb_fn
, cb_arg
);
281 struct nvme_request
*
282 nvme_allocate_request_user_copy(struct spdk_nvme_qpair
*qpair
, void *buffer
, uint32_t payload_size
,
283 spdk_nvme_cmd_cb cb_fn
, void *cb_arg
, bool host_to_controller
)
285 /* For the unit test, we don't actually need to copy the buffer */
286 return nvme_allocate_request_contig(qpair
, buffer
, payload_size
, cb_fn
, cb_arg
);
290 nvme_free_request(struct nvme_request
*req
)
296 nvme_qpair_submit_request(struct spdk_nvme_qpair
*qpair
, struct nvme_request
*req
)
299 /* stop analyzer from thinking stack variable addresses are stored in a global */
300 memset(req
, 0, sizeof(*req
));
306 nvme_ctrlr_submit_admin_request(struct spdk_nvme_ctrlr
*ctrlr
, struct nvme_request
*req
)
309 /* stop analyzer from thinking stack variable addresses are stored in a global */
310 memset(req
, 0, sizeof(*req
));
316 test_firmware_get_log_page(void)
318 struct spdk_nvme_ctrlr ctrlr
= {};
319 struct spdk_nvme_firmware_page payload
= {};
321 verify_fn
= verify_firmware_log_page
;
323 spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr
, SPDK_NVME_LOG_FIRMWARE_SLOT
, SPDK_NVME_GLOBAL_NS_TAG
,
325 sizeof(payload
), 0, NULL
, NULL
);
329 test_health_get_log_page(void)
331 struct spdk_nvme_ctrlr ctrlr
= {};
332 struct spdk_nvme_health_information_page payload
= {};
334 verify_fn
= verify_health_log_page
;
336 spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr
, SPDK_NVME_LOG_HEALTH_INFORMATION
, health_log_nsid
,
338 sizeof(payload
), 0, NULL
, NULL
);
342 test_error_get_log_page(void)
344 struct spdk_nvme_ctrlr ctrlr
= {};
345 struct spdk_nvme_error_information_entry payload
= {};
347 ctrlr
.cdata
.elpe
= CTRLR_CDATA_ELPE
;
349 verify_fn
= verify_error_log_page
;
352 error_num_entries
= 1;
353 spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr
, SPDK_NVME_LOG_ERROR
, SPDK_NVME_GLOBAL_NS_TAG
, &payload
,
354 sizeof(payload
), 0, NULL
, NULL
);
357 static void test_intel_smart_get_log_page(void)
359 struct spdk_nvme_ctrlr ctrlr
= {};
360 struct spdk_nvme_intel_smart_information_page payload
= {};
362 verify_fn
= verify_intel_smart_log_page
;
364 spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr
, SPDK_NVME_INTEL_LOG_SMART
, health_log_nsid
, &payload
,
365 sizeof(payload
), 0, NULL
, NULL
);
368 static void test_intel_temperature_get_log_page(void)
370 struct spdk_nvme_ctrlr ctrlr
= {};
371 struct spdk_nvme_intel_temperature_page payload
= {};
373 verify_fn
= verify_intel_temperature_log_page
;
375 spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr
, SPDK_NVME_INTEL_LOG_TEMPERATURE
, SPDK_NVME_GLOBAL_NS_TAG
,
376 &payload
, sizeof(payload
), 0, NULL
, NULL
);
379 static void test_intel_read_latency_get_log_page(void)
381 struct spdk_nvme_ctrlr ctrlr
= {};
382 struct spdk_nvme_intel_rw_latency_page payload
= {};
384 verify_fn
= verify_intel_read_latency_log_page
;
386 spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr
, SPDK_NVME_INTEL_LOG_READ_CMD_LATENCY
,
387 SPDK_NVME_GLOBAL_NS_TAG
,
388 &payload
, sizeof(payload
), 0, NULL
, NULL
);
391 static void test_intel_write_latency_get_log_page(void)
393 struct spdk_nvme_ctrlr ctrlr
= {};
394 struct spdk_nvme_intel_rw_latency_page payload
= {};
396 verify_fn
= verify_intel_write_latency_log_page
;
398 spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr
, SPDK_NVME_INTEL_LOG_WRITE_CMD_LATENCY
,
399 SPDK_NVME_GLOBAL_NS_TAG
,
400 &payload
, sizeof(payload
), 0, NULL
, NULL
);
403 static void test_intel_get_log_page_directory(void)
405 struct spdk_nvme_ctrlr ctrlr
= {};
406 struct spdk_nvme_intel_log_page_directory payload
= {};
408 verify_fn
= verify_intel_get_log_page_directory
;
410 spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr
, SPDK_NVME_INTEL_LOG_PAGE_DIRECTORY
,
411 SPDK_NVME_GLOBAL_NS_TAG
,
412 &payload
, sizeof(payload
), 0, NULL
, NULL
);
415 static void test_intel_marketing_description_get_log_page(void)
417 struct spdk_nvme_ctrlr ctrlr
= {};
418 struct spdk_nvme_intel_marketing_description_page payload
= {};
420 verify_fn
= verify_intel_marketing_description_log_page
;
422 spdk_nvme_ctrlr_cmd_get_log_page(&ctrlr
, SPDK_NVME_INTEL_MARKETING_DESCRIPTION
,
423 SPDK_NVME_GLOBAL_NS_TAG
,
424 &payload
, sizeof(payload
), 0, NULL
, NULL
);
427 static void test_generic_get_log_pages(void)
429 test_error_get_log_page();
430 test_health_get_log_page();
431 test_firmware_get_log_page();
434 static void test_intel_get_log_pages(void)
436 test_intel_get_log_page_directory();
437 test_intel_smart_get_log_page();
438 test_intel_temperature_get_log_page();
439 test_intel_read_latency_get_log_page();
440 test_intel_write_latency_get_log_page();
441 test_intel_marketing_description_get_log_page();
445 test_set_feature_cmd(void)
447 struct spdk_nvme_ctrlr ctrlr
= {};
449 verify_fn
= verify_set_feature_cmd
;
451 spdk_nvme_ctrlr_cmd_set_feature(&ctrlr
, feature
, feature_cdw11
, feature_cdw12
, NULL
, 0, NULL
, NULL
);
456 test_get_feature_cmd(void)
458 struct spdk_nvme_ctrlr ctrlr
= {};
460 verify_fn
= verify_get_feature_cmd
;
462 spdk_nvme_ctrlr_cmd_get_feature(&ctrlr
, get_feature
, get_feature_cdw11
, NULL
, 0, NULL
, NULL
);
468 struct spdk_nvme_ctrlr ctrlr
= {};
469 struct spdk_nvme_qpair qpair
= {};
471 STAILQ_INIT(&ctrlr
.queued_aborts
);
473 verify_fn
= verify_abort_cmd
;
475 qpair
.id
= abort_sqid
;
476 spdk_nvme_ctrlr_cmd_abort(&ctrlr
, &qpair
, abort_cid
, NULL
, NULL
);
480 test_io_raw_cmd(void)
482 struct spdk_nvme_ctrlr ctrlr
= {};
483 struct spdk_nvme_qpair qpair
= {};
484 struct spdk_nvme_cmd cmd
= {};
486 verify_fn
= verify_io_raw_cmd
;
488 spdk_nvme_ctrlr_cmd_io_raw(&ctrlr
, &qpair
, &cmd
, NULL
, 1, NULL
, NULL
);
492 test_get_log_pages(void)
494 test_generic_get_log_pages();
495 test_intel_get_log_pages();
499 test_namespace_attach(void)
501 struct spdk_nvme_ctrlr ctrlr
= {};
502 struct spdk_nvme_ctrlr_list payload
= {};
504 verify_fn
= verify_namespace_attach
;
506 nvme_ctrlr_cmd_attach_ns(&ctrlr
, namespace_management_nsid
, &payload
, NULL
, NULL
);
510 test_namespace_detach(void)
512 struct spdk_nvme_ctrlr ctrlr
= {};
513 struct spdk_nvme_ctrlr_list payload
= {};
515 verify_fn
= verify_namespace_detach
;
517 nvme_ctrlr_cmd_detach_ns(&ctrlr
, namespace_management_nsid
, &payload
, NULL
, NULL
);
521 test_namespace_create(void)
523 struct spdk_nvme_ctrlr ctrlr
= {};
524 struct spdk_nvme_ns_data payload
= {};
526 verify_fn
= verify_namespace_create
;
527 nvme_ctrlr_cmd_create_ns(&ctrlr
, &payload
, NULL
, NULL
);
531 test_namespace_delete(void)
533 struct spdk_nvme_ctrlr ctrlr
= {};
535 verify_fn
= verify_namespace_delete
;
536 nvme_ctrlr_cmd_delete_ns(&ctrlr
, namespace_management_nsid
, NULL
, NULL
);
540 test_format_nvme(void)
542 struct spdk_nvme_ctrlr ctrlr
= {};
543 struct spdk_nvme_format format
= {};
545 verify_fn
= verify_format_nvme
;
547 nvme_ctrlr_cmd_format(&ctrlr
, format_nvme_nsid
, &format
, NULL
, NULL
);
553 struct spdk_nvme_ctrlr ctrlr
= {};
554 struct spdk_nvme_fw_commit fw_commit
= {};
556 fw_commit
.ca
= SPDK_NVME_FW_COMMIT_REPLACE_AND_ENABLE_IMG
;
559 verify_fn
= verify_fw_commit
;
561 nvme_ctrlr_cmd_fw_commit(&ctrlr
, &fw_commit
, NULL
, NULL
);
565 test_fw_image_download(void)
567 struct spdk_nvme_ctrlr ctrlr
= {};
569 verify_fn
= verify_fw_image_download
;
571 nvme_ctrlr_cmd_fw_image_download(&ctrlr
, fw_img_size
, fw_img_offset
, NULL
,
575 int main(int argc
, char **argv
)
577 CU_pSuite suite
= NULL
;
578 unsigned int num_failures
;
580 if (CU_initialize_registry() != CUE_SUCCESS
) {
581 return CU_get_error();
584 suite
= CU_add_suite("nvme_ctrlr_cmd", NULL
, NULL
);
586 CU_cleanup_registry();
587 return CU_get_error();
591 CU_add_test(suite
, "test ctrlr cmd get_log_pages", test_get_log_pages
) == NULL
592 || CU_add_test(suite
, "test ctrlr cmd set_feature", test_set_feature_cmd
) == NULL
593 || CU_add_test(suite
, "test ctrlr cmd get_feature", test_get_feature_cmd
) == NULL
594 || CU_add_test(suite
, "test ctrlr cmd abort_cmd", test_abort_cmd
) == NULL
595 || CU_add_test(suite
, "test ctrlr cmd io_raw_cmd", test_io_raw_cmd
) == NULL
596 || CU_add_test(suite
, "test ctrlr cmd namespace_attach", test_namespace_attach
) == NULL
597 || CU_add_test(suite
, "test ctrlr cmd namespace_detach", test_namespace_detach
) == NULL
598 || CU_add_test(suite
, "test ctrlr cmd namespace_create", test_namespace_create
) == NULL
599 || CU_add_test(suite
, "test ctrlr cmd namespace_delete", test_namespace_delete
) == NULL
600 || CU_add_test(suite
, "test ctrlr cmd format_nvme", test_format_nvme
) == NULL
601 || CU_add_test(suite
, "test ctrlr cmd fw_commit", test_fw_commit
) == NULL
602 || CU_add_test(suite
, "test ctrlr cmd fw_image_download", test_fw_image_download
) == NULL
604 CU_cleanup_registry();
605 return CU_get_error();
608 CU_basic_set_mode(CU_BRM_VERBOSE
);
609 CU_basic_run_tests();
610 num_failures
= CU_get_number_of_failures();
611 CU_cleanup_registry();