1 /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */ 2 /* Test pldm_msgbuf_extract() separately because we can't do _Generic() in C++ 3 * code, i.e. gtest */ 4 5 #include <endian.h> 6 #include <float.h> 7 #include <stdio.h> 8 #include <stdlib.h> 9 10 /* We're exercising the implementation so disable the asserts for now */ 11 #ifndef NDEBUG 12 #define NDEBUG 1 13 #endif 14 #include "msgbuf.h" 15 16 /* Given we disabled asserts above, set up our own expectation framework */ 17 #define expect(cond) __expect(__func__, __LINE__, (cond)) 18 #define __expect(fn, line, cond) \ 19 do \ 20 { \ 21 if (!(cond)) \ 22 { \ 23 fprintf(stderr, "%s:%d: failed expectation: %s\n", fn, line, \ 24 #cond); \ 25 exit(EXIT_FAILURE); \ 26 } \ 27 } while (0) 28 29 static void test_msgbuf_extract_generic_uint8(void) 30 { 31 struct pldm_msgbuf _ctx; 32 struct pldm_msgbuf* ctx = &_ctx; 33 uint8_t buf[1] = {0xa5}; 34 uint8_t val; 35 36 expect(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)) == 37 PLDM_SUCCESS); 38 expect(pldm_msgbuf_extract(ctx, &val) == PLDM_SUCCESS); 39 expect(val == 0xa5); 40 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS); 41 } 42 43 static void test_msgbuf_extract_generic_int8(void) 44 { 45 struct pldm_msgbuf _ctx; 46 struct pldm_msgbuf* ctx = &_ctx; 47 int8_t buf[1] = {-1}; 48 int8_t val; 49 50 expect(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)) == 51 PLDM_SUCCESS); 52 expect(pldm_msgbuf_extract(ctx, &val) == PLDM_SUCCESS); 53 expect(val == -1); 54 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS); 55 } 56 57 static void test_msgbuf_extract_generic_uint16(void) 58 { 59 struct pldm_msgbuf _ctx; 60 struct pldm_msgbuf* ctx = &_ctx; 61 uint16_t buf[1] = {0x5aa5}; 62 uint16_t val; 63 64 expect(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)) == 65 PLDM_SUCCESS); 66 expect(pldm_msgbuf_extract(ctx, &val) == PLDM_SUCCESS); 67 expect(val == 0x5aa5); 68 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS); 69 } 70 71 static void test_msgbuf_extract_generic_int16(void) 72 { 73 struct pldm_msgbuf _ctx; 74 struct pldm_msgbuf* ctx = &_ctx; 75 int16_t buf[1] = {(int16_t)(htole16((uint16_t)INT16_MIN))}; 76 int16_t val; 77 78 expect(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)) == 79 PLDM_SUCCESS); 80 expect(pldm_msgbuf_extract(ctx, &val) == PLDM_SUCCESS); 81 expect(val == INT16_MIN); 82 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS); 83 } 84 85 static void test_msgbuf_extract_generic_uint32(void) 86 { 87 struct pldm_msgbuf _ctx; 88 struct pldm_msgbuf* ctx = &_ctx; 89 uint32_t buf[1] = {0x5a00ffa5}; 90 uint32_t val; 91 92 expect(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)) == 93 PLDM_SUCCESS); 94 expect(pldm_msgbuf_extract(ctx, &val) == PLDM_SUCCESS); 95 expect(val == 0x5a00ffa5); 96 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS); 97 } 98 99 static void test_msgbuf_extract_generic_int32(void) 100 { 101 struct pldm_msgbuf _ctx; 102 struct pldm_msgbuf* ctx = &_ctx; 103 int32_t buf[1] = {(int32_t)(htole32((uint32_t)INT32_MIN))}; 104 int32_t val; 105 106 expect(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)) == 107 PLDM_SUCCESS); 108 expect(pldm_msgbuf_extract(ctx, &val) == PLDM_SUCCESS); 109 expect(val == INT32_MIN); 110 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS); 111 } 112 113 static void test_msgbuf_extract_generic_real32(void) 114 { 115 struct pldm_msgbuf _ctx; 116 struct pldm_msgbuf* ctx = &_ctx; 117 uint32_t buf[1]; 118 uint32_t xform; 119 real32_t val; 120 121 val = FLT_MAX; 122 memcpy(&xform, &val, sizeof(val)); 123 buf[0] = htole32(xform); 124 val = 0; 125 126 expect(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)) == 127 PLDM_SUCCESS); 128 expect(pldm_msgbuf_extract(ctx, &val) == PLDM_SUCCESS); 129 expect(val == FLT_MAX); 130 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS); 131 } 132 133 static void test_msgbuf_extract_array_generic_uint8(void) 134 { 135 struct pldm_msgbuf _ctx; 136 struct pldm_msgbuf* ctx = &_ctx; 137 uint32_t buf[1] = {0}; 138 uint8_t arr[1]; 139 140 expect(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)) == 141 PLDM_SUCCESS); 142 expect(pldm_msgbuf_extract_array(ctx, arr, 1) == PLDM_SUCCESS); 143 expect(arr[0] == 0); 144 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS); 145 } 146 147 static void test_msgbuf_insert_generic_int32(void) 148 { 149 struct pldm_msgbuf _ctx; 150 struct pldm_msgbuf* ctx = &_ctx; 151 int32_t src = -12345; 152 int32_t checkVal = 0; 153 uint8_t buf[sizeof(int32_t)] = {0}; 154 155 expect(pldm_msgbuf_init(ctx, 0, buf, sizeof(buf)) == PLDM_SUCCESS); 156 expect(pldm_msgbuf_insert(ctx, src) == PLDM_SUCCESS); 157 158 struct pldm_msgbuf _ctxExtract; 159 struct pldm_msgbuf* ctxExtract = &_ctxExtract; 160 161 expect(pldm_msgbuf_init(ctxExtract, 0, buf, sizeof(buf)) == PLDM_SUCCESS); 162 expect(pldm_msgbuf_extract(ctxExtract, &checkVal) == PLDM_SUCCESS); 163 164 expect(src == checkVal); 165 expect(pldm_msgbuf_destroy(ctxExtract) == PLDM_SUCCESS); 166 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS); 167 } 168 169 static void test_msgbuf_insert_generic_uint32(void) 170 { 171 struct pldm_msgbuf _ctx; 172 struct pldm_msgbuf* ctx = &_ctx; 173 uint32_t src = 0xf1223344; 174 uint32_t checkVal = 0; 175 uint8_t buf[sizeof(uint32_t)] = {0}; 176 177 expect(pldm_msgbuf_init(ctx, 0, buf, sizeof(buf)) == PLDM_SUCCESS); 178 expect(pldm_msgbuf_insert(ctx, src) == PLDM_SUCCESS); 179 180 struct pldm_msgbuf _ctxExtract; 181 struct pldm_msgbuf* ctxExtract = &_ctxExtract; 182 183 expect(pldm_msgbuf_init(ctxExtract, 0, buf, sizeof(buf)) == PLDM_SUCCESS); 184 expect(pldm_msgbuf_extract(ctxExtract, &checkVal) == PLDM_SUCCESS); 185 186 expect(src == checkVal); 187 expect(pldm_msgbuf_destroy(ctxExtract) == PLDM_SUCCESS); 188 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS); 189 } 190 191 static void test_msgbuf_insert_generic_uint16(void) 192 { 193 struct pldm_msgbuf _ctx; 194 struct pldm_msgbuf* ctx = &_ctx; 195 uint16_t src = 0xf344; 196 uint16_t checkVal = 0; 197 uint8_t buf[sizeof(uint16_t)] = {0}; 198 199 expect(pldm_msgbuf_init(ctx, 0, buf, sizeof(uint16_t)) == PLDM_SUCCESS); 200 expect(pldm_msgbuf_insert(ctx, src) == PLDM_SUCCESS); 201 202 struct pldm_msgbuf _ctxExtract; 203 struct pldm_msgbuf* ctxExtract = &_ctxExtract; 204 205 expect(pldm_msgbuf_init(ctxExtract, 0, buf, sizeof(buf)) == PLDM_SUCCESS); 206 expect(pldm_msgbuf_extract(ctxExtract, &checkVal) == PLDM_SUCCESS); 207 208 expect(src == checkVal); 209 expect(pldm_msgbuf_destroy(ctxExtract) == PLDM_SUCCESS); 210 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS); 211 } 212 213 static void test_msgbuf_insert_generic_int16(void) 214 { 215 struct pldm_msgbuf _ctx; 216 struct pldm_msgbuf* ctx = &_ctx; 217 int16_t src = -12; 218 int16_t checkVal = 0; 219 uint8_t buf[sizeof(int16_t)] = {0}; 220 221 expect(pldm_msgbuf_init(ctx, 0, buf, sizeof(uint16_t)) == PLDM_SUCCESS); 222 expect(pldm_msgbuf_insert(ctx, src) == PLDM_SUCCESS); 223 224 struct pldm_msgbuf _ctxExtract; 225 struct pldm_msgbuf* ctxExtract = &_ctxExtract; 226 227 expect(pldm_msgbuf_init(ctxExtract, 0, buf, sizeof(buf)) == PLDM_SUCCESS); 228 expect(pldm_msgbuf_extract(ctxExtract, &checkVal) == PLDM_SUCCESS); 229 230 expect(src == checkVal); 231 expect(pldm_msgbuf_destroy(ctxExtract) == PLDM_SUCCESS); 232 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS); 233 } 234 235 static void test_msgbuf_insert_generic_uint8(void) 236 { 237 struct pldm_msgbuf _ctx; 238 struct pldm_msgbuf* ctx = &_ctx; 239 uint8_t src = 0xf4; 240 uint8_t checkVal = 0; 241 uint8_t buf[sizeof(uint8_t)] = {0}; 242 243 expect(pldm_msgbuf_init(ctx, 0, buf, sizeof(buf)) == PLDM_SUCCESS); 244 expect(pldm_msgbuf_insert(ctx, src) == PLDM_SUCCESS); 245 246 struct pldm_msgbuf _ctxExtract; 247 struct pldm_msgbuf* ctxExtract = &_ctxExtract; 248 249 expect(pldm_msgbuf_init(ctxExtract, 0, buf, sizeof(buf)) == PLDM_SUCCESS); 250 expect(pldm_msgbuf_extract(ctxExtract, &checkVal) == PLDM_SUCCESS); 251 252 expect(src == checkVal); 253 expect(pldm_msgbuf_destroy(ctxExtract) == PLDM_SUCCESS); 254 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS); 255 } 256 257 static void test_msgbuf_insert_generic_int8(void) 258 { 259 struct pldm_msgbuf _ctx; 260 struct pldm_msgbuf* ctx = &_ctx; 261 int8_t src = -4; 262 int8_t checkVal = 0; 263 uint8_t buf[sizeof(int8_t)] = {0}; 264 265 expect(pldm_msgbuf_init(ctx, 0, buf, sizeof(buf)) == PLDM_SUCCESS); 266 expect(pldm_msgbuf_insert(ctx, src) == PLDM_SUCCESS); 267 268 struct pldm_msgbuf _ctxExtract; 269 struct pldm_msgbuf* ctxExtract = &_ctxExtract; 270 271 expect(pldm_msgbuf_init(ctxExtract, 0, buf, sizeof(buf)) == PLDM_SUCCESS); 272 expect(pldm_msgbuf_extract(ctxExtract, &checkVal) == PLDM_SUCCESS); 273 274 expect(src == checkVal); 275 expect(pldm_msgbuf_destroy(ctxExtract) == PLDM_SUCCESS); 276 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS); 277 } 278 279 static void test_msgbuf_insert_array_generic_uint8(void) 280 { 281 struct pldm_msgbuf _ctx; 282 struct pldm_msgbuf* ctx = &_ctx; 283 uint8_t src[6] = {0x11, 0x22, 0x44, 0x55, 0x66, 0x77}; 284 uint8_t buf[6] = {0}; 285 uint8_t retBuff[6] = {0}; 286 287 expect(pldm_msgbuf_init(ctx, 0, buf, sizeof(buf)) == PLDM_SUCCESS); 288 expect(pldm_msgbuf_insert_array(ctx, src, sizeof(src)) == PLDM_SUCCESS); 289 290 struct pldm_msgbuf _ctxExtract; 291 struct pldm_msgbuf* ctxExtract = &_ctxExtract; 292 293 expect(pldm_msgbuf_init(ctxExtract, 0, buf, sizeof(buf)) == PLDM_SUCCESS); 294 expect(pldm_msgbuf_extract_array(ctxExtract, retBuff, sizeof(retBuff)) == 295 PLDM_SUCCESS); 296 297 expect(memcmp(src, retBuff, sizeof(retBuff)) == 0); 298 expect(pldm_msgbuf_destroy(ctxExtract) == PLDM_SUCCESS); 299 expect(pldm_msgbuf_destroy(ctx) == PLDM_SUCCESS); 300 } 301 302 typedef void (*testfn)(void); 303 304 static const testfn tests[] = {test_msgbuf_extract_generic_uint8, 305 test_msgbuf_extract_generic_int8, 306 test_msgbuf_extract_generic_uint16, 307 test_msgbuf_extract_generic_int16, 308 test_msgbuf_extract_generic_uint32, 309 test_msgbuf_extract_generic_int32, 310 test_msgbuf_extract_generic_real32, 311 test_msgbuf_extract_array_generic_uint8, 312 test_msgbuf_insert_generic_uint8, 313 test_msgbuf_insert_generic_int8, 314 test_msgbuf_insert_generic_uint16, 315 test_msgbuf_insert_generic_int16, 316 test_msgbuf_insert_generic_uint32, 317 test_msgbuf_insert_generic_int32, 318 test_msgbuf_insert_array_generic_uint8, 319 NULL}; 320 321 int main(void) 322 { 323 testfn const* testp = &tests[0]; 324 325 while (*testp) 326 { 327 (*testp)(); 328 testp++; 329 } 330 331 return 0; 332 } 333