Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright (C) 2017 Intel Corporation. All rights reserved.
3 : : * Copyright (c) 2021 Mellanox Technologies LTD. All rights reserved.
4 : : */
5 : :
6 : : #include "spdk_internal/cunit.h"
7 : :
8 : : #include "spdk/env.h"
9 : :
10 : : #include "nvme/nvme_ns.c"
11 : :
12 : : #include "common/lib/test_env.c"
13 : :
14 : 6 : SPDK_LOG_REGISTER_COMPONENT(nvme)
15 : :
16 [ - + ]: 84 : DEFINE_STUB(nvme_wait_for_completion_robust_lock, int,
17 : : (struct spdk_nvme_qpair *qpair,
18 : : struct nvme_completion_poll_status *status,
19 : : pthread_mutex_t *robust_mutex), 0);
20 [ - + - + ]: 6 : DEFINE_STUB(nvme_ctrlr_multi_iocs_enabled, bool, (struct spdk_nvme_ctrlr *ctrlr), true);
21 : :
22 : : static struct spdk_nvme_cpl fake_cpl = {};
23 : : static enum spdk_nvme_generic_command_status_code set_status_code = SPDK_NVME_SC_SUCCESS;
24 : :
25 : : static void
26 : 66 : fake_cpl_sc(spdk_nvme_cmd_cb cb_fn, void *cb_arg)
27 : : {
28 : 66 : fake_cpl.status.sc = set_status_code;
29 : 66 : cb_fn(cb_arg, &fake_cpl);
30 : 66 : }
31 : :
32 : : static struct spdk_nvme_ns_data *fake_nsdata;
33 : : static struct spdk_nvme_zns_ns_data nsdata_zns = {
34 : : .mar = 1024,
35 : : .mor = 1024,
36 : : };
37 : : static struct spdk_nvme_nvm_ns_data nsdata_nvm = {
38 : : .lbstm = 0xFFFFFFFF,
39 : : .pic._16bpists = 1,
40 : : .pic._16bpistm = 1,
41 : : .pic.stcrs = 1,
42 : : .elbaf[0].sts = 32,
43 : : .elbaf[0].pif = 0,
44 : : };
45 : :
46 : : struct spdk_nvme_cmd g_ut_cmd = {};
47 : :
48 : : int
49 : 84 : nvme_ctrlr_cmd_identify(struct spdk_nvme_ctrlr *ctrlr, uint8_t cns, uint16_t cntid, uint32_t nsid,
50 : : uint8_t csi, void *payload, size_t payload_size,
51 : : spdk_nvme_cmd_cb cb_fn, void *cb_arg)
52 : : {
53 [ - + ]: 84 : memset(&g_ut_cmd, 0, sizeof(g_ut_cmd));
54 : :
55 [ + + ]: 84 : if (cns == SPDK_NVME_IDENTIFY_NS) {
56 [ - + ]: 66 : assert(payload_size == sizeof(struct spdk_nvme_ns_data));
57 [ + + ]: 66 : if (fake_nsdata) {
58 [ - + - + ]: 6 : memcpy(payload, fake_nsdata, sizeof(*fake_nsdata));
59 : : } else {
60 [ - + ]: 60 : memset(payload, 0, payload_size);
61 : : }
62 : 66 : fake_cpl_sc(cb_fn, cb_arg);
63 : 66 : return 0;
64 [ + + ]: 18 : } else if (cns == SPDK_NVME_IDENTIFY_NS_IOCS) {
65 [ + + ]: 12 : if (csi == SPDK_NVME_CSI_ZNS) {
66 [ - + ]: 6 : assert(payload_size == sizeof(struct spdk_nvme_zns_ns_data));
67 [ - + - + ]: 6 : memcpy(payload, &nsdata_zns, sizeof(struct spdk_nvme_zns_ns_data));
68 : 6 : return 0;
69 [ + - ]: 6 : } else if (csi == SPDK_NVME_CSI_NVM) {
70 [ - + ]: 6 : assert(payload_size == sizeof(struct spdk_nvme_nvm_ns_data));
71 [ - + - + ]: 6 : memcpy(payload, &nsdata_nvm, sizeof(struct spdk_nvme_nvm_ns_data));
72 : 6 : return 0;
73 : : }
74 [ + - ]: 6 : } else if (cns == SPDK_NVME_IDENTIFY_NS_ID_DESCRIPTOR_LIST) {
75 : 6 : g_ut_cmd.cdw10_bits.identify.cns = cns;
76 : 6 : g_ut_cmd.cdw10_bits.identify.cntid = cntid;
77 : 6 : g_ut_cmd.cdw11_bits.identify.csi = csi;
78 : 6 : g_ut_cmd.nsid = nsid;
79 : 6 : return 0;
80 : : }
81 : 0 : return -1;
82 : : }
83 : :
84 : : void
85 : 66 : nvme_completion_poll_cb(void *arg, const struct spdk_nvme_cpl *cpl)
86 : : {
87 : 66 : }
88 : :
89 : : int32_t
90 : 0 : spdk_nvme_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_completions)
91 : : {
92 : 0 : return -1;
93 : : }
94 : :
95 : : static void
96 : 6 : test_nvme_ns_construct(void)
97 : : {
98 : 6 : struct spdk_nvme_ns ns = {};
99 : 6 : uint32_t id = 1;
100 : 6 : struct spdk_nvme_ctrlr ctrlr = { };
101 : :
102 : 6 : nvme_ns_construct(&ns, id, &ctrlr);
103 : 6 : CU_ASSERT(ns.id == 1);
104 : 6 : }
105 : :
106 : : static void
107 : 6 : test_nvme_ns_uuid(void)
108 : : {
109 : 6 : struct spdk_nvme_ns ns = {};
110 : 6 : uint32_t id = 1;
111 : 6 : struct spdk_nvme_ctrlr ctrlr = {};
112 : : const struct spdk_uuid *uuid;
113 : 5 : struct spdk_uuid expected_uuid;
114 : :
115 : 6 : memset(&expected_uuid, 0xA5, sizeof(expected_uuid));
116 : :
117 : : /* Empty list - no UUID should be found */
118 : 6 : nvme_ns_construct(&ns, id, &ctrlr);
119 : 6 : uuid = spdk_nvme_ns_get_uuid(&ns);
120 : 6 : CU_ASSERT(uuid == NULL);
121 : 6 : nvme_ns_destruct(&ns);
122 : :
123 : : /* NGUID only (no UUID in list) */
124 : 6 : nvme_ns_construct(&ns, id, &ctrlr);
125 : 6 : ns.id_desc_list[0] = 0x02; /* NIDT == NGUID */
126 : 6 : ns.id_desc_list[1] = 0x10; /* NIDL */
127 : 6 : memset(&ns.id_desc_list[4], 0xCC, 0x10);
128 : 6 : uuid = spdk_nvme_ns_get_uuid(&ns);
129 : 6 : CU_ASSERT(uuid == NULL);
130 : 6 : nvme_ns_destruct(&ns);
131 : :
132 : : /* Just UUID in the list */
133 : 6 : nvme_ns_construct(&ns, id, &ctrlr);
134 : 6 : ns.id_desc_list[0] = 0x03; /* NIDT == UUID */
135 : 6 : ns.id_desc_list[1] = 0x10; /* NIDL */
136 : 6 : memcpy(&ns.id_desc_list[4], &expected_uuid, sizeof(expected_uuid));
137 : 6 : uuid = spdk_nvme_ns_get_uuid(&ns);
138 [ - + ]: 6 : SPDK_CU_ASSERT_FATAL(uuid != NULL);
139 [ - + ]: 6 : CU_ASSERT(memcmp(uuid, &expected_uuid, sizeof(*uuid)) == 0);
140 : 6 : nvme_ns_destruct(&ns);
141 : :
142 : : /* UUID followed by NGUID */
143 : 6 : nvme_ns_construct(&ns, id, &ctrlr);
144 : 6 : ns.id_desc_list[0] = 0x03; /* NIDT == UUID */
145 : 6 : ns.id_desc_list[1] = 0x10; /* NIDL */
146 : 6 : memcpy(&ns.id_desc_list[4], &expected_uuid, sizeof(expected_uuid));
147 : 6 : ns.id_desc_list[20] = 0x02; /* NIDT == NGUID */
148 : 6 : ns.id_desc_list[21] = 0x10; /* NIDL */
149 : 6 : memset(&ns.id_desc_list[24], 0xCC, 0x10);
150 : 6 : uuid = spdk_nvme_ns_get_uuid(&ns);
151 [ - + ]: 6 : SPDK_CU_ASSERT_FATAL(uuid != NULL);
152 [ - + ]: 6 : CU_ASSERT(memcmp(uuid, &expected_uuid, sizeof(*uuid)) == 0);
153 : 6 : nvme_ns_destruct(&ns);
154 : :
155 : : /* NGUID followed by UUID */
156 : 6 : nvme_ns_construct(&ns, id, &ctrlr);
157 : 6 : ns.id_desc_list[0] = 0x02; /* NIDT == NGUID */
158 : 6 : ns.id_desc_list[1] = 0x10; /* NIDL */
159 : 6 : memset(&ns.id_desc_list[4], 0xCC, 0x10);
160 : 6 : ns.id_desc_list[20] = 0x03; /* NIDT = UUID */
161 : 6 : ns.id_desc_list[21] = 0x10; /* NIDL */
162 : 6 : memcpy(&ns.id_desc_list[24], &expected_uuid, sizeof(expected_uuid));
163 : 6 : uuid = spdk_nvme_ns_get_uuid(&ns);
164 [ - + ]: 6 : SPDK_CU_ASSERT_FATAL(uuid != NULL);
165 [ - + ]: 6 : CU_ASSERT(memcmp(uuid, &expected_uuid, sizeof(*uuid)) == 0);
166 : 6 : nvme_ns_destruct(&ns);
167 : 6 : }
168 : :
169 : : static void
170 : 6 : test_nvme_ns_csi(void)
171 : : {
172 : 6 : struct spdk_nvme_ns ns = {};
173 : 6 : uint32_t id = 1;
174 : 6 : struct spdk_nvme_ctrlr ctrlr = {};
175 : : enum spdk_nvme_csi csi;
176 : :
177 : : /* Empty list - SPDK_NVME_CSI_NVM should be returned */
178 : 6 : nvme_ns_construct(&ns, id, &ctrlr);
179 : 6 : csi = nvme_ns_get_csi(&ns);
180 : 6 : CU_ASSERT(csi == SPDK_NVME_CSI_NVM);
181 : 6 : nvme_ns_destruct(&ns);
182 : :
183 : : /* NVM CSI - SPDK_NVME_CSI_NVM should be returned */
184 : 6 : nvme_ns_construct(&ns, id, &ctrlr);
185 : 6 : ns.id_desc_list[0] = 0x4; /* NIDT == CSI */
186 : 6 : ns.id_desc_list[1] = 0x1; /* NIDL */
187 : 6 : ns.id_desc_list[4] = 0x0; /* SPDK_NVME_CSI_NVM */
188 : 6 : csi = nvme_ns_get_csi(&ns);
189 : 6 : CU_ASSERT(csi == SPDK_NVME_CSI_NVM);
190 : 6 : nvme_ns_destruct(&ns);
191 : :
192 : : /* NGUID followed by ZNS CSI - SPDK_NVME_CSI_ZNS should be returned */
193 : 6 : nvme_ns_construct(&ns, id, &ctrlr);
194 : 6 : ns.id_desc_list[0] = 0x02; /* NIDT == NGUID */
195 : 6 : ns.id_desc_list[1] = 0x10; /* NIDL */
196 [ - + ]: 6 : memset(&ns.id_desc_list[4], 0xCC, 0x10);
197 : 6 : ns.id_desc_list[20] = 0x4; /* NIDT == CSI */
198 : 6 : ns.id_desc_list[21] = 0x1; /* NIDL */
199 : 6 : ns.id_desc_list[24] = 0x2; /* SPDK_NVME_CSI_ZNS */
200 : 6 : csi = nvme_ns_get_csi(&ns);
201 : 6 : CU_ASSERT(csi == SPDK_NVME_CSI_ZNS);
202 : 6 : nvme_ns_destruct(&ns);
203 : :
204 : : /* KV CSI followed by NGUID - SPDK_NVME_CSI_KV should be returned */
205 : 6 : nvme_ns_construct(&ns, id, &ctrlr);
206 : 6 : ns.id_desc_list[0] = 0x4; /* NIDT == CSI */
207 : 6 : ns.id_desc_list[1] = 0x1; /* NIDL */
208 : 6 : ns.id_desc_list[4] = 0x1; /* SPDK_NVME_CSI_KV */
209 : 6 : ns.id_desc_list[5] = 0x02; /* NIDT == NGUID */
210 : 6 : ns.id_desc_list[6] = 0x10; /* NIDL */
211 [ - + ]: 6 : memset(&ns.id_desc_list[9], 0xCC, 0x10);
212 : 6 : csi = nvme_ns_get_csi(&ns);
213 : 6 : CU_ASSERT(csi == SPDK_NVME_CSI_KV);
214 : 6 : nvme_ns_destruct(&ns);
215 : 6 : }
216 : :
217 : : static void
218 : 6 : test_nvme_ns_data(void)
219 : : {
220 : 6 : struct spdk_nvme_ns ns = {};
221 : 6 : struct spdk_nvme_ctrlr ctrlr = { };
222 : 6 : struct spdk_nvme_ns_data expected_nsdata = {
223 : : .nsze = 1000,
224 : : .ncap = 1000,
225 : : };
226 : : const struct spdk_nvme_ns_data *nsdata;
227 : :
228 : 6 : fake_nsdata = &expected_nsdata;
229 [ - + ]: 6 : SPDK_CU_ASSERT_FATAL(nvme_ns_construct(&ns, 1, &ctrlr) == 0);
230 : 6 : fake_nsdata = NULL;
231 : 6 : CU_ASSERT(spdk_nvme_ns_is_active(&ns));
232 : 6 : CU_ASSERT(spdk_nvme_ns_get_id(&ns) == 1);
233 : 6 : CU_ASSERT(spdk_nvme_ns_get_num_sectors(&ns) == 1000);
234 : :
235 : 6 : nsdata = spdk_nvme_ns_get_data(&ns);
236 : 6 : CU_ASSERT(nsdata != NULL);
237 : 6 : CU_ASSERT(nsdata->ncap == 1000);
238 : :
239 : 6 : nvme_ns_destruct(&ns);
240 : :
241 : : /* Cached NS data is still accessible after destruction. But is cleared. */
242 : 6 : CU_ASSERT(!spdk_nvme_ns_is_active(&ns));
243 : 6 : CU_ASSERT(spdk_nvme_ns_get_id(&ns) == 1);
244 : 6 : CU_ASSERT(spdk_nvme_ns_get_num_sectors(&ns) == 0);
245 : 6 : CU_ASSERT(nsdata->ncap == 0);
246 : 6 : CU_ASSERT(nsdata == spdk_nvme_ns_get_data(&ns));
247 : 6 : }
248 : :
249 : : static void
250 : 6 : test_nvme_ns_set_identify_data(void)
251 : : {
252 : 6 : struct spdk_nvme_ns ns = {};
253 : 6 : struct spdk_nvme_ctrlr ctrlr = {};
254 : :
255 : 6 : ns.id = 1;
256 : 6 : ns.ctrlr = &ctrlr;
257 : :
258 : 6 : ns.ctrlr->cdata.oncs.dsm = 1;
259 : 6 : ns.ctrlr->cdata.oncs.compare = 1;
260 : 6 : ns.ctrlr->cdata.vwc.present = 1;
261 : 6 : ns.ctrlr->cdata.oncs.write_zeroes = 1;
262 : 6 : ns.ctrlr->cdata.oncs.write_unc = 1;
263 : 6 : ns.ctrlr->min_page_size = 4096;
264 : 6 : ns.ctrlr->max_xfer_size = 131072;
265 : :
266 : 6 : ns.nsdata.flbas.extended = 1;
267 : 6 : ns.nsdata.nsrescap.raw = 1;
268 : 6 : ns.nsdata.dps.pit = SPDK_NVME_FMT_NVM_PROTECTION_TYPE1;
269 : 6 : ns.nsdata.flbas.format = 0;
270 : 6 : ns.nsdata.flbas.msb_format = 0;
271 : 6 : ns.nsdata.lbaf[0].lbads = 9;
272 : 6 : ns.nsdata.lbaf[0].ms = 8;
273 : :
274 : : /* case 1: nsdata->noiob > 0 */
275 : 6 : ns.nsdata.noiob = 1;
276 : 6 : nvme_ns_set_identify_data(&ns);
277 : 6 : CU_ASSERT(spdk_nvme_ns_get_optimal_io_boundary(&ns) == 1)
278 : :
279 : 6 : CU_ASSERT(spdk_nvme_ns_get_sector_size(&ns) == 512);
280 : 6 : CU_ASSERT(spdk_nvme_ns_get_extended_sector_size(&ns) == 520);
281 : 6 : CU_ASSERT(spdk_nvme_ns_get_md_size(&ns) == 8);
282 : 6 : CU_ASSERT(spdk_nvme_ns_get_max_io_xfer_size(&ns) == 131072);
283 : 6 : CU_ASSERT(ns.sectors_per_max_io == 252);
284 : 6 : CU_ASSERT(ns.sectors_per_max_io_no_md == 256);
285 : 6 : CU_ASSERT(spdk_nvme_ns_get_pi_type(&ns) == SPDK_NVME_FMT_NVM_PROTECTION_TYPE1);
286 : 6 : CU_ASSERT(spdk_nvme_ns_get_pi_format(&ns) == SPDK_NVME_16B_GUARD_PI);
287 : :
288 : 6 : CU_ASSERT(spdk_nvme_ns_get_flags(&ns) & SPDK_NVME_NS_EXTENDED_LBA_SUPPORTED);
289 : 6 : CU_ASSERT(spdk_nvme_ns_get_flags(&ns) & SPDK_NVME_NS_RESERVATION_SUPPORTED);
290 : 6 : CU_ASSERT(spdk_nvme_ns_get_flags(&ns) & SPDK_NVME_NS_COMPARE_SUPPORTED);
291 : 6 : CU_ASSERT(spdk_nvme_ns_get_flags(&ns) & SPDK_NVME_NS_FLUSH_SUPPORTED);
292 : 6 : CU_ASSERT(spdk_nvme_ns_get_flags(&ns) & SPDK_NVME_NS_WRITE_ZEROES_SUPPORTED);
293 : 6 : CU_ASSERT(spdk_nvme_ns_get_flags(&ns) & SPDK_NVME_NS_WRITE_UNCORRECTABLE_SUPPORTED);
294 : 6 : CU_ASSERT(spdk_nvme_ns_get_flags(&ns) & SPDK_NVME_NS_RESERVATION_SUPPORTED);
295 : 6 : CU_ASSERT(spdk_nvme_ns_get_flags(&ns) & SPDK_NVME_NS_DPS_PI_SUPPORTED);
296 : :
297 : : /* case 2: quirks for NVME_QUIRK_MDTS_EXCLUDE_MD */
298 : 6 : ns.ctrlr->quirks = NVME_QUIRK_MDTS_EXCLUDE_MD;
299 : 6 : nvme_ns_set_identify_data(&ns);
300 : 6 : CU_ASSERT(ns.sectors_per_max_io == 256);
301 : 6 : CU_ASSERT(ns.sectors_per_max_io_no_md == 256);
302 : 6 : }
303 : :
304 : : static void
305 : 6 : test_spdk_nvme_ns_get_values(void)
306 : : {
307 : 6 : struct spdk_nvme_ns ns = {};
308 : 6 : struct spdk_nvme_ctrlr nsctrlr = {};
309 : :
310 : 6 : ns.ctrlr = &nsctrlr;
311 : :
312 : : /* case1: spdk_nvme_ns_get_id */
313 : 6 : ns.id = 1;
314 : 6 : CU_ASSERT(spdk_nvme_ns_get_id(&ns) == 1);
315 : :
316 : : /* case2: spdk_nvme_ns_get_ctrlr */
317 : 6 : CU_ASSERT(spdk_nvme_ns_get_ctrlr(&ns) == &nsctrlr);
318 : :
319 : : /* case3: spdk_nvme_ns_get_max_io_xfer_size */
320 : 6 : ns.ctrlr->max_xfer_size = 65536;
321 : 6 : CU_ASSERT(spdk_nvme_ns_get_max_io_xfer_size(&ns) == 65536);
322 : :
323 : : /* case4: spdk_nvme_ns_get_sector_size */
324 : 6 : ns.sector_size = 512;
325 : 6 : CU_ASSERT(spdk_nvme_ns_get_sector_size(&ns) == 512);
326 : :
327 : : /* case5: spdk_nvme_ns_get_extended_sector_size */
328 : 6 : ns.extended_lba_size = 512;
329 : 6 : CU_ASSERT(spdk_nvme_ns_get_extended_sector_size(&ns) == 512);
330 : :
331 : : /* case6: spdk_nvme_ns_get_num_sectors */
332 : 6 : ns.nsdata.nsze = 1024;
333 : 6 : CU_ASSERT(spdk_nvme_ns_get_num_sectors(&ns) == 1024);
334 : :
335 : : /* case7: spdk_nvme_ns_get_size */
336 : 6 : CU_ASSERT(spdk_nvme_ns_get_size(&ns) == 524288);
337 : :
338 : : /* case8: spdk_nvme_ns_get_flags */
339 : 6 : ns.flags = 255;
340 : 6 : CU_ASSERT(spdk_nvme_ns_get_flags(&ns) == 255);
341 : :
342 : : /* case9: spdk_nvme_ns_get_pi_type */
343 : 6 : ns.pi_type = SPDK_NVME_FMT_NVM_PROTECTION_DISABLE;
344 : 6 : CU_ASSERT(spdk_nvme_ns_get_pi_type(&ns) == SPDK_NVME_FMT_NVM_PROTECTION_DISABLE);
345 : :
346 : : /* case10: spdk_nvme_ns_get_md_size */
347 : 6 : ns.md_size = 512;
348 : 6 : CU_ASSERT(spdk_nvme_ns_get_md_size(&ns) == 512);
349 : :
350 : : /* case11: spdk_nvme_ns_get_data */
351 : 6 : CU_ASSERT(spdk_nvme_ns_get_data(&ns) != NULL);
352 : :
353 : : /* case12: spdk_nvme_ns_get_optimal_io_boundary */
354 : 6 : ns.sectors_per_stripe = 1;
355 : 6 : CU_ASSERT(spdk_nvme_ns_get_optimal_io_boundary(&ns) == 1);
356 : :
357 : : /* case13: spdk_nvme_ns_get_dealloc_logical_block_read_value */
358 : 6 : ns.ctrlr->quirks = NVME_QUIRK_READ_ZERO_AFTER_DEALLOCATE | NVME_INTEL_QUIRK_WRITE_LATENCY;
359 : 6 : ns.nsdata.dlfeat.bits.read_value = SPDK_NVME_DEALLOC_NOT_REPORTED;
360 : 6 : CU_ASSERT(spdk_nvme_ns_get_dealloc_logical_block_read_value(&ns) == SPDK_NVME_DEALLOC_READ_00);
361 : :
362 : 6 : ns.ctrlr->quirks = NVME_INTEL_QUIRK_READ_LATENCY;
363 : 6 : CU_ASSERT(spdk_nvme_ns_get_dealloc_logical_block_read_value(&ns) == SPDK_NVME_DEALLOC_NOT_REPORTED);
364 : :
365 : : /* case14: spdk_nvme_ns_get_csi */
366 : 6 : ns.csi = SPDK_NVME_CSI_NVM;
367 : 6 : CU_ASSERT(spdk_nvme_ns_get_csi(&ns) == SPDK_NVME_CSI_NVM);
368 : :
369 : : /* case15: spdk_nvme_ns_get_ana_group_id */
370 : 6 : ns.ana_group_id = 15;
371 : 6 : CU_ASSERT(spdk_nvme_ns_get_ana_group_id(&ns) == 15);
372 : :
373 : : /* case16: spdk_nvme_ns_get_ana_state */
374 : 6 : ns.ana_state = SPDK_NVME_ANA_OPTIMIZED_STATE;
375 : 6 : CU_ASSERT(spdk_nvme_ns_get_ana_state(&ns) == SPDK_NVME_ANA_OPTIMIZED_STATE);
376 : 6 : }
377 : :
378 : : static void
379 : 6 : test_spdk_nvme_ns_is_active(void)
380 : : {
381 : 6 : struct spdk_nvme_ns ns = {};
382 : :
383 : : /* case1: nsdata->id == 0 return false */
384 : 6 : ns.id = 0;
385 : 6 : CU_ASSERT(spdk_nvme_ns_is_active(&ns) == false);
386 : :
387 : : /* case2: nsdata->ncap == 0 return false */
388 : 6 : ns.id = 1;
389 : 6 : ns.nsdata.ncap = 0;
390 : 6 : CU_ASSERT(spdk_nvme_ns_is_active(&ns) == false);
391 : :
392 : : /* case3: ns->ncap != 0 return true */
393 : 6 : ns.nsdata.ncap = 1;
394 : 6 : CU_ASSERT(spdk_nvme_ns_is_active(&ns) == true);
395 : 6 : }
396 : :
397 : : static void
398 : 6 : spdk_nvme_ns_supports(void)
399 : : {
400 : 6 : struct spdk_nvme_ns ns = {};
401 : :
402 : : /* case1: spdk_nvme_ns_supports_extended_lba */
403 : 6 : ns.flags = SPDK_NVME_NS_DEALLOCATE_SUPPORTED;
404 : 6 : CU_ASSERT(spdk_nvme_ns_supports_extended_lba(&ns) == false);
405 : 6 : ns.flags = SPDK_NVME_NS_EXTENDED_LBA_SUPPORTED | SPDK_NVME_NS_DEALLOCATE_SUPPORTED;
406 : 6 : CU_ASSERT(spdk_nvme_ns_supports_extended_lba(&ns) == true);
407 : :
408 : : /* case2: spdk_nvme_ns_supports_compare */
409 : 6 : ns.flags = SPDK_NVME_NS_DEALLOCATE_SUPPORTED;
410 : 6 : CU_ASSERT(spdk_nvme_ns_supports_compare(&ns) == false);
411 : 6 : ns.flags = SPDK_NVME_NS_COMPARE_SUPPORTED | SPDK_NVME_NS_DEALLOCATE_SUPPORTED;
412 : 6 : CU_ASSERT(spdk_nvme_ns_supports_compare(&ns) == true);
413 : 6 : }
414 : :
415 : : static void
416 : 6 : test_nvme_ns_has_supported_iocs_specific_data(void)
417 : : {
418 : 6 : struct spdk_nvme_ctrlr ctrlr = {};
419 : 6 : struct spdk_nvme_ns ns = { .ctrlr = &ctrlr, };
420 : :
421 : : /* case 1: ns.csi == SPDK_NVME_CSI_NVM && !ctrlr.cdata.ctratt.bits.elbas.
422 : : * Expect: false */
423 : 6 : ns.csi = SPDK_NVME_CSI_NVM;
424 : 6 : ctrlr.cdata.ctratt.bits.elbas = false;
425 : 6 : CU_ASSERT(nvme_ns_has_supported_iocs_specific_data(&ns) == false);
426 : : /* case 2: ns.csi == SPDK_NVME_CSI_NVM && ctrlr.cdata.ctratt.bits.elbas.
427 : : * Expect: true */
428 : 6 : ctrlr.cdata.ctratt.bits.elbas = true;
429 : 6 : CU_ASSERT(nvme_ns_has_supported_iocs_specific_data(&ns) == true);
430 : : /* case 3: ns.csi == SPDK_NVME_CSI_ZNS. Expect: true */
431 : 6 : ctrlr.cdata.ctratt.bits.elbas = false;
432 : 6 : ns.csi = SPDK_NVME_CSI_ZNS;
433 : 6 : CU_ASSERT(nvme_ns_has_supported_iocs_specific_data(&ns) == true);
434 : : /* case 4: default ns.csi == SPDK_NVME_CSI_KV. Expect: false */
435 : 6 : ns.csi = SPDK_NVME_CSI_KV;
436 : 6 : CU_ASSERT(nvme_ns_has_supported_iocs_specific_data(&ns) == false);
437 : 6 : }
438 : :
439 : : static void
440 : 6 : test_nvme_ctrlr_identify_ns_iocs_specific(void)
441 : : {
442 : 6 : struct spdk_nvme_ns ns = {};
443 : 6 : struct spdk_nvme_ctrlr ctrlr = {};
444 : 6 : int rc = 0;
445 : :
446 : 6 : ns.ctrlr = &ctrlr;
447 : :
448 : 6 : ns.csi = SPDK_NVME_CSI_ZNS;
449 : 6 : ns.id = 1;
450 : :
451 : : /* case 1: Test nvme_ctrlr_identify_ns_iocs_specific. Expect: PASS. */
452 : 6 : rc = nvme_ctrlr_identify_ns_iocs_specific(&ns);
453 : 6 : CU_ASSERT(rc == 0);
454 [ - + ]: 6 : SPDK_CU_ASSERT_FATAL(ns.nsdata_zns != NULL);
455 : 6 : CU_ASSERT(ns.nsdata_zns->mar == 1024);
456 : 6 : CU_ASSERT(ns.nsdata_zns->mor == 1024);
457 : :
458 : : /* case 2: Test nvme_ns_free_zns_specific_data. Expect: PASS. */
459 : 6 : nvme_ns_free_zns_specific_data(&ns);
460 : 6 : CU_ASSERT(ns.nsdata_zns == NULL);
461 : :
462 : 6 : ns.csi = SPDK_NVME_CSI_NVM;
463 : 6 : ctrlr.cdata.ctratt.bits.elbas = true;
464 : :
465 : : /* case 3: Test nvme_ctrlr_identify_ns_iocs_specific. Expect: PASS. */
466 : 6 : rc = nvme_ctrlr_identify_ns_iocs_specific(&ns);
467 : 6 : CU_ASSERT(rc == 0);
468 [ - + ]: 6 : SPDK_CU_ASSERT_FATAL(ns.nsdata_nvm != NULL);
469 : 6 : CU_ASSERT(ns.nsdata_nvm->lbstm == 0xFFFFFFFF);
470 : 6 : CU_ASSERT(ns.nsdata_nvm->pic._16bpists == 1);
471 : 6 : CU_ASSERT(ns.nsdata_nvm->pic._16bpistm == 1);
472 : 6 : CU_ASSERT(ns.nsdata_nvm->pic.stcrs == 1);
473 : 6 : CU_ASSERT(ns.nsdata_nvm->elbaf[0].sts == 32);
474 : 6 : CU_ASSERT(ns.nsdata_nvm->elbaf[0].pif == 0);
475 : :
476 : : /* case 4: Test vnme_ns_free_nvm_specific_data. Expect: PASS. */
477 : 6 : nvme_ns_free_nvm_specific_data(&ns);
478 : 6 : CU_ASSERT(ns.nsdata_nvm == NULL);
479 : 6 : }
480 : :
481 : : static void
482 : 6 : test_nvme_ctrlr_identify_id_desc(void)
483 : : {
484 : 6 : struct spdk_nvme_ns ns = {};
485 : 6 : struct spdk_nvme_ctrlr ctrlr = {};
486 : : int rc;
487 : :
488 : 6 : ns.ctrlr = &ctrlr;
489 : 6 : ns.ctrlr->vs.raw = SPDK_NVME_VERSION(1, 3, 0);
490 : 6 : ns.ctrlr->cap.bits.css |= SPDK_NVME_CAP_CSS_IOCS;
491 : 6 : ns.id = 1;
492 : :
493 : 6 : rc = nvme_ctrlr_identify_id_desc(&ns);
494 : 6 : CU_ASSERT(rc == 0);
495 : 6 : CU_ASSERT(g_ut_cmd.cdw10_bits.identify.cns == SPDK_NVME_IDENTIFY_NS_ID_DESCRIPTOR_LIST);
496 : 6 : CU_ASSERT(g_ut_cmd.cdw10_bits.identify.cntid == 0);
497 : 6 : CU_ASSERT(g_ut_cmd.cdw11_bits.identify.csi == spdk_nvme_ns_get_csi(&ns));
498 : 6 : CU_ASSERT(g_ut_cmd.nsid == 1);
499 : :
500 : : /* NVME version and css unsupported */
501 : 6 : ns.ctrlr->vs.raw = SPDK_NVME_VERSION(1, 2, 0);
502 : 6 : ns.ctrlr->cap.bits.css &= ~SPDK_NVME_CAP_CSS_IOCS;
503 : :
504 : 6 : rc = nvme_ctrlr_identify_id_desc(&ns);
505 : 6 : CU_ASSERT(rc == 0);
506 : 6 : }
507 : :
508 : : static void
509 : 6 : test_nvme_ns_find_id_desc(void)
510 : : {
511 : 6 : struct spdk_nvme_ns ns = {};
512 : 6 : struct spdk_nvme_ns_id_desc *desc = NULL;
513 : 6 : const uint8_t *csi = NULL;
514 : 6 : size_t length = 0;
515 : :
516 : 6 : desc = (void *)ns.id_desc_list;
517 : 6 : desc->nidl = 4;
518 : 6 : desc->nidt = SPDK_NVME_NIDT_CSI;
519 : :
520 : : /* Case 1: get id descriptor successfully */
521 : 6 : csi = nvme_ns_find_id_desc(&ns, SPDK_NVME_NIDT_CSI, &length);
522 : 6 : CU_ASSERT(csi == desc->nid);
523 : 6 : CU_ASSERT(length == 4);
524 : :
525 : : /* Case 2: ns_id length invalid, expect fail */
526 : 6 : desc->nidl = 0;
527 : :
528 : 6 : csi = nvme_ns_find_id_desc(&ns, SPDK_NVME_NIDT_CSI, &length);
529 : 6 : CU_ASSERT(csi == NULL);
530 : :
531 : : /* Case 3: No correct id descriptor type entry, expect fail */
532 : 6 : desc->nidl = 4;
533 : 6 : desc->nidt = SPDK_NVME_NIDT_CSI;
534 : :
535 : 6 : csi = nvme_ns_find_id_desc(&ns, SPDK_NVME_NIDT_UUID, &length);
536 : 6 : CU_ASSERT(csi == NULL);
537 : 6 : }
538 : :
539 : : int
540 : 6 : main(int argc, char **argv)
541 : : {
542 : 6 : CU_pSuite suite = NULL;
543 : : unsigned int num_failures;
544 : :
545 : 6 : CU_initialize_registry();
546 : :
547 : 6 : suite = CU_add_suite("nvme", NULL, NULL);
548 : :
549 : 6 : CU_ADD_TEST(suite, test_nvme_ns_construct);
550 : 6 : CU_ADD_TEST(suite, test_nvme_ns_uuid);
551 : 6 : CU_ADD_TEST(suite, test_nvme_ns_csi);
552 : 6 : CU_ADD_TEST(suite, test_nvme_ns_data);
553 : 6 : CU_ADD_TEST(suite, test_nvme_ns_set_identify_data);
554 : 6 : CU_ADD_TEST(suite, test_spdk_nvme_ns_get_values);
555 : 6 : CU_ADD_TEST(suite, test_spdk_nvme_ns_is_active);
556 : 6 : CU_ADD_TEST(suite, spdk_nvme_ns_supports);
557 : 6 : CU_ADD_TEST(suite, test_nvme_ns_has_supported_iocs_specific_data);
558 : 6 : CU_ADD_TEST(suite, test_nvme_ctrlr_identify_ns_iocs_specific);
559 : 6 : CU_ADD_TEST(suite, test_nvme_ctrlr_identify_id_desc);
560 : 6 : CU_ADD_TEST(suite, test_nvme_ns_find_id_desc);
561 : :
562 : 6 : num_failures = spdk_ut_run_tests(argc, argv, NULL);
563 : 6 : CU_cleanup_registry();
564 : 6 : return num_failures;
565 : : }
|