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