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