xref: /spdk/test/unit/lib/bdev/bdev_zone.c/bdev_zone_ut.c (revision ea941caeaf896fdf2aef7685f86f37023060faed)
1488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse  *   Copyright (C) 2019 Intel Corporation.
3861010b2Sdongx.yi  *   All rights reserved.
4861010b2Sdongx.yi  */
5861010b2Sdongx.yi 
6861010b2Sdongx.yi #include "spdk/stdinc.h"
7ae431e31SKonrad Sztyber #include "spdk_internal/cunit.h"
8861010b2Sdongx.yi #include "spdk/env.h"
9861010b2Sdongx.yi #include "spdk_internal/mock.h"
10861010b2Sdongx.yi 
11861010b2Sdongx.yi #include "bdev/bdev_zone.c"
12861010b2Sdongx.yi 
13a1d68e9cSJim Harris DEFINE_STUB_V(bdev_io_init, (struct spdk_bdev_io *bdev_io,
14861010b2Sdongx.yi 			     struct spdk_bdev *bdev, void *cb_arg,
15861010b2Sdongx.yi 			     spdk_bdev_io_completion_cb cb));
16861010b2Sdongx.yi 
176c07e9d1SJim Harris DEFINE_STUB_V(bdev_io_submit, (struct spdk_bdev_io *bdev_io));
18861010b2Sdongx.yi 
19861010b2Sdongx.yi /* Construct zone_io_operation structure */
20861010b2Sdongx.yi struct zone_io_operation {
21861010b2Sdongx.yi 	struct spdk_bdev_desc *desc;
22861010b2Sdongx.yi 	struct spdk_io_channel *ch;
23861010b2Sdongx.yi 	struct iovec iov;
24861010b2Sdongx.yi 	union {
25861010b2Sdongx.yi 		struct {
26861010b2Sdongx.yi 			uint64_t zone_id;
27861010b2Sdongx.yi 			size_t num_zones;
28861010b2Sdongx.yi 			enum spdk_bdev_zone_action zone_action;
29861010b2Sdongx.yi 			void *buf;
30861010b2Sdongx.yi 			struct spdk_bdev_zone_info *info_;
31861010b2Sdongx.yi 		} zone_mgmt;
32861010b2Sdongx.yi 		struct {
33861010b2Sdongx.yi 			void *md_buf;
34861010b2Sdongx.yi 			struct iovec *iovs;
35861010b2Sdongx.yi 			int iovcnt;
36861010b2Sdongx.yi 			uint64_t num_blocks;
37861010b2Sdongx.yi 			uint64_t offset_blocks;
38861010b2Sdongx.yi 			uint64_t start_lba;
39861010b2Sdongx.yi 		} bdev;
40861010b2Sdongx.yi 	};
41861010b2Sdongx.yi 	spdk_bdev_io_completion_cb cb;
42861010b2Sdongx.yi 	void *cb_arg;
43861010b2Sdongx.yi 	enum spdk_bdev_io_type io_type;
44861010b2Sdongx.yi };
45861010b2Sdongx.yi 
46861010b2Sdongx.yi /* Global variables */
47861010b2Sdongx.yi struct zone_io_operation *g_zone_op = NULL;
48861010b2Sdongx.yi static struct spdk_bdev *g_bdev = NULL;
49861010b2Sdongx.yi static struct spdk_bdev_io  *g_bdev_io = NULL;
50861010b2Sdongx.yi static struct spdk_bdev_zone_info g_zone_info = {0};
51861010b2Sdongx.yi static enum spdk_bdev_zone_action g_zone_action = SPDK_BDEV_ZONE_OPEN;
52861010b2Sdongx.yi static enum spdk_bdev_zone_action g_unexpected_zone_action = SPDK_BDEV_ZONE_CLOSE;
53861010b2Sdongx.yi static enum spdk_bdev_io_type g_io_type = SPDK_BDEV_IO_TYPE_GET_ZONE_INFO;
54861010b2Sdongx.yi 
55861010b2Sdongx.yi static uint64_t g_expected_zone_id;
56861010b2Sdongx.yi static uint64_t g_expected_num_zones;
57861010b2Sdongx.yi static uint64_t g_unexpected_zone_id;
58861010b2Sdongx.yi static uint64_t g_unexpected_num_zones;
59861010b2Sdongx.yi static uint64_t g_num_blocks;
60861010b2Sdongx.yi static uint64_t g_unexpected_num_blocks;
61861010b2Sdongx.yi static uint64_t g_start_lba;
62861010b2Sdongx.yi static uint64_t g_unexpected_start_lba;
63861010b2Sdongx.yi static uint64_t g_bdev_blocklen;
64861010b2Sdongx.yi static uint64_t g_unexpected_bdev_blocklen;
65861010b2Sdongx.yi static int g_unexpected_iovcnt;
66861010b2Sdongx.yi static void *g_md_buf;
67c9c7c281SJosh Soref static void *g_unexpected_md_buf;
68861010b2Sdongx.yi static void *g_buf;
69861010b2Sdongx.yi static void *g_unexpected_buf;
70861010b2Sdongx.yi 
71861010b2Sdongx.yi static int
test_setup(void)72861010b2Sdongx.yi test_setup(void)
73861010b2Sdongx.yi {
74861010b2Sdongx.yi 	/* Initiate expected and unexpected value here */
75861010b2Sdongx.yi 	g_expected_zone_id = 0x1000;
76861010b2Sdongx.yi 	g_expected_num_zones = 1024;
77861010b2Sdongx.yi 	g_unexpected_zone_id = 0xFFFF;
78861010b2Sdongx.yi 	g_unexpected_num_zones = 0;
79861010b2Sdongx.yi 	g_num_blocks = 4096 * 1024;
80861010b2Sdongx.yi 	g_unexpected_num_blocks = 0;
81861010b2Sdongx.yi 	g_start_lba = 4096;
82861010b2Sdongx.yi 	g_unexpected_start_lba = 0;
83861010b2Sdongx.yi 	g_bdev_blocklen = 4096;
84861010b2Sdongx.yi 	g_unexpected_bdev_blocklen = 0;
85861010b2Sdongx.yi 	g_unexpected_iovcnt = 1000;
86861010b2Sdongx.yi 	g_md_buf = (void *)0xEFDCFEDE;
87c9c7c281SJosh Soref 	g_unexpected_md_buf = (void *)0xFECDEFDC;
88861010b2Sdongx.yi 	g_buf = (void *)0xFEEDBEEF;
89861010b2Sdongx.yi 	g_unexpected_buf = (void *)0xDEADBEEF;
90861010b2Sdongx.yi 
91861010b2Sdongx.yi 	return 0;
92861010b2Sdongx.yi }
93861010b2Sdongx.yi 
94861010b2Sdongx.yi static int
test_cleanup(void)95861010b2Sdongx.yi test_cleanup(void)
96861010b2Sdongx.yi {
97861010b2Sdongx.yi 	return 0;
98861010b2Sdongx.yi }
99861010b2Sdongx.yi 
100861010b2Sdongx.yi static void
start_operation(void)101861010b2Sdongx.yi start_operation(void)
102861010b2Sdongx.yi {
103861010b2Sdongx.yi 	g_zone_op = calloc(1, sizeof(struct zone_io_operation));
104861010b2Sdongx.yi 	SPDK_CU_ASSERT_FATAL(g_zone_op != NULL);
105861010b2Sdongx.yi 
106861010b2Sdongx.yi 	switch (g_io_type) {
107861010b2Sdongx.yi 	case SPDK_BDEV_IO_TYPE_ZONE_APPEND:
108861010b2Sdongx.yi 		g_zone_op->bdev.iovs = &g_zone_op->iov;
109861010b2Sdongx.yi 		g_zone_op->bdev.iovs[0].iov_base = g_unexpected_buf;
110861010b2Sdongx.yi 		g_zone_op->bdev.iovs[0].iov_len = g_unexpected_num_blocks * g_unexpected_bdev_blocklen;
111861010b2Sdongx.yi 		g_zone_op->bdev.iovcnt = g_unexpected_iovcnt;
112c9c7c281SJosh Soref 		g_zone_op->bdev.md_buf = g_unexpected_md_buf;
113861010b2Sdongx.yi 		g_zone_op->bdev.num_blocks = g_unexpected_num_blocks;
114861010b2Sdongx.yi 		g_zone_op->bdev.offset_blocks = g_unexpected_zone_id;
115861010b2Sdongx.yi 		g_zone_op->bdev.start_lba = g_unexpected_start_lba;
116861010b2Sdongx.yi 		break;
117861010b2Sdongx.yi 	default:
118861010b2Sdongx.yi 		g_zone_op->bdev.iovcnt = 0;
119861010b2Sdongx.yi 		g_zone_op->zone_mgmt.zone_id = g_unexpected_zone_id;
120861010b2Sdongx.yi 		g_zone_op->zone_mgmt.num_zones = g_unexpected_num_zones;
121861010b2Sdongx.yi 		g_zone_op->zone_mgmt.zone_action = g_unexpected_zone_action;
122861010b2Sdongx.yi 		g_zone_op->zone_mgmt.buf = g_unexpected_buf;
123861010b2Sdongx.yi 		break;
124861010b2Sdongx.yi 	}
125861010b2Sdongx.yi }
126861010b2Sdongx.yi 
127861010b2Sdongx.yi static void
stop_operation(void)128861010b2Sdongx.yi stop_operation(void)
129861010b2Sdongx.yi {
130861010b2Sdongx.yi 	free(g_bdev_io);
131861010b2Sdongx.yi 	free(g_bdev);
132861010b2Sdongx.yi 	free(g_zone_op);
133861010b2Sdongx.yi 	g_bdev_io = NULL;
134861010b2Sdongx.yi 	g_bdev = NULL;
135861010b2Sdongx.yi 	g_zone_op = NULL;
136861010b2Sdongx.yi }
137861010b2Sdongx.yi 
138861010b2Sdongx.yi struct spdk_bdev_io *
bdev_channel_get_io(struct spdk_bdev_channel * channel)139fdfb4e12SJim Harris bdev_channel_get_io(struct spdk_bdev_channel *channel)
140861010b2Sdongx.yi {
141861010b2Sdongx.yi 	struct spdk_bdev_io *bdev_io;
142861010b2Sdongx.yi 
143861010b2Sdongx.yi 	bdev_io = calloc(1, sizeof(struct spdk_bdev_io));
144861010b2Sdongx.yi 	SPDK_CU_ASSERT_FATAL(bdev_io != NULL);
145861010b2Sdongx.yi 
146861010b2Sdongx.yi 	bdev_io->internal.ch = channel;
147861010b2Sdongx.yi 	bdev_io->type = g_io_type;
148861010b2Sdongx.yi 
149861010b2Sdongx.yi 	CU_ASSERT(g_zone_op != NULL);
150861010b2Sdongx.yi 
151861010b2Sdongx.yi 	switch (g_io_type) {
152861010b2Sdongx.yi 	case SPDK_BDEV_IO_TYPE_GET_ZONE_INFO:
153861010b2Sdongx.yi 	case SPDK_BDEV_IO_TYPE_ZONE_MANAGEMENT:
154861010b2Sdongx.yi 		bdev_io->u.bdev.iovcnt = 0;
155861010b2Sdongx.yi 		bdev_io->u.zone_mgmt.zone_id  = g_zone_op->zone_mgmt.zone_id;
156861010b2Sdongx.yi 		bdev_io->u.zone_mgmt.num_zones = g_zone_op->zone_mgmt.num_zones;
157861010b2Sdongx.yi 		bdev_io->u.zone_mgmt.zone_action = g_zone_op->zone_mgmt.zone_action;
158861010b2Sdongx.yi 		bdev_io->u.zone_mgmt.buf = g_zone_op->zone_mgmt.buf;
159861010b2Sdongx.yi 		break;
160861010b2Sdongx.yi 	case SPDK_BDEV_IO_TYPE_ZONE_APPEND:
161861010b2Sdongx.yi 		bdev_io->u.bdev.iovs = g_zone_op->bdev.iovs;
162861010b2Sdongx.yi 		bdev_io->u.bdev.iovs[0].iov_base = g_zone_op->bdev.iovs[0].iov_base;
163861010b2Sdongx.yi 		bdev_io->u.bdev.iovs[0].iov_len = g_zone_op->bdev.iovs[0].iov_len;
164861010b2Sdongx.yi 		bdev_io->u.bdev.iovcnt = g_zone_op->bdev.iovcnt;
165861010b2Sdongx.yi 		bdev_io->u.bdev.md_buf = g_zone_op->bdev.md_buf;
166861010b2Sdongx.yi 		bdev_io->u.bdev.num_blocks = g_zone_op->bdev.num_blocks;
167861010b2Sdongx.yi 		bdev_io->u.bdev.offset_blocks = g_zone_op->bdev.offset_blocks;
168861010b2Sdongx.yi 		break;
169861010b2Sdongx.yi 	default:
170861010b2Sdongx.yi 		CU_ASSERT(0);
171861010b2Sdongx.yi 	}
172861010b2Sdongx.yi 
173861010b2Sdongx.yi 	g_bdev_io = bdev_io;
174861010b2Sdongx.yi 
175861010b2Sdongx.yi 	return bdev_io;
176861010b2Sdongx.yi }
177861010b2Sdongx.yi 
178861010b2Sdongx.yi int
spdk_bdev_open_ext(const char * bdev_name,bool write,spdk_bdev_event_cb_t event_cb,void * event_ctx,struct spdk_bdev_desc ** _desc)1797a85820dSShuhei Matsumoto spdk_bdev_open_ext(const char *bdev_name, bool write, spdk_bdev_event_cb_t event_cb,
1807a85820dSShuhei Matsumoto 		   void *event_ctx, struct spdk_bdev_desc **_desc)
181861010b2Sdongx.yi {
182861010b2Sdongx.yi 	*_desc = (void *)0x1;
183861010b2Sdongx.yi 	return 0;
184861010b2Sdongx.yi }
185861010b2Sdongx.yi 
186861010b2Sdongx.yi struct spdk_io_channel *
spdk_bdev_get_io_channel(struct spdk_bdev_desc * desc)187861010b2Sdongx.yi spdk_bdev_get_io_channel(struct spdk_bdev_desc *desc)
188861010b2Sdongx.yi {
189861010b2Sdongx.yi 	return (struct spdk_io_channel *)0x1;
190861010b2Sdongx.yi }
191861010b2Sdongx.yi 
192861010b2Sdongx.yi void
spdk_put_io_channel(struct spdk_io_channel * ch)193861010b2Sdongx.yi spdk_put_io_channel(struct spdk_io_channel *ch)
194861010b2Sdongx.yi {
195861010b2Sdongx.yi 	CU_ASSERT(ch == (void *)1);
196861010b2Sdongx.yi }
197861010b2Sdongx.yi 
198861010b2Sdongx.yi struct spdk_bdev *
spdk_bdev_desc_get_bdev(struct spdk_bdev_desc * desc)199861010b2Sdongx.yi spdk_bdev_desc_get_bdev(struct spdk_bdev_desc *desc)
200861010b2Sdongx.yi {
201861010b2Sdongx.yi 	struct spdk_bdev *bdev;
202861010b2Sdongx.yi 
203861010b2Sdongx.yi 	bdev = calloc(1, sizeof(struct spdk_bdev));
204861010b2Sdongx.yi 	SPDK_CU_ASSERT_FATAL(bdev != NULL);
205861010b2Sdongx.yi 
206861010b2Sdongx.yi 	if (g_io_type == SPDK_BDEV_IO_TYPE_ZONE_APPEND) {
207861010b2Sdongx.yi 		bdev->blocklen = g_bdev_blocklen;
208861010b2Sdongx.yi 	}
209861010b2Sdongx.yi 
210861010b2Sdongx.yi 	g_bdev = bdev;
211861010b2Sdongx.yi 
212861010b2Sdongx.yi 	return bdev;
213861010b2Sdongx.yi }
214861010b2Sdongx.yi 
215861010b2Sdongx.yi static void
test_get_zone_size(void)216861010b2Sdongx.yi test_get_zone_size(void)
217861010b2Sdongx.yi {
218861010b2Sdongx.yi 	struct spdk_bdev bdev = {};
219861010b2Sdongx.yi 	uint64_t get_zone_size;
220861010b2Sdongx.yi 
221861010b2Sdongx.yi 	bdev.zone_size = 1024 * 4096;
222861010b2Sdongx.yi 
223861010b2Sdongx.yi 	get_zone_size = spdk_bdev_get_zone_size(&bdev);
224861010b2Sdongx.yi 	CU_ASSERT(get_zone_size == 1024 * 4096);
225861010b2Sdongx.yi }
226861010b2Sdongx.yi 
227861010b2Sdongx.yi static void
test_get_num_zones(void)2280859db6bSNiklas Cassel test_get_num_zones(void)
2290859db6bSNiklas Cassel {
2300859db6bSNiklas Cassel 	struct spdk_bdev bdev = {};
2310859db6bSNiklas Cassel 	uint64_t get_num_zones;
2320859db6bSNiklas Cassel 
2330859db6bSNiklas Cassel 	bdev.blockcnt = 1024 * 1024 * 1024;
2340859db6bSNiklas Cassel 	bdev.zone_size = 1024 * 4096;
2350859db6bSNiklas Cassel 
2360859db6bSNiklas Cassel 	get_num_zones = spdk_bdev_get_num_zones(&bdev);
2370859db6bSNiklas Cassel 	CU_ASSERT(get_num_zones == 256);
2380859db6bSNiklas Cassel }
2390859db6bSNiklas Cassel 
2400859db6bSNiklas Cassel static void
test_get_zone_id(void)241b7ad5b0bSNiklas Cassel test_get_zone_id(void)
242b7ad5b0bSNiklas Cassel {
243b7ad5b0bSNiklas Cassel 	struct spdk_bdev bdev = {};
244b7ad5b0bSNiklas Cassel 	uint64_t get_zone_id;
245b7ad5b0bSNiklas Cassel 
246b7ad5b0bSNiklas Cassel 	bdev.blockcnt = 1024 * 1024 * 1024;
247b7ad5b0bSNiklas Cassel 	bdev.zone_size = 1024 * 4096;
248b7ad5b0bSNiklas Cassel 
249b7ad5b0bSNiklas Cassel 	get_zone_id = spdk_bdev_get_zone_id(&bdev, 0x800032);
250b7ad5b0bSNiklas Cassel 	CU_ASSERT(get_zone_id == 0x800000);
251b7ad5b0bSNiklas Cassel }
252b7ad5b0bSNiklas Cassel 
253b7ad5b0bSNiklas Cassel static void
test_get_max_zone_append_size(void)2549f5852d0SNiklas Cassel test_get_max_zone_append_size(void)
2559f5852d0SNiklas Cassel {
2569f5852d0SNiklas Cassel 	struct spdk_bdev bdev = {};
2579f5852d0SNiklas Cassel 	uint32_t get_max_zone_append_size;
2589f5852d0SNiklas Cassel 
2599f5852d0SNiklas Cassel 	bdev.max_zone_append_size = 32;
2609f5852d0SNiklas Cassel 
2619f5852d0SNiklas Cassel 	get_max_zone_append_size = spdk_bdev_get_max_zone_append_size(&bdev);
2629f5852d0SNiklas Cassel 	CU_ASSERT(get_max_zone_append_size == 32);
2639f5852d0SNiklas Cassel }
2649f5852d0SNiklas Cassel 
2659f5852d0SNiklas Cassel static void
test_get_max_open_zones(void)266861010b2Sdongx.yi test_get_max_open_zones(void)
267861010b2Sdongx.yi {
268861010b2Sdongx.yi 	struct spdk_bdev bdev = {};
269861010b2Sdongx.yi 	uint32_t get_max_open_zones;
270861010b2Sdongx.yi 
271861010b2Sdongx.yi 	bdev.max_open_zones = 8192;
272861010b2Sdongx.yi 
273861010b2Sdongx.yi 	get_max_open_zones = spdk_bdev_get_max_open_zones(&bdev);
274861010b2Sdongx.yi 	CU_ASSERT(get_max_open_zones == 8192);
275861010b2Sdongx.yi }
276861010b2Sdongx.yi 
277861010b2Sdongx.yi static void
test_get_max_active_zones(void)278ee4868deSNiklas Cassel test_get_max_active_zones(void)
279ee4868deSNiklas Cassel {
280ee4868deSNiklas Cassel 	struct spdk_bdev bdev = {};
281ee4868deSNiklas Cassel 	uint32_t get_max_active_zones;
282ee4868deSNiklas Cassel 
283ee4868deSNiklas Cassel 	bdev.max_active_zones = 9216;
284ee4868deSNiklas Cassel 
285ee4868deSNiklas Cassel 	get_max_active_zones = spdk_bdev_get_max_active_zones(&bdev);
286ee4868deSNiklas Cassel 	CU_ASSERT(get_max_active_zones == 9216);
287ee4868deSNiklas Cassel }
288ee4868deSNiklas Cassel 
289ee4868deSNiklas Cassel static void
test_get_optimal_open_zones(void)290861010b2Sdongx.yi test_get_optimal_open_zones(void)
291861010b2Sdongx.yi {
292861010b2Sdongx.yi 	struct spdk_bdev bdev = {};
293861010b2Sdongx.yi 	uint32_t get_optimal_open_zones;
294861010b2Sdongx.yi 
295861010b2Sdongx.yi 	bdev.optimal_open_zones = 4096;
296861010b2Sdongx.yi 
297861010b2Sdongx.yi 	get_optimal_open_zones = spdk_bdev_get_optimal_open_zones(&bdev);
298861010b2Sdongx.yi 	CU_ASSERT(get_optimal_open_zones == 4096);
299861010b2Sdongx.yi }
300861010b2Sdongx.yi 
301861010b2Sdongx.yi static void
test_bdev_io_get_append_location(void)302861010b2Sdongx.yi test_bdev_io_get_append_location(void)
303861010b2Sdongx.yi {
304861010b2Sdongx.yi 	struct spdk_bdev_io bdev_io = {};
305861010b2Sdongx.yi 	uint64_t get_offset_blocks;
306861010b2Sdongx.yi 
307861010b2Sdongx.yi 	bdev_io.u.bdev.offset_blocks = 1024 * 10;
308861010b2Sdongx.yi 
309861010b2Sdongx.yi 	get_offset_blocks = spdk_bdev_io_get_append_location(&bdev_io);
310861010b2Sdongx.yi 	CU_ASSERT(get_offset_blocks == 1024 * 10);
311861010b2Sdongx.yi }
312861010b2Sdongx.yi 
313861010b2Sdongx.yi static void
test_zone_get_operation(void)314861010b2Sdongx.yi test_zone_get_operation(void)
315861010b2Sdongx.yi {
316861010b2Sdongx.yi 	test_get_zone_size();
3170859db6bSNiklas Cassel 	test_get_num_zones();
318b7ad5b0bSNiklas Cassel 	test_get_zone_id();
3199f5852d0SNiklas Cassel 	test_get_max_zone_append_size();
320861010b2Sdongx.yi 	test_get_max_open_zones();
321ee4868deSNiklas Cassel 	test_get_max_active_zones();
322861010b2Sdongx.yi 	test_get_optimal_open_zones();
323861010b2Sdongx.yi }
324861010b2Sdongx.yi 
325861010b2Sdongx.yi #define DECLARE_VIRTUAL_BDEV_START() \
326861010b2Sdongx.yi     struct spdk_bdev bdev; \
327861010b2Sdongx.yi     struct spdk_io_channel *ch; \
328861010b2Sdongx.yi     struct spdk_bdev_desc *desc = NULL; \
329861010b2Sdongx.yi     int rc; \
330861010b2Sdongx.yi     memset(&bdev, 0, sizeof(bdev)); \
331861010b2Sdongx.yi     bdev.name = "bdev_zone_ut"; \
3327a85820dSShuhei Matsumoto     rc = spdk_bdev_open_ext(bdev.name, true, NULL, NULL, &desc); \
333861010b2Sdongx.yi     CU_ASSERT(rc == 0); \
334861010b2Sdongx.yi     SPDK_CU_ASSERT_FATAL(desc != NULL); \
335861010b2Sdongx.yi     ch = spdk_bdev_get_io_channel(desc); \
336861010b2Sdongx.yi     CU_ASSERT(ch != NULL);\
337861010b2Sdongx.yi 
338861010b2Sdongx.yi static void
test_bdev_zone_get_info(void)339861010b2Sdongx.yi test_bdev_zone_get_info(void)
340861010b2Sdongx.yi {
341861010b2Sdongx.yi 	DECLARE_VIRTUAL_BDEV_START();
342861010b2Sdongx.yi 
343861010b2Sdongx.yi 	g_zone_info.zone_id = g_expected_zone_id;
344861010b2Sdongx.yi 	g_io_type = SPDK_BDEV_IO_TYPE_GET_ZONE_INFO;
345861010b2Sdongx.yi 
346861010b2Sdongx.yi 	start_operation();
347861010b2Sdongx.yi 
348861010b2Sdongx.yi 	rc = spdk_bdev_get_zone_info(desc, ch, g_expected_zone_id, g_expected_num_zones, &g_zone_info, NULL,
349861010b2Sdongx.yi 				     NULL);
350861010b2Sdongx.yi 	CU_ASSERT(rc == 0);
351861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->type == SPDK_BDEV_IO_TYPE_GET_ZONE_INFO);
352861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.zone_mgmt.zone_id == g_expected_zone_id);
353861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.zone_mgmt.num_zones == g_expected_num_zones);
354861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.zone_mgmt.buf == &g_zone_info);
355861010b2Sdongx.yi 
356861010b2Sdongx.yi 	stop_operation();
357861010b2Sdongx.yi }
358861010b2Sdongx.yi 
359861010b2Sdongx.yi static void
test_bdev_zone_management(void)360861010b2Sdongx.yi test_bdev_zone_management(void)
361861010b2Sdongx.yi {
362861010b2Sdongx.yi 	DECLARE_VIRTUAL_BDEV_START();
363861010b2Sdongx.yi 
364861010b2Sdongx.yi 	g_zone_info.zone_id = g_expected_zone_id;
365861010b2Sdongx.yi 	g_io_type = SPDK_BDEV_IO_TYPE_ZONE_MANAGEMENT;
366861010b2Sdongx.yi 
367861010b2Sdongx.yi 	start_operation();
368861010b2Sdongx.yi 
369861010b2Sdongx.yi 	rc = spdk_bdev_zone_management(desc, ch, g_expected_zone_id, g_zone_action, NULL,
370861010b2Sdongx.yi 				       NULL);
371861010b2Sdongx.yi 	CU_ASSERT(rc == 0);
372861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->type == SPDK_BDEV_IO_TYPE_ZONE_MANAGEMENT);
373861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.zone_mgmt.zone_id == g_expected_zone_id);
374861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.zone_mgmt.zone_action == g_zone_action);
375861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.zone_mgmt.num_zones == 1);
376861010b2Sdongx.yi 
377861010b2Sdongx.yi 	stop_operation();
378861010b2Sdongx.yi }
379861010b2Sdongx.yi 
380861010b2Sdongx.yi static void
test_bdev_zone_append(void)381861010b2Sdongx.yi test_bdev_zone_append(void)
382861010b2Sdongx.yi {
383861010b2Sdongx.yi 	DECLARE_VIRTUAL_BDEV_START();
384861010b2Sdongx.yi 
385861010b2Sdongx.yi 	g_io_type = SPDK_BDEV_IO_TYPE_ZONE_APPEND;
386861010b2Sdongx.yi 
387861010b2Sdongx.yi 	start_operation();
388861010b2Sdongx.yi 
389861010b2Sdongx.yi 	rc = spdk_bdev_zone_append(desc, ch, g_buf, g_start_lba, g_num_blocks, NULL, NULL);
390861010b2Sdongx.yi 
391861010b2Sdongx.yi 	CU_ASSERT(rc == 0);
392861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->internal.desc == desc);
393861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->type == SPDK_BDEV_IO_TYPE_ZONE_APPEND);
394861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.bdev.iovs[0].iov_base == g_buf);
395861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.bdev.iovs[0].iov_len == g_num_blocks * g_bdev_blocklen);
396861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.bdev.iovcnt == 1);
397861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.bdev.md_buf == NULL);
398861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.bdev.num_blocks == g_num_blocks);
399861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.bdev.offset_blocks == g_expected_zone_id);
400861010b2Sdongx.yi 
401861010b2Sdongx.yi 	stop_operation();
402861010b2Sdongx.yi }
403861010b2Sdongx.yi 
404861010b2Sdongx.yi static void
test_bdev_zone_append_with_md(void)405861010b2Sdongx.yi test_bdev_zone_append_with_md(void)
406861010b2Sdongx.yi {
407861010b2Sdongx.yi 	DECLARE_VIRTUAL_BDEV_START();
408861010b2Sdongx.yi 
409861010b2Sdongx.yi 	g_io_type = SPDK_BDEV_IO_TYPE_ZONE_APPEND;
410861010b2Sdongx.yi 
411861010b2Sdongx.yi 	start_operation();
412861010b2Sdongx.yi 
413861010b2Sdongx.yi 	rc = spdk_bdev_zone_append_with_md(desc, ch, g_buf, g_md_buf, g_start_lba, g_num_blocks, NULL,
414861010b2Sdongx.yi 					   NULL);
415861010b2Sdongx.yi 
416861010b2Sdongx.yi 	CU_ASSERT(rc == 0);
417861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->internal.desc == desc);
418861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->type == SPDK_BDEV_IO_TYPE_ZONE_APPEND);
419861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.bdev.iovs[0].iov_base == g_buf);
420861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.bdev.iovs[0].iov_len == g_num_blocks * g_bdev_blocklen);
421861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.bdev.iovcnt == 1);
422861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.bdev.md_buf == g_md_buf);
423861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.bdev.num_blocks == g_num_blocks);
424861010b2Sdongx.yi 	CU_ASSERT(g_bdev_io->u.bdev.offset_blocks == g_expected_zone_id);
425861010b2Sdongx.yi 
426861010b2Sdongx.yi 	stop_operation();
427861010b2Sdongx.yi }
428861010b2Sdongx.yi 
4297315b003SKanKuo static void
test_bdev_zone_appendv(void)4307315b003SKanKuo test_bdev_zone_appendv(void)
4317315b003SKanKuo {
4327315b003SKanKuo 	DECLARE_VIRTUAL_BDEV_START();
4337315b003SKanKuo 
4347315b003SKanKuo 	g_io_type = SPDK_BDEV_IO_TYPE_ZONE_APPEND;
4357315b003SKanKuo 
4367315b003SKanKuo 	start_operation();
4377315b003SKanKuo 
4387315b003SKanKuo 	rc = spdk_bdev_zone_appendv(desc, ch, g_zone_op->bdev.iovs, g_unexpected_iovcnt, g_start_lba,
4397315b003SKanKuo 				    g_num_blocks, NULL, NULL);
4407315b003SKanKuo 
4417315b003SKanKuo 	CU_ASSERT(rc == 0);
4427315b003SKanKuo 	CU_ASSERT(g_bdev_io->internal.desc == desc);
4437315b003SKanKuo 	CU_ASSERT(g_bdev_io->type == SPDK_BDEV_IO_TYPE_ZONE_APPEND);
4447315b003SKanKuo 	CU_ASSERT(g_bdev_io->u.bdev.iovs == g_zone_op->bdev.iovs);
4457315b003SKanKuo 	CU_ASSERT(g_bdev_io->u.bdev.iovcnt == g_unexpected_iovcnt);
4467315b003SKanKuo 	CU_ASSERT(g_bdev_io->u.bdev.md_buf == NULL);
4477315b003SKanKuo 	CU_ASSERT(g_bdev_io->u.bdev.num_blocks == g_num_blocks);
4487315b003SKanKuo 	CU_ASSERT(g_bdev_io->u.bdev.offset_blocks == g_expected_zone_id);
4497315b003SKanKuo 
4507315b003SKanKuo 	stop_operation();
4517315b003SKanKuo }
4527315b003SKanKuo 
453df00a867SKanKuo static void
test_bdev_zone_appendv_with_md(void)454df00a867SKanKuo test_bdev_zone_appendv_with_md(void)
455df00a867SKanKuo {
456df00a867SKanKuo 	DECLARE_VIRTUAL_BDEV_START();
457df00a867SKanKuo 
458df00a867SKanKuo 	g_io_type = SPDK_BDEV_IO_TYPE_ZONE_APPEND;
459df00a867SKanKuo 
460df00a867SKanKuo 	start_operation();
461df00a867SKanKuo 
462df00a867SKanKuo 	rc = spdk_bdev_zone_appendv_with_md(desc, ch, g_zone_op->bdev.iovs, g_unexpected_iovcnt, g_md_buf,
463df00a867SKanKuo 					    g_start_lba, g_num_blocks, NULL, NULL);
464df00a867SKanKuo 
465df00a867SKanKuo 	CU_ASSERT(rc == 0);
466df00a867SKanKuo 	CU_ASSERT(g_bdev_io->internal.desc == desc);
467df00a867SKanKuo 	CU_ASSERT(g_bdev_io->type == SPDK_BDEV_IO_TYPE_ZONE_APPEND);
468df00a867SKanKuo 	CU_ASSERT(g_bdev_io->u.bdev.iovs == g_zone_op->bdev.iovs);
469df00a867SKanKuo 	CU_ASSERT(g_bdev_io->u.bdev.iovcnt == g_unexpected_iovcnt);
470df00a867SKanKuo 	CU_ASSERT(g_bdev_io->u.bdev.md_buf == g_md_buf);
471df00a867SKanKuo 	CU_ASSERT(g_bdev_io->u.bdev.num_blocks == g_num_blocks);
472df00a867SKanKuo 	CU_ASSERT(g_bdev_io->u.bdev.offset_blocks == g_expected_zone_id);
473df00a867SKanKuo 
474df00a867SKanKuo 	stop_operation();
475df00a867SKanKuo }
476df00a867SKanKuo 
477861010b2Sdongx.yi int
main(int argc,char ** argv)478861010b2Sdongx.yi main(int argc, char **argv)
479861010b2Sdongx.yi {
480861010b2Sdongx.yi 	CU_pSuite suite = NULL;
481861010b2Sdongx.yi 	unsigned int num_failures;
482861010b2Sdongx.yi 
48378b696bcSVitaliy Mysak 	CU_initialize_registry();
484861010b2Sdongx.yi 
485861010b2Sdongx.yi 	suite = CU_add_suite("zone", test_setup, test_cleanup);
486dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_zone_get_operation);
487dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_bdev_zone_get_info);
488dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_bdev_zone_management);
489dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_bdev_zone_append);
490dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_bdev_zone_append_with_md);
4917315b003SKanKuo 	CU_ADD_TEST(suite, test_bdev_zone_appendv);
492df00a867SKanKuo 	CU_ADD_TEST(suite, test_bdev_zone_appendv_with_md);
493dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, test_bdev_io_get_append_location);
494861010b2Sdongx.yi 
495*ea941caeSKonrad Sztyber 	num_failures = spdk_ut_run_tests(argc, argv, NULL);
496861010b2Sdongx.yi 	CU_cleanup_registry();
497861010b2Sdongx.yi 	return num_failures;
498861010b2Sdongx.yi }
499