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 * Verify the basics of the common NVMe version interfaces. 18 */ 19 20 #include <err.h> 21 #include <stdbool.h> 22 #include <stddef.h> 23 #include <sys/sysmacros.h> 24 #include <stdlib.h> 25 26 #include <nvme_common.h> 27 28 int vers_exit = EXIT_SUCCESS; 29 30 /* 31 * Each tests asks is the version nvt_dev >= nvt_targ. 32 */ 33 typedef struct nvme_version_test { 34 const nvme_version_t *nvt_dev; 35 const nvme_version_t *nvt_targ; 36 bool nvt_pass; 37 const char *nvt_desc; 38 } nvme_version_test_t; 39 40 static const nvme_version_test_t vers_tests[] = { 41 { &nvme_vers_1v0, &nvme_vers_1v0, true, "same version (1.0)" }, 42 { &nvme_vers_1v1, &nvme_vers_1v1, true, "same version (1.1)" }, 43 { &nvme_vers_1v2, &nvme_vers_1v2, true, "same version (1.2)" }, 44 { &nvme_vers_1v3, &nvme_vers_1v3, true, "same version (1.3)" }, 45 { &nvme_vers_1v4, &nvme_vers_1v4, true, "same version (1.4)" }, 46 { &nvme_vers_2v0, &nvme_vers_2v0, true, "same version (2.0)" }, 47 { &nvme_vers_2v0, &nvme_vers_1v0, true, "greater major, same minor" }, 48 { &nvme_vers_2v0, &nvme_vers_1v1, true, "greater major, lesser minor" }, 49 { &nvme_vers_2v0, &nvme_vers_1v3, true, "greater major, lesser minor" }, 50 { &nvme_vers_1v2, &nvme_vers_1v0, true, "same major, greater minor " 51 "(1)" }, 52 { &nvme_vers_1v2, &nvme_vers_1v1, true, "same major, greater minor " 53 "(2)" }, 54 { &nvme_vers_1v4, &nvme_vers_1v0, true, "same major, greater minor " 55 "(3)" }, 56 { &nvme_vers_1v4, &nvme_vers_1v2, true, "same major, greater minor " 57 "(4)" }, 58 { &nvme_vers_1v0, &nvme_vers_1v4, false, "same major, lesser minor " 59 "(1)" }, 60 { &nvme_vers_1v1, &nvme_vers_1v4, false, "same major, lesser minor " 61 "(2)" }, 62 { &nvme_vers_1v3, &nvme_vers_1v4, false, "same major, lesser minor " 63 "(3)" }, 64 { &nvme_vers_1v4, &nvme_vers_2v0, false, "lesser major, greater minor " 65 "(1)" }, 66 { &nvme_vers_1v3, &nvme_vers_2v0, false, "lesser major, greater minor " 67 "(2)" }, 68 { &nvme_vers_1v2, &nvme_vers_2v0, false, "lesser major, greater minor " 69 "(3)" }, 70 { &nvme_vers_1v1, &nvme_vers_2v0, false, "lesser major, greater minor " 71 "(4)" }, 72 { &nvme_vers_1v0, &nvme_vers_2v0, false, "lesser major, same minor" }, 73 }; 74 75 static bool 76 vers_test_one(const nvme_version_test_t *test) 77 { 78 bool res = nvme_vers_atleast(test->nvt_dev, test->nvt_targ); 79 if (res != test->nvt_pass) { 80 const char *rstr = res ? "passed" : "failed"; 81 82 warnx("TEST FAILED: %s (%u.%u >= %u.%u) erroneously %s", 83 test->nvt_desc, test->nvt_dev->v_major, 84 test->nvt_dev->v_minor, test->nvt_targ->v_major, 85 test->nvt_targ->v_minor, rstr); 86 return (false); 87 } else { 88 (void) printf("TEST PASSED: %s\n", test->nvt_desc); 89 return (true); 90 } 91 } 92 93 int 94 main(void) 95 { 96 int ret = EXIT_SUCCESS; 97 98 for (size_t i = 0; i < ARRAY_SIZE(vers_tests); i++) { 99 if (!vers_test_one(&vers_tests[i])) { 100 ret = EXIT_FAILURE; 101 } 102 } 103 104 if (ret == EXIT_SUCCESS) { 105 (void) printf("All tests passed successfully!\n"); 106 } 107 108 return (ret); 109 } 110