xref: /spdk/test/unit/lib/bdev/raid/raid1.c/raid1_ut.c (revision 69038a944dd521e7f620676a916faef0f35e4ed1)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2022 Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #include "spdk/stdinc.h"
7 #include "spdk_cunit.h"
8 #include "spdk/env.h"
9 #include "spdk_internal/mock.h"
10 
11 #include "bdev/raid/raid1.c"
12 #include "../common.c"
13 
14 DEFINE_STUB_V(raid_bdev_module_list_add, (struct raid_bdev_module *raid_module));
15 DEFINE_STUB_V(raid_bdev_io_complete, (struct raid_bdev_io *raid_io,
16 				      enum spdk_bdev_io_status status));
17 DEFINE_STUB(raid_bdev_io_complete_part, bool, (struct raid_bdev_io *raid_io, uint64_t completed,
18 		enum spdk_bdev_io_status status), true);
19 DEFINE_STUB_V(spdk_bdev_free_io, (struct spdk_bdev_io *bdev_io));
20 DEFINE_STUB_V(raid_bdev_queue_io_wait, (struct raid_bdev_io *raid_io, struct spdk_bdev *bdev,
21 					struct spdk_io_channel *ch, spdk_bdev_io_wait_cb cb_fn));
22 DEFINE_STUB(spdk_bdev_readv_blocks, int, (struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
23 		struct iovec *iov, int iovcnt,
24 		uint64_t offset_blocks, uint64_t num_blocks,
25 		spdk_bdev_io_completion_cb cb, void *cb_arg), 0);
26 DEFINE_STUB(spdk_bdev_readv_blocks_with_md, int, (struct spdk_bdev_desc *desc,
27 		struct spdk_io_channel *ch,
28 		struct iovec *iov, int iovcnt, void *md,
29 		uint64_t offset_blocks, uint64_t num_blocks,
30 		spdk_bdev_io_completion_cb cb, void *cb_arg), 0);
31 DEFINE_STUB(spdk_bdev_writev_blocks, int, (struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
32 		struct iovec *iov, int iovcnt,
33 		uint64_t offset_blocks, uint64_t num_blocks,
34 		spdk_bdev_io_completion_cb cb, void *cb_arg), 0);
35 DEFINE_STUB(spdk_bdev_writev_blocks_with_md, int, (struct spdk_bdev_desc *desc,
36 		struct spdk_io_channel *ch,
37 		struct iovec *iov, int iovcnt, void *md,
38 		uint64_t offset_blocks, uint64_t num_blocks,
39 		spdk_bdev_io_completion_cb cb, void *cb_arg), 0);
40 
41 static int
42 test_setup(void)
43 {
44 	uint8_t num_base_bdevs_values[] = { 2, 3 };
45 	uint64_t base_bdev_blockcnt_values[] = { 1, 1024, 1024 * 1024 };
46 	uint32_t base_bdev_blocklen_values[] = { 512, 4096 };
47 	uint8_t *num_base_bdevs;
48 	uint64_t *base_bdev_blockcnt;
49 	uint32_t *base_bdev_blocklen;
50 	struct raid_params params;
51 	uint64_t params_count;
52 	int rc;
53 
54 	params_count = SPDK_COUNTOF(num_base_bdevs_values) *
55 		       SPDK_COUNTOF(base_bdev_blockcnt_values) *
56 		       SPDK_COUNTOF(base_bdev_blocklen_values);
57 	rc = raid_test_params_alloc(params_count);
58 	if (rc) {
59 		return rc;
60 	}
61 
62 	ARRAY_FOR_EACH(num_base_bdevs_values, num_base_bdevs) {
63 		ARRAY_FOR_EACH(base_bdev_blockcnt_values, base_bdev_blockcnt) {
64 			ARRAY_FOR_EACH(base_bdev_blocklen_values, base_bdev_blocklen) {
65 				params.num_base_bdevs = *num_base_bdevs;
66 				params.base_bdev_blockcnt = *base_bdev_blockcnt;
67 				params.base_bdev_blocklen = *base_bdev_blocklen;
68 				params.strip_size = 0;
69 				raid_test_params_add(&params);
70 			}
71 		}
72 	}
73 
74 	return 0;
75 }
76 
77 static int
78 test_cleanup(void)
79 {
80 	raid_test_params_free();
81 	return 0;
82 }
83 
84 static struct raid1_info *
85 create_raid1(struct raid_params *params)
86 {
87 	struct raid_bdev *raid_bdev = raid_test_create_raid_bdev(params, &g_raid1_module);
88 
89 	SPDK_CU_ASSERT_FATAL(raid1_start(raid_bdev) == 0);
90 
91 	return raid_bdev->module_private;
92 }
93 
94 static void
95 delete_raid1(struct raid1_info *r1_info)
96 {
97 	struct raid_bdev *raid_bdev = r1_info->raid_bdev;
98 
99 	raid1_stop(raid_bdev);
100 
101 	raid_test_delete_raid_bdev(raid_bdev);
102 }
103 
104 static void
105 test_raid1_start(void)
106 {
107 	struct raid_params *params;
108 
109 	RAID_PARAMS_FOR_EACH(params) {
110 		struct raid1_info *r1_info;
111 
112 		r1_info = create_raid1(params);
113 
114 		SPDK_CU_ASSERT_FATAL(r1_info != NULL);
115 
116 		CU_ASSERT_EQUAL(r1_info->raid_bdev->level, RAID1);
117 		CU_ASSERT_EQUAL(r1_info->raid_bdev->bdev.blockcnt, params->base_bdev_blockcnt);
118 		CU_ASSERT_PTR_EQUAL(r1_info->raid_bdev->module, &g_raid1_module);
119 
120 		delete_raid1(r1_info);
121 	}
122 }
123 
124 int
125 main(int argc, char **argv)
126 {
127 	CU_pSuite suite = NULL;
128 	unsigned int num_failures;
129 
130 	CU_set_error_action(CUEA_ABORT);
131 	CU_initialize_registry();
132 
133 	suite = CU_add_suite("raid1", test_setup, test_cleanup);
134 	CU_ADD_TEST(suite, test_raid1_start);
135 
136 	CU_basic_set_mode(CU_BRM_VERBOSE);
137 	CU_basic_run_tests();
138 	num_failures = CU_get_number_of_failures();
139 	CU_cleanup_registry();
140 	return num_failures;
141 }
142