xref: /openbmc/libpldm/tests/msgbuf.cpp (revision c63f63a2)
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