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