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