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 bs_dev_destroy(struct spdk_bs_dev *dev) 26 { 27 } 28 29 static struct spdk_bdev * 30 bs_dev_get_base_bdev(struct spdk_bs_dev *dev) 31 { 32 return &g_bdev; 33 } 34 35 int 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 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 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 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 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 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 121 spdk_bdev_close(struct spdk_bdev_desc *desc) 122 { 123 } 124 125 int 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 * 133 spdk_get_thread(void) 134 { 135 struct spdk_thread *thd = (struct spdk_thread *)0x1; 136 137 return thd; 138 } 139 140 const char * 141 spdk_bdev_get_name(const struct spdk_bdev *bdev) 142 { 143 return g_bdev_name; 144 } 145 146 void 147 spdk_fs_opts_init(struct spdk_blobfs_opts *opts) 148 { 149 } 150 151 void 152 blobfs_fuse_send_request(fs_request_fn fn, void *arg) 153 { 154 } 155 156 void 157 blobfs_fuse_stop(struct spdk_blobfs_fuse *bfuse) 158 { 159 } 160 161 static void 162 blobfs_bdev_op_complete(void *cb_arg, int fserrno) 163 { 164 g_fserrno = fserrno; 165 } 166 167 static 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 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 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 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