xref: /spdk/test/unit/lib/blobfs/blobfs_bdev.c/blobfs_bdev_ut.c (revision ea941caeaf896fdf2aef7685f86f37023060faed)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2019 Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #include "spdk_internal/cunit.h"
7 #include "spdk/string.h"
8 #include "spdk/stdinc.h"
9 
10 #include "blobfs/bdev/blobfs_bdev.c"
11 
12 int g_fserrno;
13 
14 bool g_bdev_create_bs_dev_ext_fail = false;
15 bool g_fs_load_fail = false;
16 bool g_fs_unload_fail = false;
17 bool g_bs_bdev_claim_fail = false;
18 bool g_blobfs_fuse_start_fail = false;
19 struct blobfs_bdev_operation_ctx *g_fs_ctx;
20 
21 const char *g_bdev_name = "ut_bdev";
22 struct spdk_bdev g_bdev;
23 
24 static void
bs_dev_destroy(struct spdk_bs_dev * dev)25 bs_dev_destroy(struct spdk_bs_dev *dev)
26 {
27 }
28 
29 static struct spdk_bdev *
bs_dev_get_base_bdev(struct spdk_bs_dev * dev)30 bs_dev_get_base_bdev(struct spdk_bs_dev *dev)
31 {
32 	return &g_bdev;
33 }
34 
35 int
spdk_bdev_create_bs_dev_ext(const char * bdev_name,spdk_bdev_event_cb_t event_cb,void * event_ctx,struct spdk_bs_dev ** _bs_dev)36 spdk_bdev_create_bs_dev_ext(const char *bdev_name, spdk_bdev_event_cb_t event_cb,
37 			    void *event_ctx, struct spdk_bs_dev **_bs_dev)
38 {
39 	static struct spdk_bs_dev bs_dev;
40 
41 	if (g_bdev_create_bs_dev_ext_fail) {
42 		return -EINVAL;
43 	}
44 
45 	bs_dev.destroy = bs_dev_destroy;
46 	bs_dev.get_base_bdev = bs_dev_get_base_bdev;
47 
48 	*_bs_dev = &bs_dev;
49 
50 	return 0;
51 }
52 
53 void
spdk_fs_load(struct spdk_bs_dev * dev,fs_send_request_fn send_request_fn,spdk_fs_op_with_handle_complete cb_fn,void * cb_arg)54 spdk_fs_load(struct spdk_bs_dev *dev, fs_send_request_fn send_request_fn,
55 	     spdk_fs_op_with_handle_complete cb_fn, void *cb_arg)
56 {
57 	int rc = 0;
58 
59 	if (g_fs_load_fail) {
60 		rc = -1;
61 	}
62 
63 	cb_fn(cb_arg, NULL, rc);
64 
65 	return;
66 }
67 
68 void
spdk_fs_unload(struct spdk_filesystem * fs,spdk_fs_op_complete cb_fn,void * cb_arg)69 spdk_fs_unload(struct spdk_filesystem *fs, spdk_fs_op_complete cb_fn, void *cb_arg)
70 {
71 	int rc = 0;
72 
73 	if (g_fs_unload_fail) {
74 		rc = -1;
75 	}
76 
77 	cb_fn(cb_arg, rc);
78 	return;
79 }
80 
81 void
spdk_fs_init(struct spdk_bs_dev * dev,struct spdk_blobfs_opts * opt,fs_send_request_fn send_request_fn,spdk_fs_op_with_handle_complete cb_fn,void * cb_arg)82 spdk_fs_init(struct spdk_bs_dev *dev, struct spdk_blobfs_opts *opt,
83 	     fs_send_request_fn send_request_fn,
84 	     spdk_fs_op_with_handle_complete cb_fn, void *cb_arg)
85 {
86 	int rc = 0;
87 
88 	if (g_fs_load_fail) {
89 		rc = -1;
90 	}
91 
92 	cb_fn(cb_arg, NULL, rc);
93 	return;
94 }
95 
96 int
spdk_bs_bdev_claim(struct spdk_bs_dev * bs_dev,struct spdk_bdev_module * module)97 spdk_bs_bdev_claim(struct spdk_bs_dev *bs_dev, struct spdk_bdev_module *module)
98 {
99 	if (g_bs_bdev_claim_fail) {
100 		return -1;
101 	}
102 
103 	return 0;
104 }
105 
106 int
blobfs_fuse_start(const char * bdev_name,const char * mountpoint,struct spdk_filesystem * fs,blobfs_fuse_unmount_cb cb_fn,void * cb_arg,struct spdk_blobfs_fuse ** _bfuse)107 blobfs_fuse_start(const char *bdev_name, const char *mountpoint, struct spdk_filesystem *fs,
108 		  blobfs_fuse_unmount_cb cb_fn, void *cb_arg, struct spdk_blobfs_fuse **_bfuse)
109 {
110 	if (g_blobfs_fuse_start_fail) {
111 		return -1;
112 	}
113 
114 	/* store the ctx for unmount operation */
115 	g_fs_ctx = cb_arg;
116 
117 	return 0;
118 }
119 
120 void
spdk_bdev_close(struct spdk_bdev_desc * desc)121 spdk_bdev_close(struct spdk_bdev_desc *desc)
122 {
123 }
124 
125 int
spdk_thread_send_msg(const struct spdk_thread * thread,spdk_msg_fn fn,void * ctx)126 spdk_thread_send_msg(const struct spdk_thread *thread, spdk_msg_fn fn, void *ctx)
127 {
128 	fn(ctx);
129 	return 0;
130 }
131 
132 struct spdk_thread *
spdk_get_thread(void)133 spdk_get_thread(void)
134 {
135 	struct spdk_thread *thd = (struct spdk_thread *)0x1;
136 
137 	return thd;
138 }
139 
140 const char *
spdk_bdev_get_name(const struct spdk_bdev * bdev)141 spdk_bdev_get_name(const struct spdk_bdev *bdev)
142 {
143 	return g_bdev_name;
144 }
145 
146 void
spdk_fs_opts_init(struct spdk_blobfs_opts * opts)147 spdk_fs_opts_init(struct spdk_blobfs_opts *opts)
148 {
149 }
150 
151 void
blobfs_fuse_send_request(fs_request_fn fn,void * arg)152 blobfs_fuse_send_request(fs_request_fn fn, void *arg)
153 {
154 }
155 
156 void
blobfs_fuse_stop(struct spdk_blobfs_fuse * bfuse)157 blobfs_fuse_stop(struct spdk_blobfs_fuse *bfuse)
158 {
159 }
160 
161 static void
blobfs_bdev_op_complete(void * cb_arg,int fserrno)162 blobfs_bdev_op_complete(void *cb_arg, int fserrno)
163 {
164 	g_fserrno = fserrno;
165 }
166 
167 static void
spdk_blobfs_bdev_detect_test(void)168 spdk_blobfs_bdev_detect_test(void)
169 {
170 	/* spdk_bdev_create_bs_dev_ext() fails */
171 	g_bdev_create_bs_dev_ext_fail = true;
172 	spdk_blobfs_bdev_detect(g_bdev_name, blobfs_bdev_op_complete, NULL);
173 	CU_ASSERT(g_fserrno != 0);
174 
175 	g_bdev_create_bs_dev_ext_fail = false;
176 
177 	/* spdk_fs_load() fails */
178 	g_fs_load_fail = true;
179 	spdk_blobfs_bdev_detect(g_bdev_name, blobfs_bdev_op_complete, NULL);
180 	CU_ASSERT(g_fserrno != 0);
181 
182 	g_fs_load_fail = false;
183 
184 	/* spdk_fs_unload() fails */
185 	g_fs_unload_fail = true;
186 	spdk_blobfs_bdev_detect(g_bdev_name, blobfs_bdev_op_complete, NULL);
187 	CU_ASSERT(g_fserrno != 0);
188 
189 	g_fs_unload_fail = false;
190 
191 	/* no fail */
192 	spdk_blobfs_bdev_detect(g_bdev_name, blobfs_bdev_op_complete, NULL);
193 	CU_ASSERT(g_fserrno == 0);
194 }
195 
196 static void
spdk_blobfs_bdev_create_test(void)197 spdk_blobfs_bdev_create_test(void)
198 {
199 	uint32_t cluster_sz = 1024 * 1024;
200 
201 	/* spdk_bdev_create_bs_dev_ext() fails */
202 	g_bdev_create_bs_dev_ext_fail = true;
203 	spdk_blobfs_bdev_create(g_bdev_name, cluster_sz, blobfs_bdev_op_complete, NULL);
204 	CU_ASSERT(g_fserrno != 0);
205 
206 	g_bdev_create_bs_dev_ext_fail = false;
207 
208 	/* spdk_bs_bdev_claim() fails */
209 	g_bs_bdev_claim_fail = true;
210 	spdk_blobfs_bdev_create(g_bdev_name, cluster_sz, blobfs_bdev_op_complete, NULL);
211 	CU_ASSERT(g_fserrno != 0);
212 
213 	g_bs_bdev_claim_fail = false;
214 
215 	/* spdk_fs_init() fails */
216 	g_fs_load_fail = true;
217 	spdk_blobfs_bdev_create(g_bdev_name, cluster_sz, blobfs_bdev_op_complete, NULL);
218 	CU_ASSERT(g_fserrno != 0);
219 
220 	g_fs_load_fail = false;
221 
222 	/* spdk_fs_unload() fails */
223 	g_fs_unload_fail = true;
224 	spdk_blobfs_bdev_create(g_bdev_name, cluster_sz, blobfs_bdev_op_complete, NULL);
225 	CU_ASSERT(g_fserrno != 0);
226 
227 	g_fs_unload_fail = false;
228 
229 	/* no fail */
230 	spdk_blobfs_bdev_create(g_bdev_name, cluster_sz, blobfs_bdev_op_complete, NULL);
231 	CU_ASSERT(g_fserrno == 0);
232 }
233 
234 static void
spdk_blobfs_bdev_mount_test(void)235 spdk_blobfs_bdev_mount_test(void)
236 {
237 #ifdef SPDK_CONFIG_FUSE
238 	const char *mountpoint = "/mnt";
239 
240 	/* spdk_bdev_create_bs_dev_ext() fails */
241 	g_bdev_create_bs_dev_ext_fail = true;
242 	spdk_blobfs_bdev_mount(g_bdev_name, mountpoint, blobfs_bdev_op_complete, NULL);
243 	CU_ASSERT(g_fserrno != 0);
244 
245 	g_bdev_create_bs_dev_ext_fail = false;
246 
247 	/* spdk_bs_bdev_claim() fails */
248 	g_bs_bdev_claim_fail = true;
249 	spdk_blobfs_bdev_mount(g_bdev_name, mountpoint, blobfs_bdev_op_complete, NULL);
250 	CU_ASSERT(g_fserrno != 0);
251 
252 	g_bs_bdev_claim_fail = false;
253 
254 	/* spdk_fs_load() fails */
255 	g_fs_load_fail = true;
256 	spdk_blobfs_bdev_mount(g_bdev_name, mountpoint, blobfs_bdev_op_complete, NULL);
257 	CU_ASSERT(g_fserrno != 0);
258 
259 	g_fs_load_fail = false;
260 
261 	/* blobfs_fuse_start() fails */
262 	g_blobfs_fuse_start_fail = true;
263 	spdk_blobfs_bdev_mount(g_bdev_name, mountpoint, blobfs_bdev_op_complete, NULL);
264 	CU_ASSERT(g_fserrno != 0);
265 
266 	g_blobfs_fuse_start_fail = false;
267 
268 	/* no fail */
269 	spdk_blobfs_bdev_mount(g_bdev_name, mountpoint, blobfs_bdev_op_complete, NULL);
270 	CU_ASSERT(g_fserrno == 0);
271 	CU_ASSERT(g_fs_ctx != NULL);
272 
273 	/* after mount operation success , we need make sure unmount operation success */
274 	blobfs_bdev_unmount(g_fs_ctx);
275 	CU_ASSERT(g_fserrno == 0);
276 #endif
277 }
278 
279 int
main(int argc,char ** argv)280 main(int argc, char **argv)
281 {
282 	CU_pSuite	suite = NULL;
283 	unsigned int	num_failures;
284 
285 	CU_initialize_registry();
286 
287 	suite = CU_add_suite("blobfs_bdev_ut", NULL, NULL);
288 
289 	CU_ADD_TEST(suite, spdk_blobfs_bdev_detect_test);
290 	CU_ADD_TEST(suite, spdk_blobfs_bdev_create_test);
291 	CU_ADD_TEST(suite, spdk_blobfs_bdev_mount_test);
292 
293 	num_failures = spdk_ut_run_tests(argc, argv, NULL);
294 	CU_cleanup_registry();
295 
296 	return num_failures;
297 }
298