1*c63f63a2SAndrew Jeffery #include <endian.h> 2*c63f63a2SAndrew Jeffery 3*c63f63a2SAndrew Jeffery #include <cfloat> 4*c63f63a2SAndrew Jeffery 5*c63f63a2SAndrew Jeffery #include <gtest/gtest.h> 6*c63f63a2SAndrew Jeffery 7*c63f63a2SAndrew Jeffery /* We're exercising the implementation so disable the asserts for now */ 8*c63f63a2SAndrew Jeffery #ifndef NDEBUG 9*c63f63a2SAndrew Jeffery #define NDEBUG 1 10*c63f63a2SAndrew Jeffery #endif 11*c63f63a2SAndrew Jeffery 12*c63f63a2SAndrew Jeffery /* 13*c63f63a2SAndrew Jeffery * Fix up C11's _Static_assert() vs C++'s static_assert(). 14*c63f63a2SAndrew Jeffery * 15*c63f63a2SAndrew Jeffery * Can we please have nice things for once. 16*c63f63a2SAndrew Jeffery */ 17*c63f63a2SAndrew Jeffery #ifdef __cplusplus 18*c63f63a2SAndrew Jeffery // NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp) 19*c63f63a2SAndrew Jeffery #define _Static_assert(...) static_assert(__VA_ARGS__) 20*c63f63a2SAndrew Jeffery #endif 21*c63f63a2SAndrew Jeffery 22*c63f63a2SAndrew Jeffery #include "msgbuf.h" 23*c63f63a2SAndrew Jeffery 24*c63f63a2SAndrew Jeffery TEST(msgbuf, init_bad_ctx) 25*c63f63a2SAndrew Jeffery { 26*c63f63a2SAndrew Jeffery EXPECT_NE(pldm_msgbuf_init(NULL, 0, NULL, 0), PLDM_SUCCESS); 27*c63f63a2SAndrew Jeffery } 28*c63f63a2SAndrew Jeffery 29*c63f63a2SAndrew Jeffery TEST(msgbuf, init_bad_minsize) 30*c63f63a2SAndrew Jeffery { 31*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 32*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 33*c63f63a2SAndrew Jeffery uint8_t buf[1] = {}; 34*c63f63a2SAndrew Jeffery 35*c63f63a2SAndrew Jeffery EXPECT_NE(pldm_msgbuf_init(ctx, sizeof(buf) + 1U, buf, sizeof(buf)), 36*c63f63a2SAndrew Jeffery PLDM_SUCCESS); 37*c63f63a2SAndrew Jeffery } 38*c63f63a2SAndrew Jeffery 39*c63f63a2SAndrew Jeffery TEST(msgbuf, init_bad_buf) 40*c63f63a2SAndrew Jeffery { 41*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 42*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 43*c63f63a2SAndrew Jeffery 44*c63f63a2SAndrew Jeffery EXPECT_NE(pldm_msgbuf_init(ctx, 0, NULL, 0), PLDM_SUCCESS); 45*c63f63a2SAndrew Jeffery } 46*c63f63a2SAndrew Jeffery 47*c63f63a2SAndrew Jeffery TEST(msgbuf, init_bad_len) 48*c63f63a2SAndrew Jeffery { 49*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 50*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 51*c63f63a2SAndrew Jeffery uint8_t buf[1] = {}; 52*c63f63a2SAndrew Jeffery 53*c63f63a2SAndrew Jeffery EXPECT_NE(pldm_msgbuf_init(ctx, sizeof(buf), buf, SIZE_MAX), PLDM_SUCCESS); 54*c63f63a2SAndrew Jeffery } 55*c63f63a2SAndrew Jeffery 56*c63f63a2SAndrew Jeffery TEST(msgbuf, init_overflow) 57*c63f63a2SAndrew Jeffery { 58*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 59*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 60*c63f63a2SAndrew Jeffery // This is an intrinsic part of the test. 61*c63f63a2SAndrew Jeffery // NOLINTNEXTLINE(performance-no-int-to-ptr) 62*c63f63a2SAndrew Jeffery uint8_t* buf = (uint8_t*)SIZE_MAX; 63*c63f63a2SAndrew Jeffery 64*c63f63a2SAndrew Jeffery EXPECT_NE(pldm_msgbuf_init(ctx, 0, buf, 2), PLDM_SUCCESS); 65*c63f63a2SAndrew Jeffery } 66*c63f63a2SAndrew Jeffery 67*c63f63a2SAndrew Jeffery TEST(msgbuf, init_success) 68*c63f63a2SAndrew Jeffery { 69*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 70*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 71*c63f63a2SAndrew Jeffery uint8_t buf[1] = {}; 72*c63f63a2SAndrew Jeffery 73*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)), 74*c63f63a2SAndrew Jeffery PLDM_SUCCESS); 75*c63f63a2SAndrew Jeffery } 76*c63f63a2SAndrew Jeffery 77*c63f63a2SAndrew Jeffery TEST(msgbuf, destroy_none) 78*c63f63a2SAndrew Jeffery { 79*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 80*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 81*c63f63a2SAndrew Jeffery uint8_t buf[1] = {}; 82*c63f63a2SAndrew Jeffery 83*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)), 84*c63f63a2SAndrew Jeffery PLDM_SUCCESS); 85*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS); 86*c63f63a2SAndrew Jeffery } 87*c63f63a2SAndrew Jeffery 88*c63f63a2SAndrew Jeffery TEST(msgbuf, destroy_exact) 89*c63f63a2SAndrew Jeffery { 90*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 91*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 92*c63f63a2SAndrew Jeffery uint8_t buf[1] = {0xa5}; 93*c63f63a2SAndrew Jeffery uint8_t val; 94*c63f63a2SAndrew Jeffery 95*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)), 96*c63f63a2SAndrew Jeffery PLDM_SUCCESS); 97*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_extract_uint8(ctx, &val), PLDM_SUCCESS); 98*c63f63a2SAndrew Jeffery EXPECT_EQ(val, 0xa5); 99*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS); 100*c63f63a2SAndrew Jeffery } 101*c63f63a2SAndrew Jeffery 102*c63f63a2SAndrew Jeffery TEST(msgbuf, destroy_over) 103*c63f63a2SAndrew Jeffery { 104*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 105*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 106*c63f63a2SAndrew Jeffery uint8_t buf[1] = {0xa5}; 107*c63f63a2SAndrew Jeffery uint8_t val; 108*c63f63a2SAndrew Jeffery 109*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)), 110*c63f63a2SAndrew Jeffery PLDM_SUCCESS); 111*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_extract_uint8(ctx, &val), PLDM_SUCCESS); 112*c63f63a2SAndrew Jeffery ASSERT_EQ(val, 0xa5); 113*c63f63a2SAndrew Jeffery EXPECT_NE(pldm_msgbuf_extract_uint8(ctx, &val), PLDM_SUCCESS); 114*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH); 115*c63f63a2SAndrew Jeffery } 116*c63f63a2SAndrew Jeffery 117*c63f63a2SAndrew Jeffery TEST(msgbuf, destroy_under) 118*c63f63a2SAndrew Jeffery { 119*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 120*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 121*c63f63a2SAndrew Jeffery uint8_t buf[2] = {0x5a, 0xa5}; 122*c63f63a2SAndrew Jeffery uint8_t val; 123*c63f63a2SAndrew Jeffery 124*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)), 125*c63f63a2SAndrew Jeffery PLDM_SUCCESS); 126*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_extract_uint8(ctx, &val), PLDM_SUCCESS); 127*c63f63a2SAndrew Jeffery EXPECT_EQ(val, 0x5a); 128*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS); 129*c63f63a2SAndrew Jeffery } 130*c63f63a2SAndrew Jeffery 131*c63f63a2SAndrew Jeffery TEST(msgbuf, extract_one_uint8) 132*c63f63a2SAndrew Jeffery { 133*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 134*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 135*c63f63a2SAndrew Jeffery uint8_t buf[1] = {0xa5}; 136*c63f63a2SAndrew Jeffery uint8_t val; 137*c63f63a2SAndrew Jeffery 138*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)), 139*c63f63a2SAndrew Jeffery PLDM_SUCCESS); 140*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_extract_uint8(ctx, &val), PLDM_SUCCESS); 141*c63f63a2SAndrew Jeffery EXPECT_EQ(val, 0xa5); 142*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS); 143*c63f63a2SAndrew Jeffery } 144*c63f63a2SAndrew Jeffery 145*c63f63a2SAndrew Jeffery TEST(msgbuf, extract_over_uint8) 146*c63f63a2SAndrew Jeffery { 147*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 148*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 149*c63f63a2SAndrew Jeffery uint8_t buf[1] = {}; 150*c63f63a2SAndrew Jeffery uint8_t val; 151*c63f63a2SAndrew Jeffery 152*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, 0, buf, 0), PLDM_SUCCESS); 153*c63f63a2SAndrew Jeffery EXPECT_NE(pldm_msgbuf_extract_uint8(ctx, &val), PLDM_SUCCESS); 154*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH); 155*c63f63a2SAndrew Jeffery } 156*c63f63a2SAndrew Jeffery 157*c63f63a2SAndrew Jeffery TEST(msgbuf, extract_one_int8) 158*c63f63a2SAndrew Jeffery { 159*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 160*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 161*c63f63a2SAndrew Jeffery int8_t buf[1] = {-1}; 162*c63f63a2SAndrew Jeffery int8_t val; 163*c63f63a2SAndrew Jeffery 164*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)), 165*c63f63a2SAndrew Jeffery PLDM_SUCCESS); 166*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_extract_int8(ctx, &val), PLDM_SUCCESS); 167*c63f63a2SAndrew Jeffery EXPECT_EQ(val, -1); 168*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS); 169*c63f63a2SAndrew Jeffery } 170*c63f63a2SAndrew Jeffery 171*c63f63a2SAndrew Jeffery TEST(msgbuf, extract_over_int8) 172*c63f63a2SAndrew Jeffery { 173*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 174*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 175*c63f63a2SAndrew Jeffery int8_t buf[1] = {}; 176*c63f63a2SAndrew Jeffery int8_t val; 177*c63f63a2SAndrew Jeffery 178*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, 0, buf, 0), PLDM_SUCCESS); 179*c63f63a2SAndrew Jeffery EXPECT_NE(pldm_msgbuf_extract_int8(ctx, &val), PLDM_SUCCESS); 180*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH); 181*c63f63a2SAndrew Jeffery } 182*c63f63a2SAndrew Jeffery 183*c63f63a2SAndrew Jeffery TEST(msgbuf, extract_one_uint16) 184*c63f63a2SAndrew Jeffery { 185*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 186*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 187*c63f63a2SAndrew Jeffery uint16_t buf[1] = {htole16(0x5aa5)}; 188*c63f63a2SAndrew Jeffery uint16_t val = {}; 189*c63f63a2SAndrew Jeffery 190*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)), 191*c63f63a2SAndrew Jeffery PLDM_SUCCESS); 192*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_extract_uint16(ctx, &val), PLDM_SUCCESS); 193*c63f63a2SAndrew Jeffery EXPECT_EQ(val, 0x5aa5); 194*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS); 195*c63f63a2SAndrew Jeffery } 196*c63f63a2SAndrew Jeffery 197*c63f63a2SAndrew Jeffery TEST(msgbuf, extract_over_uint16) 198*c63f63a2SAndrew Jeffery { 199*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 200*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 201*c63f63a2SAndrew Jeffery uint16_t buf[1] = {}; 202*c63f63a2SAndrew Jeffery uint16_t val; 203*c63f63a2SAndrew Jeffery 204*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, 0, buf, 0), PLDM_SUCCESS); 205*c63f63a2SAndrew Jeffery EXPECT_NE(pldm_msgbuf_extract_uint16(ctx, &val), PLDM_SUCCESS); 206*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH); 207*c63f63a2SAndrew Jeffery } 208*c63f63a2SAndrew Jeffery 209*c63f63a2SAndrew Jeffery TEST(msgbuf, extract_one_int16) 210*c63f63a2SAndrew Jeffery { 211*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 212*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 213*c63f63a2SAndrew Jeffery int16_t buf[1] = {(int16_t)(htole16((uint16_t)INT16_MIN))}; 214*c63f63a2SAndrew Jeffery int16_t val; 215*c63f63a2SAndrew Jeffery 216*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)), 217*c63f63a2SAndrew Jeffery PLDM_SUCCESS); 218*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_extract_int16(ctx, &val), PLDM_SUCCESS); 219*c63f63a2SAndrew Jeffery EXPECT_EQ(val, INT16_MIN); 220*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS); 221*c63f63a2SAndrew Jeffery } 222*c63f63a2SAndrew Jeffery 223*c63f63a2SAndrew Jeffery TEST(msgbuf, extract_over_int16) 224*c63f63a2SAndrew Jeffery { 225*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 226*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 227*c63f63a2SAndrew Jeffery int16_t buf[1] = {}; 228*c63f63a2SAndrew Jeffery int16_t val; 229*c63f63a2SAndrew Jeffery 230*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, 0, buf, 0), PLDM_SUCCESS); 231*c63f63a2SAndrew Jeffery EXPECT_NE(pldm_msgbuf_extract_int16(ctx, &val), PLDM_SUCCESS); 232*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH); 233*c63f63a2SAndrew Jeffery } 234*c63f63a2SAndrew Jeffery 235*c63f63a2SAndrew Jeffery TEST(msgbuf, extract_one_uint32) 236*c63f63a2SAndrew Jeffery { 237*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 238*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 239*c63f63a2SAndrew Jeffery uint32_t buf[1] = {htole32(0x5a00ffa5)}; 240*c63f63a2SAndrew Jeffery uint32_t val; 241*c63f63a2SAndrew Jeffery 242*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)), 243*c63f63a2SAndrew Jeffery PLDM_SUCCESS); 244*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_extract_uint32(ctx, &val), PLDM_SUCCESS); 245*c63f63a2SAndrew Jeffery EXPECT_EQ(val, 0x5a00ffa5); 246*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS); 247*c63f63a2SAndrew Jeffery } 248*c63f63a2SAndrew Jeffery 249*c63f63a2SAndrew Jeffery TEST(msgbuf, extract_over_uint32) 250*c63f63a2SAndrew Jeffery { 251*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 252*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 253*c63f63a2SAndrew Jeffery uint32_t buf[1] = {}; 254*c63f63a2SAndrew Jeffery uint32_t val; 255*c63f63a2SAndrew Jeffery 256*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, 0, buf, 0), PLDM_SUCCESS); 257*c63f63a2SAndrew Jeffery EXPECT_NE(pldm_msgbuf_extract_uint32(ctx, &val), PLDM_SUCCESS); 258*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH); 259*c63f63a2SAndrew Jeffery } 260*c63f63a2SAndrew Jeffery 261*c63f63a2SAndrew Jeffery TEST(msgbuf, extract_one_int32) 262*c63f63a2SAndrew Jeffery { 263*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 264*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 265*c63f63a2SAndrew Jeffery int32_t buf[1] = {(int32_t)(htole32((uint32_t)(INT32_MIN)))}; 266*c63f63a2SAndrew Jeffery int32_t val; 267*c63f63a2SAndrew Jeffery 268*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)), 269*c63f63a2SAndrew Jeffery PLDM_SUCCESS); 270*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_extract_int32(ctx, &val), PLDM_SUCCESS); 271*c63f63a2SAndrew Jeffery EXPECT_EQ(val, INT32_MIN); 272*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS); 273*c63f63a2SAndrew Jeffery } 274*c63f63a2SAndrew Jeffery 275*c63f63a2SAndrew Jeffery TEST(msgbuf, extract_over_int32) 276*c63f63a2SAndrew Jeffery { 277*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 278*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 279*c63f63a2SAndrew Jeffery int32_t buf[1] = {}; 280*c63f63a2SAndrew Jeffery int32_t val; 281*c63f63a2SAndrew Jeffery 282*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, 0, buf, 0), PLDM_SUCCESS); 283*c63f63a2SAndrew Jeffery EXPECT_NE(pldm_msgbuf_extract_int32(ctx, &val), PLDM_SUCCESS); 284*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH); 285*c63f63a2SAndrew Jeffery } 286*c63f63a2SAndrew Jeffery 287*c63f63a2SAndrew Jeffery TEST(msgbuf, extract_one_real32) 288*c63f63a2SAndrew Jeffery { 289*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 290*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 291*c63f63a2SAndrew Jeffery uint32_t buf[1] = {}; 292*c63f63a2SAndrew Jeffery uint32_t xform; 293*c63f63a2SAndrew Jeffery real32_t val; 294*c63f63a2SAndrew Jeffery 295*c63f63a2SAndrew Jeffery val = FLT_MAX; 296*c63f63a2SAndrew Jeffery memcpy(&xform, &val, sizeof(val)); 297*c63f63a2SAndrew Jeffery buf[0] = htole32(xform); 298*c63f63a2SAndrew Jeffery val = 0; 299*c63f63a2SAndrew Jeffery 300*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, sizeof(buf), buf, sizeof(buf)), 301*c63f63a2SAndrew Jeffery PLDM_SUCCESS); 302*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_extract_real32(ctx, &val), PLDM_SUCCESS); 303*c63f63a2SAndrew Jeffery EXPECT_EQ(val, FLT_MAX); 304*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS); 305*c63f63a2SAndrew Jeffery } 306*c63f63a2SAndrew Jeffery 307*c63f63a2SAndrew Jeffery TEST(msgbuf, extract_over_real32) 308*c63f63a2SAndrew Jeffery { 309*c63f63a2SAndrew Jeffery struct pldm_msgbuf _ctx; 310*c63f63a2SAndrew Jeffery struct pldm_msgbuf* ctx = &_ctx; 311*c63f63a2SAndrew Jeffery real32_t buf[1] = {}; 312*c63f63a2SAndrew Jeffery real32_t val; 313*c63f63a2SAndrew Jeffery 314*c63f63a2SAndrew Jeffery ASSERT_EQ(pldm_msgbuf_init(ctx, 0, buf, 0), PLDM_SUCCESS); 315*c63f63a2SAndrew Jeffery EXPECT_NE(pldm_msgbuf_extract_real32(ctx, &val), PLDM_SUCCESS); 316*c63f63a2SAndrew Jeffery EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH); 317*c63f63a2SAndrew Jeffery } 318