1 /* 2 * This file and its contents are supplied under the terms of the 3 * Common Development and Distribution License ("CDDL"), version 1.0. 4 * You may only use this file in accordance with the terms of version 5 * 1.0 of the CDDL. 6 * 7 * A full copy of the text of the CDDL should have accompanied this 8 * source. A copy of the CDDL is also available via the Internet at 9 * http://www.illumos.org/license/CDDL. 10 */ 11 12 /* 13 * Copyright 2024 Oxide Computer Company 14 */ 15 16 /* 17 * Common utilities for libnvme tests. 18 */ 19 20 #include <err.h> 21 #include <stdlib.h> 22 23 #include "libnvme_test_common.h" 24 25 /* 26 * For any test linked against libumem, ensure that umem debugging is enabled by 27 * default. Many tests use umem_setmtbf() and we need to make sure there is no 28 * per-thread cache. 29 */ 30 const char * 31 _umem_debug_init(void) 32 { 33 return ("default,verbose"); 34 } 35 36 const char * 37 _umem_logging_init(void) 38 { 39 return ("fail,contents"); 40 } 41 42 static void 43 libnvme_test_hdl_vwarn(nvme_t *nvme, const char *fmt, va_list ap) 44 { 45 (void) fprintf(stderr, "TEST FAILED: "); 46 (void) vfprintf(stderr, fmt, ap); 47 (void) fprintf(stderr, ": %s: %s (libnvme: 0x%x, sys: %d)\n", 48 nvme_errmsg(nvme), nvme_errtostr(nvme, nvme_err(nvme)), 49 nvme_err(nvme), nvme_syserr(nvme)); 50 } 51 52 static void 53 libnvme_test_ctrl_vwarn(nvme_ctrl_t *ctrl, const char *fmt, va_list ap) 54 { 55 (void) fprintf(stderr, "TEST FAILED: "); 56 (void) vfprintf(stderr, fmt, ap); 57 (void) fprintf(stderr, ": %s: %s (libnvme: 0x%x, sys: %d)\n", 58 nvme_ctrl_errmsg(ctrl), nvme_ctrl_errtostr(ctrl, 59 nvme_ctrl_err(ctrl)), nvme_ctrl_err(ctrl), nvme_ctrl_syserr(ctrl)); 60 } 61 62 static void 63 libnvme_test_ctrl_info_vwarn(nvme_ctrl_info_t *info, const char *fmt, 64 va_list ap) 65 { 66 (void) fprintf(stderr, "TEST FAILED: "); 67 (void) vfprintf(stderr, fmt, ap); 68 (void) fprintf(stderr, ": %s: %s (libnvme info: 0x%x, sys: %d)\n", 69 nvme_ctrl_info_errmsg(info), nvme_ctrl_info_errtostr(info, 70 nvme_ctrl_info_err(info)), nvme_ctrl_info_err(info), 71 nvme_ctrl_info_syserr(info)); 72 } 73 74 static void 75 libnvme_test_ns_info_vwarn(nvme_ns_info_t *info, const char *fmt, 76 va_list ap) 77 { 78 (void) fprintf(stderr, "TEST FAILED: "); 79 (void) vfprintf(stderr, fmt, ap); 80 (void) fprintf(stderr, ": %s: %s (libnvme info: 0x%x, sys: %d)\n", 81 nvme_ns_info_errmsg(info), nvme_ns_info_errtostr(info, 82 nvme_ns_info_err(info)), nvme_ns_info_err(info), 83 nvme_ns_info_syserr(info)); 84 } 85 86 void 87 libnvme_test_hdl_warn(nvme_t *nvme, const char *fmt, ...) 88 { 89 va_list ap; 90 91 va_start(ap, fmt); 92 libnvme_test_hdl_vwarn(nvme, fmt, ap); 93 va_end(ap); 94 } 95 96 void __NORETURN 97 libnvme_test_hdl_fatal(nvme_t *nvme, const char *fmt, ...) 98 { 99 va_list ap; 100 101 va_start(ap, fmt); 102 libnvme_test_hdl_vwarn(nvme, fmt, ap); 103 va_end(ap); 104 105 exit(EXIT_FAILURE); 106 } 107 108 void 109 libnvme_test_ctrl_warn(nvme_ctrl_t *ctrl, const char *fmt, ...) 110 { 111 va_list ap; 112 113 va_start(ap, fmt); 114 libnvme_test_ctrl_vwarn(ctrl, fmt, ap); 115 va_end(ap); 116 } 117 118 void __NORETURN 119 libnvme_test_ctrl_fatal(nvme_ctrl_t *ctrl, const char *fmt, ...) 120 { 121 va_list ap; 122 123 va_start(ap, fmt); 124 libnvme_test_ctrl_vwarn(ctrl, fmt, ap); 125 va_end(ap); 126 127 exit(EXIT_FAILURE); 128 } 129 130 void 131 libnvme_test_ctrl_info_warn(nvme_ctrl_info_t *info, const char *fmt, ...) 132 { 133 va_list ap; 134 135 va_start(ap, fmt); 136 libnvme_test_ctrl_info_vwarn(info, fmt, ap); 137 va_end(ap); 138 } 139 140 void 141 libnvme_test_ns_info_warn(nvme_ns_info_t *info, const char *fmt, ...) 142 { 143 va_list ap; 144 145 va_start(ap, fmt); 146 libnvme_test_ns_info_vwarn(info, fmt, ap); 147 va_end(ap); 148 } 149 150 void __NORETURN 151 libnvme_test_ctrl_info_fatal(nvme_ctrl_info_t *info, const char *fmt, ...) 152 { 153 va_list ap; 154 155 va_start(ap, fmt); 156 libnvme_test_ctrl_info_vwarn(info, fmt, ap); 157 va_end(ap); 158 159 exit(EXIT_FAILURE); 160 } 161 162 void 163 libnvme_test_init(nvme_t **nvmep, nvme_ctrl_t **ctrlp) 164 { 165 nvme_t *nvme; 166 nvme_ctrl_t *ctrl; 167 const char *dev; 168 169 nvme = nvme_init(); 170 if (nvme == NULL) { 171 err(EXIT_FAILURE, "failed to create libnvme handle"); 172 } 173 174 dev = getenv(NVME_TEST_DEV_ENVVAR); 175 if (dev == NULL) { 176 errx(EXIT_FAILURE, "cannot run test, missing required NVMe " 177 "device, please set the %s environment variable", 178 NVME_TEST_DEV_ENVVAR); 179 } 180 181 if (!nvme_ctrl_ns_init(nvme, dev, &ctrl, NULL)) { 182 libnvme_test_hdl_fatal(nvme, "failed to open %s", dev); 183 } 184 185 *nvmep = nvme; 186 *ctrlp = ctrl; 187 } 188