xref: /spdk/test/unit/lib/blobfs/blobfs_bdev.c/blobfs_bdev_ut.c (revision ea941caeaf896fdf2aef7685f86f37023060faed)
1488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse  *   Copyright (C) 2019 Intel Corporation.
33ce759a1SXiaodong Liu  *   All rights reserved.
43ce759a1SXiaodong Liu  */
53ce759a1SXiaodong Liu 
6ae431e31SKonrad Sztyber #include "spdk_internal/cunit.h"
73ce759a1SXiaodong Liu #include "spdk/string.h"
83ce759a1SXiaodong Liu #include "spdk/stdinc.h"
93ce759a1SXiaodong Liu 
103ce759a1SXiaodong Liu #include "blobfs/bdev/blobfs_bdev.c"
113ce759a1SXiaodong Liu 
123ce759a1SXiaodong Liu int g_fserrno;
133ce759a1SXiaodong Liu 
1428420560SShuhei Matsumoto bool g_bdev_create_bs_dev_ext_fail = false;
153ce759a1SXiaodong Liu bool g_fs_load_fail = false;
163ce759a1SXiaodong Liu bool g_fs_unload_fail = false;
176433c103SXiaodong Liu bool g_bs_bdev_claim_fail = false;
184c10e0bbSXiaodong Liu bool g_blobfs_fuse_start_fail = false;
192271c695Sjiaqizho struct blobfs_bdev_operation_ctx *g_fs_ctx;
203ce759a1SXiaodong Liu 
213ce759a1SXiaodong Liu const char *g_bdev_name = "ut_bdev";
2228420560SShuhei Matsumoto struct spdk_bdev g_bdev;
233ce759a1SXiaodong Liu 
246433c103SXiaodong Liu static void
bs_dev_destroy(struct spdk_bs_dev * dev)256433c103SXiaodong Liu bs_dev_destroy(struct spdk_bs_dev *dev)
266433c103SXiaodong Liu {
276433c103SXiaodong Liu }
286433c103SXiaodong Liu 
2928420560SShuhei Matsumoto static struct spdk_bdev *
bs_dev_get_base_bdev(struct spdk_bs_dev * dev)3028420560SShuhei Matsumoto bs_dev_get_base_bdev(struct spdk_bs_dev *dev)
3128420560SShuhei Matsumoto {
3228420560SShuhei Matsumoto 	return &g_bdev;
3328420560SShuhei Matsumoto }
3428420560SShuhei Matsumoto 
3528420560SShuhei Matsumoto 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)3628420560SShuhei Matsumoto spdk_bdev_create_bs_dev_ext(const char *bdev_name, spdk_bdev_event_cb_t event_cb,
3728420560SShuhei Matsumoto 			    void *event_ctx, struct spdk_bs_dev **_bs_dev)
383ce759a1SXiaodong Liu {
393ce759a1SXiaodong Liu 	static struct spdk_bs_dev bs_dev;
403ce759a1SXiaodong Liu 
4128420560SShuhei Matsumoto 	if (g_bdev_create_bs_dev_ext_fail) {
4228420560SShuhei Matsumoto 		return -EINVAL;
433ce759a1SXiaodong Liu 	}
443ce759a1SXiaodong Liu 
456433c103SXiaodong Liu 	bs_dev.destroy = bs_dev_destroy;
4628420560SShuhei Matsumoto 	bs_dev.get_base_bdev = bs_dev_get_base_bdev;
4728420560SShuhei Matsumoto 
4828420560SShuhei Matsumoto 	*_bs_dev = &bs_dev;
4928420560SShuhei Matsumoto 
5028420560SShuhei Matsumoto 	return 0;
513ce759a1SXiaodong Liu }
523ce759a1SXiaodong Liu 
533ce759a1SXiaodong Liu 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)543ce759a1SXiaodong Liu spdk_fs_load(struct spdk_bs_dev *dev, fs_send_request_fn send_request_fn,
553ce759a1SXiaodong Liu 	     spdk_fs_op_with_handle_complete cb_fn, void *cb_arg)
563ce759a1SXiaodong Liu {
573ce759a1SXiaodong Liu 	int rc = 0;
583ce759a1SXiaodong Liu 
593ce759a1SXiaodong Liu 	if (g_fs_load_fail) {
603ce759a1SXiaodong Liu 		rc = -1;
613ce759a1SXiaodong Liu 	}
623ce759a1SXiaodong Liu 
633ce759a1SXiaodong Liu 	cb_fn(cb_arg, NULL, rc);
642271c695Sjiaqizho 
653ce759a1SXiaodong Liu 	return;
663ce759a1SXiaodong Liu }
673ce759a1SXiaodong Liu 
683ce759a1SXiaodong Liu void
spdk_fs_unload(struct spdk_filesystem * fs,spdk_fs_op_complete cb_fn,void * cb_arg)693ce759a1SXiaodong Liu spdk_fs_unload(struct spdk_filesystem *fs, spdk_fs_op_complete cb_fn, void *cb_arg)
703ce759a1SXiaodong Liu {
713ce759a1SXiaodong Liu 	int rc = 0;
723ce759a1SXiaodong Liu 
733ce759a1SXiaodong Liu 	if (g_fs_unload_fail) {
743ce759a1SXiaodong Liu 		rc = -1;
753ce759a1SXiaodong Liu 	}
763ce759a1SXiaodong Liu 
773ce759a1SXiaodong Liu 	cb_fn(cb_arg, rc);
783ce759a1SXiaodong Liu 	return;
793ce759a1SXiaodong Liu }
803ce759a1SXiaodong Liu 
813ce759a1SXiaodong Liu 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)826433c103SXiaodong Liu spdk_fs_init(struct spdk_bs_dev *dev, struct spdk_blobfs_opts *opt,
836433c103SXiaodong Liu 	     fs_send_request_fn send_request_fn,
846433c103SXiaodong Liu 	     spdk_fs_op_with_handle_complete cb_fn, void *cb_arg)
856433c103SXiaodong Liu {
866433c103SXiaodong Liu 	int rc = 0;
876433c103SXiaodong Liu 
886433c103SXiaodong Liu 	if (g_fs_load_fail) {
896433c103SXiaodong Liu 		rc = -1;
906433c103SXiaodong Liu 	}
916433c103SXiaodong Liu 
926433c103SXiaodong Liu 	cb_fn(cb_arg, NULL, rc);
936433c103SXiaodong Liu 	return;
946433c103SXiaodong Liu }
956433c103SXiaodong Liu 
966433c103SXiaodong Liu int
spdk_bs_bdev_claim(struct spdk_bs_dev * bs_dev,struct spdk_bdev_module * module)976433c103SXiaodong Liu spdk_bs_bdev_claim(struct spdk_bs_dev *bs_dev, struct spdk_bdev_module *module)
986433c103SXiaodong Liu {
992271c695Sjiaqizho 	if (g_bs_bdev_claim_fail) {
1006433c103SXiaodong Liu 		return -1;
1016433c103SXiaodong Liu 	}
1026433c103SXiaodong Liu 
1036433c103SXiaodong Liu 	return 0;
1046433c103SXiaodong Liu }
1056433c103SXiaodong Liu 
1064c10e0bbSXiaodong Liu 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)10730e3f4d9SSeth Howell blobfs_fuse_start(const char *bdev_name, const char *mountpoint, struct spdk_filesystem *fs,
1084c10e0bbSXiaodong Liu 		  blobfs_fuse_unmount_cb cb_fn, void *cb_arg, struct spdk_blobfs_fuse **_bfuse)
1094c10e0bbSXiaodong Liu {
1102271c695Sjiaqizho 	if (g_blobfs_fuse_start_fail) {
1114c10e0bbSXiaodong Liu 		return -1;
1124c10e0bbSXiaodong Liu 	}
1134c10e0bbSXiaodong Liu 
1142271c695Sjiaqizho 	/* store the ctx for unmount operation */
1152271c695Sjiaqizho 	g_fs_ctx = cb_arg;
1162271c695Sjiaqizho 
1174c10e0bbSXiaodong Liu 	return 0;
1184c10e0bbSXiaodong Liu }
1194c10e0bbSXiaodong Liu 
1206433c103SXiaodong Liu void
spdk_bdev_close(struct spdk_bdev_desc * desc)1213ce759a1SXiaodong Liu spdk_bdev_close(struct spdk_bdev_desc *desc)
1223ce759a1SXiaodong Liu {
1233ce759a1SXiaodong Liu }
1243ce759a1SXiaodong Liu 
1254036f95bSJim Harris int
spdk_thread_send_msg(const struct spdk_thread * thread,spdk_msg_fn fn,void * ctx)1263ce759a1SXiaodong Liu spdk_thread_send_msg(const struct spdk_thread *thread, spdk_msg_fn fn, void *ctx)
1273ce759a1SXiaodong Liu {
1283ce759a1SXiaodong Liu 	fn(ctx);
1294036f95bSJim Harris 	return 0;
1303ce759a1SXiaodong Liu }
1313ce759a1SXiaodong Liu 
1323ce759a1SXiaodong Liu struct spdk_thread *
spdk_get_thread(void)1333ce759a1SXiaodong Liu spdk_get_thread(void)
1343ce759a1SXiaodong Liu {
1353ce759a1SXiaodong Liu 	struct spdk_thread *thd = (struct spdk_thread *)0x1;
1363ce759a1SXiaodong Liu 
1373ce759a1SXiaodong Liu 	return thd;
1383ce759a1SXiaodong Liu }
1393ce759a1SXiaodong Liu 
1403ce759a1SXiaodong Liu const char *
spdk_bdev_get_name(const struct spdk_bdev * bdev)1413ce759a1SXiaodong Liu spdk_bdev_get_name(const struct spdk_bdev *bdev)
1423ce759a1SXiaodong Liu {
1433ce759a1SXiaodong Liu 	return g_bdev_name;
1443ce759a1SXiaodong Liu }
1453ce759a1SXiaodong Liu 
1466433c103SXiaodong Liu void
spdk_fs_opts_init(struct spdk_blobfs_opts * opts)1476433c103SXiaodong Liu spdk_fs_opts_init(struct spdk_blobfs_opts *opts)
1486433c103SXiaodong Liu {
1496433c103SXiaodong Liu }
1506433c103SXiaodong Liu 
1514c10e0bbSXiaodong Liu void
blobfs_fuse_send_request(fs_request_fn fn,void * arg)15230e3f4d9SSeth Howell blobfs_fuse_send_request(fs_request_fn fn, void *arg)
1534c10e0bbSXiaodong Liu {
1544c10e0bbSXiaodong Liu }
1554c10e0bbSXiaodong Liu 
1564c10e0bbSXiaodong Liu void
blobfs_fuse_stop(struct spdk_blobfs_fuse * bfuse)15730e3f4d9SSeth Howell blobfs_fuse_stop(struct spdk_blobfs_fuse *bfuse)
1584c10e0bbSXiaodong Liu {
1594c10e0bbSXiaodong Liu }
1604c10e0bbSXiaodong Liu 
1613ce759a1SXiaodong Liu static void
blobfs_bdev_op_complete(void * cb_arg,int fserrno)1623ce759a1SXiaodong Liu blobfs_bdev_op_complete(void *cb_arg, int fserrno)
1633ce759a1SXiaodong Liu {
1643ce759a1SXiaodong Liu 	g_fserrno = fserrno;
1653ce759a1SXiaodong Liu }
1663ce759a1SXiaodong Liu 
1673ce759a1SXiaodong Liu static void
spdk_blobfs_bdev_detect_test(void)1683ce759a1SXiaodong Liu spdk_blobfs_bdev_detect_test(void)
1693ce759a1SXiaodong Liu {
17028420560SShuhei Matsumoto 	/* spdk_bdev_create_bs_dev_ext() fails */
17128420560SShuhei Matsumoto 	g_bdev_create_bs_dev_ext_fail = true;
1723ce759a1SXiaodong Liu 	spdk_blobfs_bdev_detect(g_bdev_name, blobfs_bdev_op_complete, NULL);
1733ce759a1SXiaodong Liu 	CU_ASSERT(g_fserrno != 0);
1743ce759a1SXiaodong Liu 
17528420560SShuhei Matsumoto 	g_bdev_create_bs_dev_ext_fail = false;
1763ce759a1SXiaodong Liu 
1773ce759a1SXiaodong Liu 	/* spdk_fs_load() fails */
1783ce759a1SXiaodong Liu 	g_fs_load_fail = true;
1793ce759a1SXiaodong Liu 	spdk_blobfs_bdev_detect(g_bdev_name, blobfs_bdev_op_complete, NULL);
1803ce759a1SXiaodong Liu 	CU_ASSERT(g_fserrno != 0);
1813ce759a1SXiaodong Liu 
1823ce759a1SXiaodong Liu 	g_fs_load_fail = false;
1833ce759a1SXiaodong Liu 
1843ce759a1SXiaodong Liu 	/* spdk_fs_unload() fails */
1853ce759a1SXiaodong Liu 	g_fs_unload_fail = true;
1863ce759a1SXiaodong Liu 	spdk_blobfs_bdev_detect(g_bdev_name, blobfs_bdev_op_complete, NULL);
1873ce759a1SXiaodong Liu 	CU_ASSERT(g_fserrno != 0);
1883ce759a1SXiaodong Liu 
1893ce759a1SXiaodong Liu 	g_fs_unload_fail = false;
1903ce759a1SXiaodong Liu 
1913ce759a1SXiaodong Liu 	/* no fail */
1923ce759a1SXiaodong Liu 	spdk_blobfs_bdev_detect(g_bdev_name, blobfs_bdev_op_complete, NULL);
1933ce759a1SXiaodong Liu 	CU_ASSERT(g_fserrno == 0);
1943ce759a1SXiaodong Liu }
1953ce759a1SXiaodong Liu 
1966433c103SXiaodong Liu static void
spdk_blobfs_bdev_create_test(void)1976433c103SXiaodong Liu spdk_blobfs_bdev_create_test(void)
1986433c103SXiaodong Liu {
1996433c103SXiaodong Liu 	uint32_t cluster_sz = 1024 * 1024;
2006433c103SXiaodong Liu 
20128420560SShuhei Matsumoto 	/* spdk_bdev_create_bs_dev_ext() fails */
20228420560SShuhei Matsumoto 	g_bdev_create_bs_dev_ext_fail = true;
2036433c103SXiaodong Liu 	spdk_blobfs_bdev_create(g_bdev_name, cluster_sz, blobfs_bdev_op_complete, NULL);
2046433c103SXiaodong Liu 	CU_ASSERT(g_fserrno != 0);
2056433c103SXiaodong Liu 
20628420560SShuhei Matsumoto 	g_bdev_create_bs_dev_ext_fail = false;
2076433c103SXiaodong Liu 
2086433c103SXiaodong Liu 	/* spdk_bs_bdev_claim() fails */
2096433c103SXiaodong Liu 	g_bs_bdev_claim_fail = true;
2106433c103SXiaodong Liu 	spdk_blobfs_bdev_create(g_bdev_name, cluster_sz, blobfs_bdev_op_complete, NULL);
2116433c103SXiaodong Liu 	CU_ASSERT(g_fserrno != 0);
2126433c103SXiaodong Liu 
2136433c103SXiaodong Liu 	g_bs_bdev_claim_fail = false;
2146433c103SXiaodong Liu 
2156433c103SXiaodong Liu 	/* spdk_fs_init() fails */
2166433c103SXiaodong Liu 	g_fs_load_fail = true;
2176433c103SXiaodong Liu 	spdk_blobfs_bdev_create(g_bdev_name, cluster_sz, blobfs_bdev_op_complete, NULL);
2186433c103SXiaodong Liu 	CU_ASSERT(g_fserrno != 0);
2196433c103SXiaodong Liu 
2206433c103SXiaodong Liu 	g_fs_load_fail = false;
2216433c103SXiaodong Liu 
2226433c103SXiaodong Liu 	/* spdk_fs_unload() fails */
2236433c103SXiaodong Liu 	g_fs_unload_fail = true;
2246433c103SXiaodong Liu 	spdk_blobfs_bdev_create(g_bdev_name, cluster_sz, blobfs_bdev_op_complete, NULL);
2256433c103SXiaodong Liu 	CU_ASSERT(g_fserrno != 0);
2266433c103SXiaodong Liu 
2276433c103SXiaodong Liu 	g_fs_unload_fail = false;
2286433c103SXiaodong Liu 
2296433c103SXiaodong Liu 	/* no fail */
2306433c103SXiaodong Liu 	spdk_blobfs_bdev_create(g_bdev_name, cluster_sz, blobfs_bdev_op_complete, NULL);
2316433c103SXiaodong Liu 	CU_ASSERT(g_fserrno == 0);
2326433c103SXiaodong Liu }
2336433c103SXiaodong Liu 
2344c10e0bbSXiaodong Liu static void
spdk_blobfs_bdev_mount_test(void)2354c10e0bbSXiaodong Liu spdk_blobfs_bdev_mount_test(void)
2364c10e0bbSXiaodong Liu {
2374c10e0bbSXiaodong Liu #ifdef SPDK_CONFIG_FUSE
2384c10e0bbSXiaodong Liu 	const char *mountpoint = "/mnt";
2394c10e0bbSXiaodong Liu 
24028420560SShuhei Matsumoto 	/* spdk_bdev_create_bs_dev_ext() fails */
24128420560SShuhei Matsumoto 	g_bdev_create_bs_dev_ext_fail = true;
2424c10e0bbSXiaodong Liu 	spdk_blobfs_bdev_mount(g_bdev_name, mountpoint, blobfs_bdev_op_complete, NULL);
2434c10e0bbSXiaodong Liu 	CU_ASSERT(g_fserrno != 0);
2444c10e0bbSXiaodong Liu 
24528420560SShuhei Matsumoto 	g_bdev_create_bs_dev_ext_fail = false;
2464c10e0bbSXiaodong Liu 
2474c10e0bbSXiaodong Liu 	/* spdk_bs_bdev_claim() fails */
2484c10e0bbSXiaodong Liu 	g_bs_bdev_claim_fail = true;
2494c10e0bbSXiaodong Liu 	spdk_blobfs_bdev_mount(g_bdev_name, mountpoint, blobfs_bdev_op_complete, NULL);
2504c10e0bbSXiaodong Liu 	CU_ASSERT(g_fserrno != 0);
2514c10e0bbSXiaodong Liu 
2524c10e0bbSXiaodong Liu 	g_bs_bdev_claim_fail = false;
2534c10e0bbSXiaodong Liu 
2544c10e0bbSXiaodong Liu 	/* spdk_fs_load() fails */
2554c10e0bbSXiaodong Liu 	g_fs_load_fail = true;
2564c10e0bbSXiaodong Liu 	spdk_blobfs_bdev_mount(g_bdev_name, mountpoint, blobfs_bdev_op_complete, NULL);
2574c10e0bbSXiaodong Liu 	CU_ASSERT(g_fserrno != 0);
2584c10e0bbSXiaodong Liu 
2594c10e0bbSXiaodong Liu 	g_fs_load_fail = false;
2604c10e0bbSXiaodong Liu 
26130e3f4d9SSeth Howell 	/* blobfs_fuse_start() fails */
2624c10e0bbSXiaodong Liu 	g_blobfs_fuse_start_fail = true;
2634c10e0bbSXiaodong Liu 	spdk_blobfs_bdev_mount(g_bdev_name, mountpoint, blobfs_bdev_op_complete, NULL);
2644c10e0bbSXiaodong Liu 	CU_ASSERT(g_fserrno != 0);
2654c10e0bbSXiaodong Liu 
2664c10e0bbSXiaodong Liu 	g_blobfs_fuse_start_fail = false;
2674c10e0bbSXiaodong Liu 
2684c10e0bbSXiaodong Liu 	/* no fail */
2694c10e0bbSXiaodong Liu 	spdk_blobfs_bdev_mount(g_bdev_name, mountpoint, blobfs_bdev_op_complete, NULL);
2704c10e0bbSXiaodong Liu 	CU_ASSERT(g_fserrno == 0);
2712271c695Sjiaqizho 	CU_ASSERT(g_fs_ctx != NULL);
2722271c695Sjiaqizho 
2732271c695Sjiaqizho 	/* after mount operation success , we need make sure unmount operation success */
2742271c695Sjiaqizho 	blobfs_bdev_unmount(g_fs_ctx);
2752271c695Sjiaqizho 	CU_ASSERT(g_fserrno == 0);
2764c10e0bbSXiaodong Liu #endif
2774c10e0bbSXiaodong Liu }
2784c10e0bbSXiaodong Liu 
2798dd1cd21SBen Walker int
main(int argc,char ** argv)2808dd1cd21SBen Walker main(int argc, char **argv)
2813ce759a1SXiaodong Liu {
2823ce759a1SXiaodong Liu 	CU_pSuite	suite = NULL;
2833ce759a1SXiaodong Liu 	unsigned int	num_failures;
2843ce759a1SXiaodong Liu 
28578b696bcSVitaliy Mysak 	CU_initialize_registry();
2863ce759a1SXiaodong Liu 
2873ce759a1SXiaodong Liu 	suite = CU_add_suite("blobfs_bdev_ut", NULL, NULL);
2883ce759a1SXiaodong Liu 
289dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, spdk_blobfs_bdev_detect_test);
290dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, spdk_blobfs_bdev_create_test);
291dcf0ca15SVitaliy Mysak 	CU_ADD_TEST(suite, spdk_blobfs_bdev_mount_test);
2923ce759a1SXiaodong Liu 
293*ea941caeSKonrad Sztyber 	num_failures = spdk_ut_run_tests(argc, argv, NULL);
2943ce759a1SXiaodong Liu 	CU_cleanup_registry();
2953ce759a1SXiaodong Liu 
2963ce759a1SXiaodong Liu 	return num_failures;
2973ce759a1SXiaodong Liu }
298