Branch data Line data Source code
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
25 : 4 : bs_dev_destroy(struct spdk_bs_dev *dev)
26 : : {
27 : 4 : }
28 : :
29 : : static struct spdk_bdev *
30 : 0 : bs_dev_get_base_bdev(struct spdk_bs_dev *dev)
31 : : {
32 : 0 : return &g_bdev;
33 : : }
34 : :
35 : : int
36 : 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 [ - + + + ]: 36 : if (g_bdev_create_bs_dev_ext_fail) {
42 : 8 : return -EINVAL;
43 : : }
44 : :
45 : 28 : bs_dev.destroy = bs_dev_destroy;
46 : 28 : bs_dev.get_base_bdev = bs_dev_get_base_bdev;
47 : :
48 : 28 : *_bs_dev = &bs_dev;
49 : :
50 : 28 : return 0;
51 : : }
52 : :
53 : : void
54 : 12 : 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 : 12 : int rc = 0;
58 : :
59 [ - + + + ]: 12 : if (g_fs_load_fail) {
60 : 4 : rc = -1;
61 : : }
62 : :
63 : 12 : cb_fn(cb_arg, NULL, rc);
64 : :
65 : 12 : return;
66 : : }
67 : :
68 : : void
69 : 16 : spdk_fs_unload(struct spdk_filesystem *fs, spdk_fs_op_complete cb_fn, void *cb_arg)
70 : : {
71 : 16 : int rc = 0;
72 : :
73 [ - + + + ]: 16 : if (g_fs_unload_fail) {
74 : 8 : rc = -1;
75 : : }
76 : :
77 : 16 : cb_fn(cb_arg, rc);
78 : 16 : return;
79 : : }
80 : :
81 : : void
82 : 12 : 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 : 12 : int rc = 0;
87 : :
88 [ - + + + ]: 12 : if (g_fs_load_fail) {
89 : 4 : rc = -1;
90 : : }
91 : :
92 : 12 : cb_fn(cb_arg, NULL, rc);
93 : 12 : return;
94 : : }
95 : :
96 : : int
97 : 16 : spdk_bs_bdev_claim(struct spdk_bs_dev *bs_dev, struct spdk_bdev_module *module)
98 : : {
99 [ - + + + ]: 16 : if (g_bs_bdev_claim_fail) {
100 : 4 : return -1;
101 : : }
102 : :
103 : 12 : return 0;
104 : : }
105 : :
106 : : int
107 : 0 : 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 [ # # # # ]: 0 : if (g_blobfs_fuse_start_fail) {
111 : 0 : return -1;
112 : : }
113 : :
114 : : /* store the ctx for unmount operation */
115 : 0 : g_fs_ctx = cb_arg;
116 : :
117 : 0 : return 0;
118 : : }
119 : :
120 : : void
121 : 0 : spdk_bdev_close(struct spdk_bdev_desc *desc)
122 : : {
123 : 0 : }
124 : :
125 : : int
126 : 16 : spdk_thread_send_msg(const struct spdk_thread *thread, spdk_msg_fn fn, void *ctx)
127 : : {
128 : 16 : fn(ctx);
129 : 16 : return 0;
130 : : }
131 : :
132 : : struct spdk_thread *
133 : 16 : spdk_get_thread(void)
134 : : {
135 : 16 : struct spdk_thread *thd = (struct spdk_thread *)0x1;
136 : :
137 : 16 : return thd;
138 : : }
139 : :
140 : : const char *
141 : 0 : spdk_bdev_get_name(const struct spdk_bdev *bdev)
142 : : {
143 : 0 : return g_bdev_name;
144 : : }
145 : :
146 : : void
147 : 12 : spdk_fs_opts_init(struct spdk_blobfs_opts *opts)
148 : : {
149 : 12 : }
150 : :
151 : : void
152 : 0 : blobfs_fuse_send_request(fs_request_fn fn, void *arg)
153 : : {
154 : 0 : }
155 : :
156 : : void
157 : 0 : blobfs_fuse_stop(struct spdk_blobfs_fuse *bfuse)
158 : : {
159 : 0 : }
160 : :
161 : : static void
162 : 36 : blobfs_bdev_op_complete(void *cb_arg, int fserrno)
163 : : {
164 : 36 : g_fserrno = fserrno;
165 : 36 : }
166 : :
167 : : static void
168 : 4 : spdk_blobfs_bdev_detect_test(void)
169 : : {
170 : : /* spdk_bdev_create_bs_dev_ext() fails */
171 : 4 : g_bdev_create_bs_dev_ext_fail = true;
172 : 4 : spdk_blobfs_bdev_detect(g_bdev_name, blobfs_bdev_op_complete, NULL);
173 : 4 : CU_ASSERT(g_fserrno != 0);
174 : :
175 : 4 : g_bdev_create_bs_dev_ext_fail = false;
176 : :
177 : : /* spdk_fs_load() fails */
178 : 4 : g_fs_load_fail = true;
179 : 4 : spdk_blobfs_bdev_detect(g_bdev_name, blobfs_bdev_op_complete, NULL);
180 : 4 : CU_ASSERT(g_fserrno != 0);
181 : :
182 : 4 : g_fs_load_fail = false;
183 : :
184 : : /* spdk_fs_unload() fails */
185 : 4 : g_fs_unload_fail = true;
186 : 4 : spdk_blobfs_bdev_detect(g_bdev_name, blobfs_bdev_op_complete, NULL);
187 : 4 : CU_ASSERT(g_fserrno != 0);
188 : :
189 : 4 : g_fs_unload_fail = false;
190 : :
191 : : /* no fail */
192 : 4 : spdk_blobfs_bdev_detect(g_bdev_name, blobfs_bdev_op_complete, NULL);
193 : 4 : CU_ASSERT(g_fserrno == 0);
194 : 4 : }
195 : :
196 : : static void
197 : 4 : spdk_blobfs_bdev_create_test(void)
198 : : {
199 : 4 : uint32_t cluster_sz = 1024 * 1024;
200 : :
201 : : /* spdk_bdev_create_bs_dev_ext() fails */
202 : 4 : g_bdev_create_bs_dev_ext_fail = true;
203 : 4 : spdk_blobfs_bdev_create(g_bdev_name, cluster_sz, blobfs_bdev_op_complete, NULL);
204 : 4 : CU_ASSERT(g_fserrno != 0);
205 : :
206 : 4 : g_bdev_create_bs_dev_ext_fail = false;
207 : :
208 : : /* spdk_bs_bdev_claim() fails */
209 : 4 : g_bs_bdev_claim_fail = true;
210 : 4 : spdk_blobfs_bdev_create(g_bdev_name, cluster_sz, blobfs_bdev_op_complete, NULL);
211 : 4 : CU_ASSERT(g_fserrno != 0);
212 : :
213 : 4 : g_bs_bdev_claim_fail = false;
214 : :
215 : : /* spdk_fs_init() fails */
216 : 4 : g_fs_load_fail = true;
217 : 4 : spdk_blobfs_bdev_create(g_bdev_name, cluster_sz, blobfs_bdev_op_complete, NULL);
218 : 4 : CU_ASSERT(g_fserrno != 0);
219 : :
220 : 4 : g_fs_load_fail = false;
221 : :
222 : : /* spdk_fs_unload() fails */
223 : 4 : g_fs_unload_fail = true;
224 : 4 : spdk_blobfs_bdev_create(g_bdev_name, cluster_sz, blobfs_bdev_op_complete, NULL);
225 : 4 : CU_ASSERT(g_fserrno != 0);
226 : :
227 : 4 : g_fs_unload_fail = false;
228 : :
229 : : /* no fail */
230 : 4 : spdk_blobfs_bdev_create(g_bdev_name, cluster_sz, blobfs_bdev_op_complete, NULL);
231 : 4 : CU_ASSERT(g_fserrno == 0);
232 : 4 : }
233 : :
234 : : static void
235 : 4 : 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 : 4 : }
278 : :
279 : : int
280 : 4 : main(int argc, char **argv)
281 : : {
282 : 4 : CU_pSuite suite = NULL;
283 : : unsigned int num_failures;
284 : :
285 : 4 : CU_initialize_registry();
286 : :
287 : 4 : suite = CU_add_suite("blobfs_bdev_ut", NULL, NULL);
288 : :
289 : 4 : CU_ADD_TEST(suite, spdk_blobfs_bdev_detect_test);
290 : 4 : CU_ADD_TEST(suite, spdk_blobfs_bdev_create_test);
291 : 4 : CU_ADD_TEST(suite, spdk_blobfs_bdev_mount_test);
292 : :
293 : 4 : num_failures = spdk_ut_run_tests(argc, argv, NULL);
294 : 4 : CU_cleanup_registry();
295 : :
296 : 4 : return num_failures;
297 : : }
|