xref: /illumos-gate/usr/src/test/nvme-tests/tests/libnvme/missing-field-destruct.c (revision f5f0964ce91892f7482efc86903b0ec7c7b6ba66)
1*f5f0964cSRobert Mustacchi /*
2*f5f0964cSRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*f5f0964cSRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*f5f0964cSRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*f5f0964cSRobert Mustacchi  * 1.0 of the CDDL.
6*f5f0964cSRobert Mustacchi  *
7*f5f0964cSRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*f5f0964cSRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*f5f0964cSRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*f5f0964cSRobert Mustacchi  */
11*f5f0964cSRobert Mustacchi 
12*f5f0964cSRobert Mustacchi /*
13*f5f0964cSRobert Mustacchi  * Copyright 2025 Oxide Computer Company
14*f5f0964cSRobert Mustacchi  */
15*f5f0964cSRobert Mustacchi 
16*f5f0964cSRobert Mustacchi /*
17*f5f0964cSRobert Mustacchi  * Verify that we generate the appropriate missing field error for destructive
18*f5f0964cSRobert Mustacchi  * tests.
19*f5f0964cSRobert Mustacchi  */
20*f5f0964cSRobert Mustacchi 
21*f5f0964cSRobert Mustacchi #include <err.h>
22*f5f0964cSRobert Mustacchi #include <string.h>
23*f5f0964cSRobert Mustacchi 
24*f5f0964cSRobert Mustacchi #include "libnvme_test_common.h"
25*f5f0964cSRobert Mustacchi 
26*f5f0964cSRobert Mustacchi static bool
missing_field_err(nvme_ctrl_t * ctrl,const char * desc,nvme_err_t exp_err)27*f5f0964cSRobert Mustacchi missing_field_err(nvme_ctrl_t *ctrl, const char *desc, nvme_err_t exp_err)
28*f5f0964cSRobert Mustacchi {
29*f5f0964cSRobert Mustacchi 	nvme_err_t err = nvme_ctrl_err(ctrl);
30*f5f0964cSRobert Mustacchi 
31*f5f0964cSRobert Mustacchi 	if (err == exp_err) {
32*f5f0964cSRobert Mustacchi 		return (true);
33*f5f0964cSRobert Mustacchi 	}
34*f5f0964cSRobert Mustacchi 
35*f5f0964cSRobert Mustacchi 	warnx("TEST FAILED: %s returned wrong error %s (0x%x), not %s (0x%x)",
36*f5f0964cSRobert Mustacchi 	    desc, nvme_ctrl_errtostr(ctrl, err), err,
37*f5f0964cSRobert Mustacchi 	    nvme_ctrl_errtostr(ctrl, exp_err), exp_err);
38*f5f0964cSRobert Mustacchi 	return (false);
39*f5f0964cSRobert Mustacchi }
40*f5f0964cSRobert Mustacchi 
41*f5f0964cSRobert Mustacchi int
main(void)42*f5f0964cSRobert Mustacchi main(void)
43*f5f0964cSRobert Mustacchi {
44*f5f0964cSRobert Mustacchi 	int ret = EXIT_SUCCESS;
45*f5f0964cSRobert Mustacchi 	nvme_t *nvme;
46*f5f0964cSRobert Mustacchi 	nvme_ctrl_t *ctrl;
47*f5f0964cSRobert Mustacchi 	nvme_fw_commit_req_t *fw_commit_req = NULL;
48*f5f0964cSRobert Mustacchi 	nvme_format_req_t *format_req = NULL;
49*f5f0964cSRobert Mustacchi 	nvme_ns_create_req_t *create_req = NULL;
50*f5f0964cSRobert Mustacchi 	nvme_ns_delete_req_t *delete_req = NULL;
51*f5f0964cSRobert Mustacchi 	nvme_ns_attach_req_t *attach_req = NULL;
52*f5f0964cSRobert Mustacchi 
53*f5f0964cSRobert Mustacchi 	libnvme_test_init(&nvme, &ctrl);
54*f5f0964cSRobert Mustacchi 
55*f5f0964cSRobert Mustacchi 	if (!nvme_fw_commit_req_init(ctrl, &fw_commit_req)) {
56*f5f0964cSRobert Mustacchi 		if (nvme_ctrl_err(ctrl) == NVME_ERR_FW_UNSUP_BY_DEV) {
57*f5f0964cSRobert Mustacchi 			warnx("TEST SKIPPED: device does not support firmware "
58*f5f0964cSRobert Mustacchi 			    "requests");
59*f5f0964cSRobert Mustacchi 		} else {
60*f5f0964cSRobert Mustacchi 			libnvme_test_ctrl_warn(ctrl, "failed to initialize fw "
61*f5f0964cSRobert Mustacchi 			    "commit request");
62*f5f0964cSRobert Mustacchi 			ret = EXIT_FAILURE;
63*f5f0964cSRobert Mustacchi 		}
64*f5f0964cSRobert Mustacchi 	} else if (nvme_fw_commit_req_exec(fw_commit_req)) {
65*f5f0964cSRobert Mustacchi 		warnx("TEST FAILED: fw commit request succeeded despite "
66*f5f0964cSRobert Mustacchi 		    "missing fields");
67*f5f0964cSRobert Mustacchi 		ret = EXIT_FAILURE;
68*f5f0964cSRobert Mustacchi 	} else if (!missing_field_err(ctrl, "fw commit request",
69*f5f0964cSRobert Mustacchi 	    NVME_ERR_FW_COMMIT_REQ_MISSING_FIELDS)) {
70*f5f0964cSRobert Mustacchi 		ret = EXIT_FAILURE;
71*f5f0964cSRobert Mustacchi 	} else {
72*f5f0964cSRobert Mustacchi 		(void) printf("TEST PASSED: fw commit request generated "
73*f5f0964cSRobert Mustacchi 		    "missing fields error\n");
74*f5f0964cSRobert Mustacchi 	}
75*f5f0964cSRobert Mustacchi 	nvme_fw_commit_req_fini(fw_commit_req);
76*f5f0964cSRobert Mustacchi 
77*f5f0964cSRobert Mustacchi 	if (!nvme_format_req_init(ctrl, &format_req)) {
78*f5f0964cSRobert Mustacchi 		if (nvme_ctrl_err(ctrl) == NVME_ERR_FORMAT_UNSUP_BY_DEV) {
79*f5f0964cSRobert Mustacchi 			warnx("TEST SKIPPED: device does not support format "
80*f5f0964cSRobert Mustacchi 			    "requests");
81*f5f0964cSRobert Mustacchi 		} else {
82*f5f0964cSRobert Mustacchi 			libnvme_test_ctrl_warn(ctrl, "failed to initialize "
83*f5f0964cSRobert Mustacchi 			    "format request");
84*f5f0964cSRobert Mustacchi 			ret = EXIT_FAILURE;
85*f5f0964cSRobert Mustacchi 		}
86*f5f0964cSRobert Mustacchi 	} else if (nvme_format_req_exec(format_req)) {
87*f5f0964cSRobert Mustacchi 		warnx("TEST FAILED: format request succeeded despite missing "
88*f5f0964cSRobert Mustacchi 		    "fields");
89*f5f0964cSRobert Mustacchi 		ret = EXIT_FAILURE;
90*f5f0964cSRobert Mustacchi 	} else if (!missing_field_err(ctrl, "format request",
91*f5f0964cSRobert Mustacchi 	    NVME_ERR_FORMAT_REQ_MISSING_FIELDS)) {
92*f5f0964cSRobert Mustacchi 		ret = EXIT_FAILURE;
93*f5f0964cSRobert Mustacchi 	} else {
94*f5f0964cSRobert Mustacchi 		(void) printf("TEST PASSED: format request generated missing "
95*f5f0964cSRobert Mustacchi 		    "fields error\n");
96*f5f0964cSRobert Mustacchi 	}
97*f5f0964cSRobert Mustacchi 	nvme_format_req_fini(format_req);
98*f5f0964cSRobert Mustacchi 
99*f5f0964cSRobert Mustacchi 	if (!nvme_ns_create_req_init_by_csi(ctrl, NVME_CSI_NVM, &create_req)) {
100*f5f0964cSRobert Mustacchi 		libnvme_test_ctrl_warn(ctrl, "failed to initialize namespace "
101*f5f0964cSRobert Mustacchi 		    "create request");
102*f5f0964cSRobert Mustacchi 		ret = EXIT_FAILURE;
103*f5f0964cSRobert Mustacchi 	} else if (nvme_ns_create_req_exec(create_req)) {
104*f5f0964cSRobert Mustacchi 		warnx("TEST FAILED: namespace create request succeeded despite "
105*f5f0964cSRobert Mustacchi 		    "missing fields");
106*f5f0964cSRobert Mustacchi 		ret = EXIT_FAILURE;
107*f5f0964cSRobert Mustacchi 	} else if (!missing_field_err(ctrl, "namespace create",
108*f5f0964cSRobert Mustacchi 	    NVME_ERR_NS_CREATE_REQ_MISSING_FIELDS)) {
109*f5f0964cSRobert Mustacchi 		ret = EXIT_FAILURE;
110*f5f0964cSRobert Mustacchi 	} else {
111*f5f0964cSRobert Mustacchi 		(void) printf("TEST PASSED: namespace create generated missing "
112*f5f0964cSRobert Mustacchi 		    "fields error\n");
113*f5f0964cSRobert Mustacchi 	}
114*f5f0964cSRobert Mustacchi 	nvme_ns_create_req_fini(create_req);
115*f5f0964cSRobert Mustacchi 
116*f5f0964cSRobert Mustacchi 	if (!nvme_ns_delete_req_init(ctrl, &delete_req)) {
117*f5f0964cSRobert Mustacchi 		libnvme_test_ctrl_warn(ctrl, "failed to initialize namespace "
118*f5f0964cSRobert Mustacchi 		    "delete request");
119*f5f0964cSRobert Mustacchi 		ret = EXIT_FAILURE;
120*f5f0964cSRobert Mustacchi 	} else if (nvme_ns_delete_req_exec(delete_req)) {
121*f5f0964cSRobert Mustacchi 		warnx("TEST FAILED: namespace delete request succeeded despite "
122*f5f0964cSRobert Mustacchi 		    "missing fields");
123*f5f0964cSRobert Mustacchi 		ret = EXIT_FAILURE;
124*f5f0964cSRobert Mustacchi 	} else if (!missing_field_err(ctrl, "namespace delete",
125*f5f0964cSRobert Mustacchi 	    NVME_ERR_NS_DELETE_REQ_MISSING_FIELDS)) {
126*f5f0964cSRobert Mustacchi 		ret = EXIT_FAILURE;
127*f5f0964cSRobert Mustacchi 	} else {
128*f5f0964cSRobert Mustacchi 		(void) printf("TEST PASSED: namespace delete generated missing "
129*f5f0964cSRobert Mustacchi 		    "fields error\n");
130*f5f0964cSRobert Mustacchi 	}
131*f5f0964cSRobert Mustacchi 	nvme_ns_delete_req_fini(delete_req);
132*f5f0964cSRobert Mustacchi 
133*f5f0964cSRobert Mustacchi 	if (!nvme_ns_attach_req_init_by_sel(ctrl, NVME_NS_ATTACH_CTRL_ATTACH,
134*f5f0964cSRobert Mustacchi 	    &attach_req)) {
135*f5f0964cSRobert Mustacchi 		libnvme_test_ctrl_warn(ctrl, "failed to initialize namespace "
136*f5f0964cSRobert Mustacchi 		    "attach request");
137*f5f0964cSRobert Mustacchi 		ret = EXIT_FAILURE;
138*f5f0964cSRobert Mustacchi 	} else if (nvme_ns_attach_req_exec(attach_req)) {
139*f5f0964cSRobert Mustacchi 		warnx("TEST FAILED: namespace attach request succeeded despite "
140*f5f0964cSRobert Mustacchi 		    "missing fields");
141*f5f0964cSRobert Mustacchi 		ret = EXIT_FAILURE;
142*f5f0964cSRobert Mustacchi 	} else if (!missing_field_err(ctrl, "namespace attach",
143*f5f0964cSRobert Mustacchi 	    NVME_ERR_NS_ATTACH_REQ_MISSING_FIELDS)) {
144*f5f0964cSRobert Mustacchi 		ret = EXIT_FAILURE;
145*f5f0964cSRobert Mustacchi 	} else {
146*f5f0964cSRobert Mustacchi 		(void) printf("TEST PASSED: namespace attach generated missing "
147*f5f0964cSRobert Mustacchi 		    "fields error\n");
148*f5f0964cSRobert Mustacchi 	}
149*f5f0964cSRobert Mustacchi 	nvme_ns_attach_req_fini(attach_req);
150*f5f0964cSRobert Mustacchi 
151*f5f0964cSRobert Mustacchi 	if (!nvme_ns_attach_req_init_by_sel(ctrl, NVME_NS_ATTACH_CTRL_DETACH,
152*f5f0964cSRobert Mustacchi 	    &attach_req)) {
153*f5f0964cSRobert Mustacchi 		libnvme_test_ctrl_warn(ctrl, "failed to initialize namespace "
154*f5f0964cSRobert Mustacchi 		    "detach request");
155*f5f0964cSRobert Mustacchi 		ret = EXIT_FAILURE;
156*f5f0964cSRobert Mustacchi 	} else if (nvme_ns_attach_req_exec(attach_req)) {
157*f5f0964cSRobert Mustacchi 		warnx("TEST FAILED: namespace detach request succeeded despite "
158*f5f0964cSRobert Mustacchi 		    "missing fields");
159*f5f0964cSRobert Mustacchi 		ret = EXIT_FAILURE;
160*f5f0964cSRobert Mustacchi 	} else if (!missing_field_err(ctrl, "namespace detach",
161*f5f0964cSRobert Mustacchi 	    NVME_ERR_NS_ATTACH_REQ_MISSING_FIELDS)) {
162*f5f0964cSRobert Mustacchi 		ret = EXIT_FAILURE;
163*f5f0964cSRobert Mustacchi 	} else {
164*f5f0964cSRobert Mustacchi 		(void) printf("TEST PASSED: namespace detach generated missing "
165*f5f0964cSRobert Mustacchi 		    "fields error\n");
166*f5f0964cSRobert Mustacchi 	}
167*f5f0964cSRobert Mustacchi 	nvme_ns_attach_req_fini(attach_req);
168*f5f0964cSRobert Mustacchi 
169*f5f0964cSRobert Mustacchi 
170*f5f0964cSRobert Mustacchi 
171*f5f0964cSRobert Mustacchi 	nvme_ctrl_fini(ctrl);
172*f5f0964cSRobert Mustacchi 	nvme_fini(nvme);
173*f5f0964cSRobert Mustacchi 
174*f5f0964cSRobert Mustacchi 	if (ret == EXIT_SUCCESS) {
175*f5f0964cSRobert Mustacchi 		(void) printf("All tests passed successfully\n");
176*f5f0964cSRobert Mustacchi 	}
177*f5f0964cSRobert Mustacchi 
178*f5f0964cSRobert Mustacchi 	return (ret);
179*f5f0964cSRobert Mustacchi }
180