xref: /spdk/test/unit/lib/bdev/crypto.c/crypto_ut.c (revision 5977aad8f7486552c94c5cc93ea9bb110e1cb5d0)
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_cunit.h"
35 
36 #include "common/lib/test_env.c"
37 #include "spdk_internal/mock.h"
38 #include "unit/lib/json_mock.c"
39 
40 /* these rte_ headers are our local copies of the DPDK headers hacked to mock some functions
41  * included in them that can't be done with our mock library.
42  */
43 #include "rte_crypto.h"
44 #include "rte_cryptodev.h"
45 #include "bdev/crypto/vbdev_crypto.c"
46 
47 /* SPDK stubs */
48 DEFINE_STUB(spdk_conf_find_section, struct spdk_conf_section *,
49 	    (struct spdk_conf *cp, const char *name), NULL);
50 DEFINE_STUB(spdk_conf_section_get_nval, char *,
51 	    (struct spdk_conf_section *sp, const char *key, int idx), NULL);
52 DEFINE_STUB(spdk_conf_section_get_nmval, char *,
53 	    (struct spdk_conf_section *sp, const char *key, int idx1, int idx2), NULL);
54 DEFINE_STUB_V(spdk_bdev_module_list_add, (struct spdk_bdev_module *bdev_module));
55 DEFINE_STUB_V(spdk_bdev_free_io, (struct spdk_bdev_io *g_bdev_io));
56 DEFINE_STUB(spdk_bdev_io_type_supported, bool, (struct spdk_bdev *bdev,
57 		enum spdk_bdev_io_type io_type), 0);
58 DEFINE_STUB_V(spdk_bdev_module_release_bdev, (struct spdk_bdev *bdev));
59 DEFINE_STUB_V(spdk_bdev_close, (struct spdk_bdev_desc *desc));
60 DEFINE_STUB(spdk_bdev_get_name, const char *, (const struct spdk_bdev *bdev), 0);
61 DEFINE_STUB(spdk_bdev_get_io_channel, struct spdk_io_channel *, (struct spdk_bdev_desc *desc), 0);
62 DEFINE_STUB_V(spdk_bdev_unregister, (struct spdk_bdev *bdev, spdk_bdev_unregister_cb cb_fn,
63 				     void *cb_arg));
64 DEFINE_STUB(spdk_bdev_open, int, (struct spdk_bdev *bdev, bool write,
65 				  spdk_bdev_remove_cb_t remove_cb,
66 				  void *remove_ctx, struct spdk_bdev_desc **_desc), 0);
67 DEFINE_STUB(spdk_bdev_module_claim_bdev, int, (struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
68 		struct spdk_bdev_module *module), 0);
69 DEFINE_STUB_V(spdk_bdev_module_examine_done, (struct spdk_bdev_module *module));
70 DEFINE_STUB(spdk_vbdev_register, int, (struct spdk_bdev *vbdev, struct spdk_bdev **base_bdevs,
71 				       int base_bdev_count), 0);
72 DEFINE_STUB(spdk_env_get_socket_id, uint32_t, (uint32_t core), 0);
73 
74 /* DPDK stubs */
75 DEFINE_STUB(rte_cryptodev_count, uint8_t, (void), 0);
76 DEFINE_STUB(rte_eal_get_configuration, struct rte_config *, (void), NULL);
77 DEFINE_STUB_V(rte_mempool_free, (struct rte_mempool *mp));
78 DEFINE_STUB(rte_socket_id, unsigned, (void), 0);
79 DEFINE_STUB(rte_crypto_op_pool_create, struct rte_mempool *,
80 	    (const char *name, enum rte_crypto_op_type type, unsigned nb_elts,
81 	     unsigned cache_size, uint16_t priv_size, int socket_id), (struct rte_mempool *)1);
82 DEFINE_STUB(rte_cryptodev_device_count_by_driver, uint8_t, (uint8_t driver_id), 0);
83 DEFINE_STUB(rte_cryptodev_configure, int, (uint8_t dev_id, struct rte_cryptodev_config *config), 0);
84 DEFINE_STUB(rte_cryptodev_queue_pair_setup, int, (uint8_t dev_id, uint16_t queue_pair_id,
85 		const struct rte_cryptodev_qp_conf *qp_conf,
86 		int socket_id, struct rte_mempool *session_pool), 0);
87 DEFINE_STUB(rte_cryptodev_start, int, (uint8_t dev_id), 0);
88 DEFINE_STUB_V(rte_cryptodev_stop, (uint8_t dev_id));
89 DEFINE_STUB(rte_cryptodev_sym_session_create, struct rte_cryptodev_sym_session *,
90 	    (struct rte_mempool *mempool), (struct rte_cryptodev_sym_session *)1);
91 DEFINE_STUB(rte_cryptodev_sym_session_init, int, (uint8_t dev_id,
92 		struct rte_cryptodev_sym_session *sess,
93 		struct rte_crypto_sym_xform *xforms, struct rte_mempool *mempool), 0);
94 DEFINE_STUB(rte_vdev_init, int, (const char *name, const char *args), 0);
95 DEFINE_STUB(rte_cryptodev_sym_session_free, int, (struct rte_cryptodev_sym_session *sess), 0);
96 
97 void __attribute__((noreturn)) __rte_panic(const char *funcname, const char *format, ...)
98 {
99 	abort();
100 }
101 struct rte_mempool_ops_table rte_mempool_ops_table;
102 struct rte_cryptodev *rte_cryptodevs;
103 __thread unsigned per_lcore__lcore_id = 0;
104 
105 /* global vars and setup/cleanup functions used for all test functions */
106 struct spdk_bdev_io *g_bdev_io;
107 struct crypto_bdev_io *g_io_ctx;
108 struct crypto_io_channel *g_crypto_ch;
109 struct spdk_io_channel *g_io_ch;
110 struct vbdev_dev g_device;
111 struct vbdev_crypto g_crypto_bdev;
112 struct rte_config *g_test_config;
113 struct device_qp g_dev_qp;
114 
115 #define MAX_TEST_BLOCKS 8192
116 struct rte_crypto_op *g_test_crypto_ops[MAX_TEST_BLOCKS];
117 struct rte_crypto_op *g_test_dequeued_ops[MAX_TEST_BLOCKS];
118 struct rte_crypto_op *g_test_dev_full_ops[MAX_TEST_BLOCKS];
119 
120 /* These globals are externs in our local rte_ header files so we can control
121  * specific functions for mocking.
122  */
123 uint16_t g_dequeue_mock;
124 uint16_t g_enqueue_mock;
125 unsigned ut_rte_crypto_op_bulk_alloc;
126 int ut_rte_crypto_op_attach_sym_session = 0;
127 int ut_rte_cryptodev_info_get = 0;
128 bool ut_rte_cryptodev_info_get_mocked = false;
129 
130 void
131 rte_cryptodev_info_get(uint8_t dev_id, struct rte_cryptodev_info *dev_info)
132 {
133 	dev_info->max_nb_queue_pairs = ut_rte_cryptodev_info_get;
134 }
135 
136 unsigned int
137 rte_cryptodev_sym_get_private_session_size(uint8_t dev_id)
138 {
139 	return (unsigned int)dev_id;
140 }
141 
142 void
143 spdk_bdev_io_get_buf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_buf_cb cb, uint64_t len)
144 {
145 	cb(g_io_ch, g_bdev_io);
146 }
147 
148 /* Mock these functions to call the callback and then return the value we require */
149 int ut_spdk_bdev_readv_blocks = 0;
150 bool ut_spdk_bdev_readv_blocks_mocked = false;
151 int
152 spdk_bdev_readv_blocks(struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
153 		       struct iovec *iov, int iovcnt,
154 		       uint64_t offset_blocks, uint64_t num_blocks,
155 		       spdk_bdev_io_completion_cb cb, void *cb_arg)
156 {
157 	cb(g_bdev_io, !ut_spdk_bdev_readv_blocks, cb_arg);
158 	return ut_spdk_bdev_readv_blocks;
159 }
160 
161 int ut_spdk_bdev_writev_blocks = 0;
162 bool ut_spdk_bdev_writev_blocks_mocked = false;
163 int
164 spdk_bdev_writev_blocks(struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
165 			struct iovec *iov, int iovcnt,
166 			uint64_t offset_blocks, uint64_t num_blocks,
167 			spdk_bdev_io_completion_cb cb, void *cb_arg)
168 {
169 	cb(g_bdev_io, !ut_spdk_bdev_writev_blocks, cb_arg);
170 	return ut_spdk_bdev_writev_blocks;
171 }
172 
173 int ut_spdk_bdev_unmap_blocks = 0;
174 bool ut_spdk_bdev_unmap_blocks_mocked = false;
175 int
176 spdk_bdev_unmap_blocks(struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
177 		       uint64_t offset_blocks, uint64_t num_blocks,
178 		       spdk_bdev_io_completion_cb cb, void *cb_arg)
179 {
180 	cb(g_bdev_io, !ut_spdk_bdev_unmap_blocks, cb_arg);
181 	return ut_spdk_bdev_unmap_blocks;
182 }
183 
184 int ut_spdk_bdev_flush_blocks = 0;
185 bool ut_spdk_bdev_flush_blocks_mocked = false;
186 int
187 spdk_bdev_flush_blocks(struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
188 		       uint64_t offset_blocks, uint64_t num_blocks, spdk_bdev_io_completion_cb cb,
189 		       void *cb_arg)
190 {
191 	cb(g_bdev_io, !ut_spdk_bdev_flush_blocks, cb_arg);
192 	return ut_spdk_bdev_flush_blocks;
193 }
194 
195 int ut_spdk_bdev_reset = 0;
196 bool ut_spdk_bdev_reset_mocked = false;
197 int
198 spdk_bdev_reset(struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
199 		spdk_bdev_io_completion_cb cb, void *cb_arg)
200 {
201 	cb(g_bdev_io, !ut_spdk_bdev_reset, cb_arg);
202 	return ut_spdk_bdev_reset;
203 }
204 
205 bool g_completion_called = false;
206 void
207 spdk_bdev_io_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status)
208 {
209 	bdev_io->internal.status = status;
210 	g_completion_called = true;
211 }
212 
213 /* Used in testing device full condition */
214 static inline uint16_t
215 rte_cryptodev_enqueue_burst(uint8_t dev_id, uint16_t qp_id,
216 			    struct rte_crypto_op **ops, uint16_t nb_ops)
217 {
218 	int i;
219 
220 	CU_ASSERT(nb_ops > 0);
221 
222 	for (i = 0; i < nb_ops; i++) {
223 		/* Use this empty (til now) array of pointers to store
224 		 * enqueued operations for assertion in dev_full test.
225 		 */
226 		g_test_dev_full_ops[i] = *ops++;
227 	}
228 
229 	return g_enqueue_mock;
230 }
231 
232 /* This is pretty ugly but in order to complete an IO via the
233  * poller in the submit path, we need to first call to this func
234  * to return the dequeued value and also decrement it.  On the subsequent
235  * call it needs to return 0 to indicate to the caller that there are
236  * no more IOs to drain.
237  */
238 int g_test_overflow = 0;
239 static inline uint16_t
240 rte_cryptodev_dequeue_burst(uint8_t dev_id, uint16_t qp_id,
241 			    struct rte_crypto_op **ops, uint16_t nb_ops)
242 {
243 	CU_ASSERT(nb_ops > 0);
244 
245 	/* A crypto device can be full on enqueue, the driver is designed to drain
246 	 * the device at the time by calling the poller until it's empty, then
247 	 * submitting the remaining crypto ops.
248 	 */
249 	if (g_test_overflow) {
250 		if (g_dequeue_mock == 0) {
251 			return 0;
252 		}
253 		*ops = g_test_crypto_ops[g_enqueue_mock];
254 		(*ops)->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
255 		g_dequeue_mock -= 1;
256 	}
257 	return (g_dequeue_mock + 1);
258 }
259 
260 /* Instead of allocating real memory, assign the allocations to our
261  * test array for assertion in tests.
262  */
263 static inline unsigned
264 rte_crypto_op_bulk_alloc(struct rte_mempool *mempool,
265 			 enum rte_crypto_op_type type,
266 			 struct rte_crypto_op **ops, uint16_t nb_ops)
267 {
268 	int i;
269 
270 	for (i = 0; i < nb_ops; i++) {
271 		*ops++ = g_test_crypto_ops[i];
272 	}
273 	return ut_rte_crypto_op_bulk_alloc;
274 }
275 
276 static __rte_always_inline void
277 rte_mempool_put_bulk(struct rte_mempool *mp, void *const *obj_table,
278 		     unsigned int n)
279 {
280 	return;
281 }
282 
283 static inline int
284 rte_crypto_op_attach_sym_session(struct rte_crypto_op *op,
285 				 struct rte_cryptodev_sym_session *sess)
286 {
287 	return ut_rte_crypto_op_attach_sym_session;
288 }
289 
290 /* Global setup for all tests that share a bunch of preparation... */
291 static int
292 test_setup(void)
293 {
294 	int i;
295 
296 	/* Prepare essential variables for test routines */
297 	g_bdev_io = calloc(1, sizeof(struct spdk_bdev_io) + sizeof(struct crypto_bdev_io));
298 	g_bdev_io->u.bdev.iovs = calloc(1, sizeof(struct iovec) * 128);
299 	g_bdev_io->bdev = &g_crypto_bdev.crypto_bdev;
300 	g_io_ch = calloc(1, sizeof(struct spdk_io_channel) + sizeof(struct crypto_io_channel));
301 	g_crypto_ch = (struct crypto_io_channel *)((uint8_t *)g_io_ch + sizeof(struct spdk_io_channel));
302 	g_io_ctx = (struct crypto_bdev_io *)g_bdev_io->driver_ctx;
303 	memset(&g_device, 0, sizeof(struct vbdev_dev));
304 	memset(&g_crypto_bdev, 0, sizeof(struct vbdev_crypto));
305 	g_dev_qp.device = &g_device;
306 	g_io_ctx->crypto_ch = g_crypto_ch;
307 	g_io_ctx->crypto_bdev = &g_crypto_bdev;
308 	g_crypto_ch->device_qp = &g_dev_qp;
309 	g_test_config = calloc(1, sizeof(struct rte_config));
310 	g_test_config->lcore_count = 1;
311 	TAILQ_INIT(&g_crypto_ch->pending_cry_ios);
312 
313 	/* Allocate a real mbuf pool so we can test error paths */
314 	g_mbuf_mp = spdk_mempool_create("mbuf_mp", NUM_MBUFS, sizeof(struct rte_mbuf),
315 					SPDK_MEMPOOL_DEFAULT_CACHE_SIZE,
316 					SPDK_ENV_SOCKET_ID_ANY);
317 
318 	/* Instead of allocating real rte mempools for these, it's easier and provides the
319 	 * same coverage just calloc them here.
320 	 */
321 	for (i = 0; i < MAX_TEST_BLOCKS; i++) {
322 		g_test_crypto_ops[i] = calloc(1, sizeof(struct rte_crypto_op) +
323 					      sizeof(struct rte_crypto_sym_op));
324 		g_test_dequeued_ops[i] = calloc(1, sizeof(struct rte_crypto_op) +
325 						sizeof(struct rte_crypto_sym_op));
326 	}
327 	return 0;
328 }
329 
330 /* Global teardown for all tests */
331 static int
332 test_cleanup(void)
333 {
334 	int i;
335 
336 	free(g_test_config);
337 	spdk_mempool_free(g_mbuf_mp);
338 	for (i = 0; i < MAX_TEST_BLOCKS; i++) {
339 		free(g_test_crypto_ops[i]);
340 		free(g_test_dequeued_ops[i]);
341 	}
342 	free(g_bdev_io->u.bdev.iovs);
343 	free(g_bdev_io);
344 	free(g_io_ch);
345 	return 0;
346 }
347 
348 static void
349 test_error_paths(void)
350 {
351 	/* Single element block size write, just to test error paths
352 	 * in vbdev_crypto_submit_request().
353 	 */
354 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
355 	g_bdev_io->u.bdev.iovcnt = 1;
356 	g_bdev_io->u.bdev.num_blocks = 1;
357 	g_bdev_io->u.bdev.iovs[0].iov_len = 512;
358 	g_crypto_bdev.crypto_bdev.blocklen = 512;
359 	g_bdev_io->type = SPDK_BDEV_IO_TYPE_WRITE;
360 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc = 1;
361 
362 	/* test failure of spdk_mempool_get_bulk() */
363 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
364 	MOCK_SET(spdk_mempool_get, NULL);
365 	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
366 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_FAILED);
367 
368 	/* same thing but switch to reads to test error path in _crypto_complete_io() */
369 	g_bdev_io->type = SPDK_BDEV_IO_TYPE_READ;
370 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
371 	TAILQ_INSERT_TAIL(&g_crypto_ch->pending_cry_ios, g_bdev_io, module_link);
372 	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
373 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_FAILED);
374 	/* Now with the read_blocks failing */
375 	g_bdev_io->type = SPDK_BDEV_IO_TYPE_READ;
376 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
377 	MOCK_SET(spdk_bdev_readv_blocks, -1);
378 	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
379 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_FAILED);
380 	MOCK_SET(spdk_bdev_readv_blocks, 0);
381 	MOCK_CLEAR(spdk_mempool_get);
382 
383 	/* test failure of rte_crypto_op_bulk_alloc() */
384 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
385 	ut_rte_crypto_op_bulk_alloc = 0;
386 	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
387 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_FAILED);
388 	ut_rte_crypto_op_bulk_alloc = 1;
389 
390 	/* test failure of rte_crypto_op_attach_sym_session() */
391 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
392 	ut_rte_crypto_op_attach_sym_session = -1;
393 	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
394 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_FAILED);
395 	ut_rte_crypto_op_attach_sym_session = 0;
396 }
397 
398 static void
399 test_simple_write(void)
400 {
401 	/* Single element block size write */
402 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
403 	g_bdev_io->u.bdev.iovcnt = 1;
404 	g_bdev_io->u.bdev.num_blocks = 1;
405 	g_bdev_io->u.bdev.offset_blocks = 0;
406 	g_bdev_io->u.bdev.iovs[0].iov_len = 512;
407 	g_bdev_io->u.bdev.iovs[0].iov_base = &test_simple_write;
408 	g_crypto_bdev.crypto_bdev.blocklen = 512;
409 	g_bdev_io->type = SPDK_BDEV_IO_TYPE_WRITE;
410 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc = 1;
411 
412 	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
413 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_SUCCESS);
414 	CU_ASSERT(g_io_ctx->cryop_cnt_remaining == 1);
415 	CU_ASSERT(g_io_ctx->cry_iov.iov_len == 512);
416 	CU_ASSERT(g_io_ctx->cry_iov.iov_base != NULL);
417 	CU_ASSERT(g_io_ctx->cry_offset_blocks == 0);
418 	CU_ASSERT(g_io_ctx->cry_num_blocks == 1);
419 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->buf_addr == &test_simple_write);
420 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->data_len == 512);
421 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->next == NULL);
422 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.length == 512);
423 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.offset == 0);
424 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->userdata == g_bdev_io);
425 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_dst->buf_addr != NULL);
426 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_dst->data_len == 512);
427 
428 	spdk_dma_free(g_io_ctx->cry_iov.iov_base);
429 	spdk_mempool_put(g_mbuf_mp, g_test_crypto_ops[0]->sym->m_src);
430 	spdk_mempool_put(g_mbuf_mp, g_test_crypto_ops[0]->sym->m_dst);
431 }
432 
433 static void
434 test_simple_read(void)
435 {
436 	/* Single element block size read */
437 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
438 	g_bdev_io->u.bdev.iovcnt = 1;
439 	g_bdev_io->u.bdev.num_blocks = 1;
440 	g_bdev_io->u.bdev.iovs[0].iov_len = 512;
441 	g_bdev_io->u.bdev.iovs[0].iov_base = &test_simple_read;
442 	g_crypto_bdev.crypto_bdev.blocklen = 512;
443 	g_bdev_io->type = SPDK_BDEV_IO_TYPE_READ;
444 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc = 1;
445 
446 	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
447 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_SUCCESS);
448 	CU_ASSERT(g_io_ctx->cryop_cnt_remaining == 1);
449 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->buf_addr == &test_simple_read);
450 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->data_len == 512);
451 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->next == NULL);
452 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.length == 512);
453 	CU_ASSERT(g_test_crypto_ops[0]->sym->cipher.data.offset == 0);
454 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_src->userdata == g_bdev_io);
455 	CU_ASSERT(g_test_crypto_ops[0]->sym->m_dst == NULL);
456 
457 	spdk_mempool_put(g_mbuf_mp, g_test_crypto_ops[0]->sym->m_src);
458 }
459 
460 static void
461 test_large_rw(void)
462 {
463 	unsigned block_len = 512;
464 	unsigned num_blocks = CRYPTO_MAX_IO / block_len;
465 	unsigned io_len = block_len * num_blocks;
466 	unsigned i;
467 
468 	/* Multi block size read, multi-element */
469 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
470 	g_bdev_io->u.bdev.iovcnt = 1;
471 	g_bdev_io->u.bdev.num_blocks = num_blocks;
472 	g_bdev_io->u.bdev.iovs[0].iov_len = io_len;
473 	g_bdev_io->u.bdev.iovs[0].iov_base = &test_large_rw;
474 	g_crypto_bdev.crypto_bdev.blocklen = block_len;
475 	g_bdev_io->type = SPDK_BDEV_IO_TYPE_READ;
476 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc = num_blocks;
477 
478 	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
479 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_SUCCESS);
480 	CU_ASSERT(g_io_ctx->cryop_cnt_remaining == (int)num_blocks);
481 
482 	for (i = 0; i < num_blocks; i++) {
483 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->buf_addr == &test_large_rw + (i * block_len));
484 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->data_len == block_len);
485 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->next == NULL);
486 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.length == block_len);
487 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.offset == 0);
488 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->userdata == g_bdev_io);
489 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst == NULL);
490 		spdk_mempool_put(g_mbuf_mp, g_test_crypto_ops[i]->sym->m_src);
491 	}
492 
493 	/* Multi block size write, multi-element */
494 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
495 	g_bdev_io->u.bdev.iovcnt = 1;
496 	g_bdev_io->u.bdev.num_blocks = num_blocks;
497 	g_bdev_io->u.bdev.iovs[0].iov_len = io_len;
498 	g_bdev_io->u.bdev.iovs[0].iov_base = &test_large_rw;
499 	g_crypto_bdev.crypto_bdev.blocklen = block_len;
500 	g_bdev_io->type = SPDK_BDEV_IO_TYPE_WRITE;
501 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc = num_blocks;
502 
503 	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
504 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_SUCCESS);
505 	CU_ASSERT(g_io_ctx->cryop_cnt_remaining == (int)num_blocks);
506 
507 	for (i = 0; i < num_blocks; i++) {
508 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->buf_addr == &test_large_rw + (i * block_len));
509 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->data_len == block_len);
510 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->next == NULL);
511 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.length == block_len);
512 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.offset == 0);
513 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->userdata == g_bdev_io);
514 		CU_ASSERT(g_io_ctx->cry_iov.iov_len == io_len);
515 		CU_ASSERT(g_io_ctx->cry_iov.iov_base != NULL);
516 		CU_ASSERT(g_io_ctx->cry_offset_blocks == 0);
517 		CU_ASSERT(g_io_ctx->cry_num_blocks == num_blocks);
518 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst->buf_addr != NULL);
519 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst->data_len == block_len);
520 		spdk_mempool_put(g_mbuf_mp, g_test_crypto_ops[i]->sym->m_src);
521 		spdk_mempool_put(g_mbuf_mp, g_test_crypto_ops[i]->sym->m_dst);
522 	}
523 	spdk_dma_free(g_io_ctx->cry_iov.iov_base);
524 }
525 
526 static void
527 test_dev_full(void)
528 {
529 	unsigned block_len = 512;
530 	unsigned num_blocks = 2;
531 	unsigned io_len = block_len * num_blocks;
532 	unsigned i;
533 
534 	g_test_overflow = 1;
535 
536 	/* Multi block size read, multi-element */
537 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
538 	g_bdev_io->u.bdev.iovcnt = 1;
539 	g_bdev_io->u.bdev.num_blocks = num_blocks;
540 	g_bdev_io->u.bdev.iovs[0].iov_len = io_len;
541 	g_bdev_io->u.bdev.iovs[0].iov_base = &test_dev_full;
542 	g_crypto_bdev.crypto_bdev.blocklen = block_len;
543 	g_bdev_io->type = SPDK_BDEV_IO_TYPE_READ;
544 	g_enqueue_mock = g_dequeue_mock = 1;
545 	ut_rte_crypto_op_bulk_alloc = num_blocks;
546 
547 	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
548 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_SUCCESS);
549 
550 	/* this test only completes one of the 2 IOs (in the drain path) */
551 	CU_ASSERT(g_io_ctx->cryop_cnt_remaining == 1);
552 
553 	for (i = 0; i < num_blocks; i++) {
554 		/* One of the src_mbufs was freed because of the device full condition so
555 		 * we can't assert its value here.
556 		 */
557 		CU_ASSERT(g_test_dev_full_ops[i]->sym->cipher.data.length == block_len);
558 		CU_ASSERT(g_test_dev_full_ops[i]->sym->cipher.data.offset == 0);
559 		CU_ASSERT(g_test_dev_full_ops[i]->sym->m_src == g_test_dev_full_ops[i]->sym->m_src);
560 		CU_ASSERT(g_test_dev_full_ops[i]->sym->m_dst == NULL);
561 	}
562 
563 	/* Only one of the 2 blocks in the test was freed on completion by design, so
564 	 * we need to free th other one here.
565 	 */
566 	spdk_mempool_put(g_mbuf_mp, g_test_crypto_ops[0]->sym->m_src);
567 	g_test_overflow = 0;
568 }
569 
570 static void
571 test_crazy_rw(void)
572 {
573 	unsigned block_len = 512;
574 	int num_blocks = 4;
575 	int i;
576 
577 	/* Multi block size read, single element, strange IOV makeup */
578 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
579 	g_bdev_io->u.bdev.iovcnt = 3;
580 	g_bdev_io->u.bdev.num_blocks = num_blocks;
581 	g_bdev_io->u.bdev.iovs[0].iov_len = 512;
582 	g_bdev_io->u.bdev.iovs[0].iov_base = &test_crazy_rw;
583 	g_bdev_io->u.bdev.iovs[1].iov_len = 1024;
584 	g_bdev_io->u.bdev.iovs[1].iov_base = &test_crazy_rw + 512;
585 	g_bdev_io->u.bdev.iovs[2].iov_len = 512;
586 	g_bdev_io->u.bdev.iovs[2].iov_base = &test_crazy_rw + 512 + 1024;
587 
588 	g_crypto_bdev.crypto_bdev.blocklen = block_len;
589 	g_bdev_io->type = SPDK_BDEV_IO_TYPE_READ;
590 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc = num_blocks;
591 
592 	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
593 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_SUCCESS);
594 	CU_ASSERT(g_io_ctx->cryop_cnt_remaining == num_blocks);
595 
596 	for (i = 0; i < num_blocks; i++) {
597 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->buf_addr == &test_crazy_rw + (i * block_len));
598 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->data_len == block_len);
599 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->next == NULL);
600 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.length == block_len);
601 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.offset == 0);
602 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->userdata == g_bdev_io);
603 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src == g_test_crypto_ops[i]->sym->m_src);
604 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst == NULL);
605 		spdk_mempool_put(g_mbuf_mp, g_test_crypto_ops[i]->sym->m_src);
606 	}
607 
608 	/* Multi block size write, single element strange IOV makeup */
609 	num_blocks = 8;
610 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
611 	g_bdev_io->u.bdev.iovcnt = 4;
612 	g_bdev_io->u.bdev.num_blocks = num_blocks;
613 	g_bdev_io->u.bdev.iovs[0].iov_len = 2048;
614 	g_bdev_io->u.bdev.iovs[0].iov_base = &test_crazy_rw;
615 	g_bdev_io->u.bdev.iovs[1].iov_len = 512;
616 	g_bdev_io->u.bdev.iovs[1].iov_base = &test_crazy_rw + 2048;
617 	g_bdev_io->u.bdev.iovs[2].iov_len = 512;
618 	g_bdev_io->u.bdev.iovs[2].iov_base = &test_crazy_rw + 2048 + 512;
619 	g_bdev_io->u.bdev.iovs[3].iov_len = 1024;
620 	g_bdev_io->u.bdev.iovs[3].iov_base = &test_crazy_rw + 2048 + 512 + 512;
621 
622 	g_crypto_bdev.crypto_bdev.blocklen = block_len;
623 	g_bdev_io->type = SPDK_BDEV_IO_TYPE_WRITE;
624 	g_enqueue_mock = g_dequeue_mock = ut_rte_crypto_op_bulk_alloc = num_blocks;
625 
626 	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
627 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_SUCCESS);
628 	CU_ASSERT(g_io_ctx->cryop_cnt_remaining == num_blocks);
629 
630 	for (i = 0; i < num_blocks; i++) {
631 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->buf_addr == &test_crazy_rw + (i * block_len));
632 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->data_len == block_len);
633 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->next == NULL);
634 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.length == block_len);
635 		CU_ASSERT(g_test_crypto_ops[i]->sym->cipher.data.offset == 0);
636 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src->userdata == g_bdev_io);
637 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_src == g_test_crypto_ops[i]->sym->m_src);
638 		CU_ASSERT(g_test_crypto_ops[i]->sym->m_dst == g_test_crypto_ops[i]->sym->m_dst);
639 		spdk_mempool_put(g_mbuf_mp, g_test_crypto_ops[i]->sym->m_src);
640 		spdk_mempool_put(g_mbuf_mp, g_test_crypto_ops[i]->sym->m_dst);
641 	}
642 	spdk_dma_free(g_io_ctx->cry_iov.iov_base);
643 }
644 
645 static void
646 test_passthru(void)
647 {
648 	/* Make sure these follow our completion callback, test success & fail. */
649 	g_bdev_io->type = SPDK_BDEV_IO_TYPE_UNMAP;
650 	MOCK_SET(spdk_bdev_unmap_blocks, 0);
651 	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
652 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_SUCCESS);
653 	MOCK_SET(spdk_bdev_unmap_blocks, -1);
654 	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
655 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_FAILED);
656 	MOCK_CLEAR(spdk_bdev_unmap_blocks);
657 
658 	g_bdev_io->type = SPDK_BDEV_IO_TYPE_FLUSH;
659 	MOCK_SET(spdk_bdev_flush_blocks, 0);
660 	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
661 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_SUCCESS);
662 	MOCK_SET(spdk_bdev_flush_blocks, -1);
663 	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
664 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_FAILED);
665 	MOCK_CLEAR(spdk_bdev_flush_blocks);
666 
667 	/* We should never get a WZ command, we report that we don't support it. */
668 	g_bdev_io->type = SPDK_BDEV_IO_TYPE_WRITE_ZEROES;
669 	vbdev_crypto_submit_request(g_io_ch, g_bdev_io);
670 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_FAILED);
671 }
672 
673 static void
674 test_reset(void)
675 {
676 	/* TODO: There are a few different ways to do this given that
677 	 * the code uses spdk_for_each_channel() to implement reset
678 	 * handling. SUbmitting w/o UT for this function for now and
679 	 * will follow up with something shortly.
680 	 */
681 }
682 
683 static void
684 test_initdrivers(void)
685 {
686 	int rc;
687 	static struct spdk_mempool *orig_mbuf_mp;
688 	static struct spdk_mempool *orig_session_mp;
689 
690 
691 	/* These tests will alloc and free our g_mbuf_mp
692 	 * so save that off here and restore it after each test is over.
693 	 */
694 	orig_mbuf_mp = g_mbuf_mp;
695 	orig_session_mp = g_session_mp;
696 
697 	g_session_mp = NULL;
698 	g_mbuf_mp = NULL;
699 
700 	/* No drivers available, not an error though */
701 	MOCK_SET(rte_eal_get_configuration, g_test_config);
702 	MOCK_SET(rte_cryptodev_count, 0);
703 	rc = vbdev_crypto_init_crypto_drivers();
704 	CU_ASSERT(rc == 0);
705 	CU_ASSERT(g_mbuf_mp == NULL);
706 	CU_ASSERT(g_session_mp == NULL);
707 
708 	/* Test failure of DPDK dev init. */
709 	MOCK_SET(rte_cryptodev_count, 2);
710 	MOCK_SET(rte_vdev_init, -1);
711 	rc = vbdev_crypto_init_crypto_drivers();
712 	CU_ASSERT(rc == -EINVAL);
713 	CU_ASSERT(g_mbuf_mp == NULL);
714 	CU_ASSERT(g_session_mp == NULL);
715 	MOCK_SET(rte_vdev_init, 0);
716 
717 	/* Can't create session pool. */
718 	MOCK_SET(spdk_mempool_create, NULL);
719 	rc = vbdev_crypto_init_crypto_drivers();
720 	CU_ASSERT(rc == -ENOMEM);
721 	CU_ASSERT(g_mbuf_mp == NULL);
722 	CU_ASSERT(g_session_mp == NULL);
723 	MOCK_CLEAR(spdk_mempool_create);
724 
725 	/* Can't create op pool. */
726 	MOCK_SET(rte_crypto_op_pool_create, NULL);
727 	rc = vbdev_crypto_init_crypto_drivers();
728 	CU_ASSERT(rc == -ENOMEM);
729 	CU_ASSERT(g_mbuf_mp == NULL);
730 	CU_ASSERT(g_session_mp == NULL);
731 	MOCK_SET(rte_crypto_op_pool_create, (struct rte_mempool *)1);
732 
733 	/* Check resources are sufficient failure. */
734 	MOCK_CLEARED_ASSERT(spdk_mempool_create);
735 	rc = vbdev_crypto_init_crypto_drivers();
736 	CU_ASSERT(rc == -EINVAL);
737 
738 	/* Test crypto dev configure failure. */
739 	MOCK_SET(rte_cryptodev_device_count_by_driver, 2);
740 	MOCK_SET(rte_cryptodev_info_get, 1);
741 	MOCK_SET(rte_cryptodev_configure, -1);
742 	MOCK_CLEARED_ASSERT(spdk_mempool_create);
743 	rc = vbdev_crypto_init_crypto_drivers();
744 	MOCK_SET(rte_cryptodev_configure, 0);
745 	CU_ASSERT(g_mbuf_mp == NULL);
746 	CU_ASSERT(g_session_mp == NULL);
747 	CU_ASSERT(rc == -EINVAL);
748 
749 	/* Test failure of qp setup. */
750 	MOCK_SET(rte_cryptodev_queue_pair_setup, -1);
751 	MOCK_CLEARED_ASSERT(spdk_mempool_create);
752 	rc = vbdev_crypto_init_crypto_drivers();
753 	CU_ASSERT(rc == -EINVAL);
754 	CU_ASSERT(g_mbuf_mp == NULL);
755 	CU_ASSERT(g_session_mp == NULL);
756 	MOCK_SET(rte_cryptodev_queue_pair_setup, 0);
757 
758 	/* Test failure of dev start. */
759 	MOCK_SET(rte_cryptodev_start, -1);
760 	MOCK_CLEARED_ASSERT(spdk_mempool_create);
761 	rc = vbdev_crypto_init_crypto_drivers();
762 	CU_ASSERT(rc == -EINVAL);
763 	CU_ASSERT(g_mbuf_mp == NULL);
764 	CU_ASSERT(g_session_mp == NULL);
765 	MOCK_SET(rte_cryptodev_start, 0);
766 
767 	/* Test happy path. */
768 	MOCK_CLEARED_ASSERT(spdk_mempool_create);
769 	rc = vbdev_crypto_init_crypto_drivers();
770 	/* We don't have spdk_mempool_create mocked right now, so make sure to free the mempools. */
771 	CU_ASSERT(g_mbuf_mp != NULL);
772 	CU_ASSERT(g_session_mp != NULL);
773 	spdk_mempool_free(g_mbuf_mp);
774 	spdk_mempool_free(g_session_mp);
775 	CU_ASSERT(rc == 0);
776 
777 	/* restore our initial values. */
778 	g_mbuf_mp = orig_mbuf_mp;
779 	g_session_mp = orig_session_mp;
780 }
781 
782 static void
783 test_crypto_op_complete(void)
784 {
785 	/* Need to prove to scan-build that we are setting iov_bases properly. */
786 	void *old_iov_base;
787 	struct crypto_bdev_io *orig_ctx;
788 
789 	/* Make sure completion code respects failure. */
790 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_FAILED;
791 	g_completion_called = false;
792 	_crypto_operation_complete(g_bdev_io);
793 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_FAILED);
794 	CU_ASSERT(g_completion_called == true);
795 
796 	/* Test read completion. */
797 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
798 	g_bdev_io->type = SPDK_BDEV_IO_TYPE_READ;
799 	g_completion_called = false;
800 	_crypto_operation_complete(g_bdev_io);
801 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_SUCCESS);
802 	CU_ASSERT(g_completion_called == true);
803 
804 	/* Test write completion success. */
805 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
806 	g_bdev_io->type = SPDK_BDEV_IO_TYPE_WRITE;
807 	g_completion_called = false;
808 	MOCK_SET(spdk_bdev_writev_blocks, 0);
809 	/* Code under test will free this, if not ASAN will complain. */
810 	g_io_ctx->cry_iov.iov_base = spdk_dma_malloc(16, 0x10, NULL);
811 	orig_ctx = (struct crypto_bdev_io *)g_bdev_io->driver_ctx;
812 	old_iov_base = orig_ctx->cry_iov.iov_base;
813 	_crypto_operation_complete(g_bdev_io);
814 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_SUCCESS);
815 	CU_ASSERT(g_completion_called == true);
816 
817 	/* Test write completion failed. */
818 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
819 	g_bdev_io->type = SPDK_BDEV_IO_TYPE_WRITE;
820 	g_completion_called = false;
821 	MOCK_SET(spdk_bdev_writev_blocks, -1);
822 	/* Code under test will free this, if not ASAN will complain. */
823 	g_io_ctx->cry_iov.iov_base = spdk_dma_malloc(16, 0x10, NULL);
824 	SPDK_CU_ASSERT_FATAL(old_iov_base != orig_ctx->cry_iov.iov_base);
825 	_crypto_operation_complete(g_bdev_io);
826 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_FAILED);
827 	CU_ASSERT(g_completion_called == true);
828 
829 	/* Test bogus type for this completion. */
830 	g_bdev_io->internal.status = SPDK_BDEV_IO_STATUS_SUCCESS;
831 	g_bdev_io->type = SPDK_BDEV_IO_TYPE_RESET;
832 	g_completion_called = false;
833 	_crypto_operation_complete(g_bdev_io);
834 	CU_ASSERT(g_bdev_io->internal.status == SPDK_BDEV_IO_STATUS_FAILED);
835 	CU_ASSERT(g_completion_called == true);
836 }
837 
838 static void
839 test_supported_io(void)
840 {
841 	void *ctx = NULL;
842 	bool rc = true;
843 
844 	/* Make sure we always report false to WZ, we need the bdev layer to
845 	 * send real 0's so we can encrypt/decrypt them.
846 	 */
847 	rc = vbdev_crypto_io_type_supported(ctx, SPDK_BDEV_IO_TYPE_WRITE_ZEROES);
848 	CU_ASSERT(rc == false);
849 }
850 
851 int
852 main(int argc, char **argv)
853 {
854 	CU_pSuite	suite = NULL;
855 	unsigned int	num_failures;
856 
857 	if (CU_initialize_registry() != CUE_SUCCESS) {
858 		return CU_get_error();
859 	}
860 
861 	suite = CU_add_suite("crypto", test_setup, test_cleanup);
862 	if (suite == NULL) {
863 		CU_cleanup_registry();
864 		return CU_get_error();
865 	}
866 
867 	if (CU_add_test(suite, "test_error_paths",
868 			test_error_paths) == NULL ||
869 	    CU_add_test(suite, "test_simple_write",
870 			test_simple_write) == NULL ||
871 	    CU_add_test(suite, "test_simple_read",
872 			test_simple_read) == NULL ||
873 	    CU_add_test(suite, "test_large_rw",
874 			test_large_rw) == NULL ||
875 	    CU_add_test(suite, "test_dev_full",
876 			test_dev_full) == NULL ||
877 	    CU_add_test(suite, "test_crazy_rw",
878 			test_crazy_rw) == NULL ||
879 	    CU_add_test(suite, "test_passthru",
880 			test_passthru) == NULL ||
881 	    CU_add_test(suite, "test_initdrivers",
882 			test_initdrivers) == NULL ||
883 	    CU_add_test(suite, "test_crypto_op_complete",
884 			test_crypto_op_complete) == NULL ||
885 	    CU_add_test(suite, "test_supported_io",
886 			test_supported_io) == NULL ||
887 	    CU_add_test(suite, "test_reset",
888 			test_reset) == NULL
889 	   ) {
890 		CU_cleanup_registry();
891 		return CU_get_error();
892 	}
893 
894 	CU_basic_set_mode(CU_BRM_VERBOSE);
895 	CU_basic_run_tests();
896 	num_failures = CU_get_number_of_failures();
897 	CU_cleanup_registry();
898 	return num_failures;
899 }
900