xref: /openbmc/libpldm/tests/msgbuf.cpp (revision 7939382f)
1c63f63a2SAndrew Jeffery #include <endian.h>
21523778dSThu Nguyen #include <libpldm/utils.h>
3c63f63a2SAndrew Jeffery 
4c63f63a2SAndrew Jeffery #include <cfloat>
5c63f63a2SAndrew Jeffery 
6c63f63a2SAndrew Jeffery #include <gtest/gtest.h>
7c63f63a2SAndrew Jeffery 
8c63f63a2SAndrew Jeffery /* We're exercising the implementation so disable the asserts for now */
9c63f63a2SAndrew Jeffery #ifndef NDEBUG
10c63f63a2SAndrew Jeffery #define NDEBUG 1
11c63f63a2SAndrew Jeffery #endif
12c63f63a2SAndrew Jeffery 
13c63f63a2SAndrew Jeffery #include "msgbuf.h"
14c63f63a2SAndrew Jeffery 
TEST(msgbuf,init_bad_minsize)15c63f63a2SAndrew Jeffery TEST(msgbuf, init_bad_minsize)
16c63f63a2SAndrew Jeffery {
17c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
18c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
19c63f63a2SAndrew Jeffery     uint8_t buf[1] = {};
20c63f63a2SAndrew Jeffery 
21c8df31c1SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_init_cc(ctx, sizeof(buf) + 1U, buf, sizeof(buf)),
22c63f63a2SAndrew Jeffery               PLDM_SUCCESS);
23c63f63a2SAndrew Jeffery }
24c63f63a2SAndrew Jeffery 
TEST(msgbuf,init_bad_len)25c63f63a2SAndrew Jeffery TEST(msgbuf, init_bad_len)
26c63f63a2SAndrew Jeffery {
27c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
28c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
29c63f63a2SAndrew Jeffery     uint8_t buf[1] = {};
30c63f63a2SAndrew Jeffery 
31c8df31c1SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_init_cc(ctx, sizeof(buf), buf, SIZE_MAX),
32c8df31c1SAndrew Jeffery               PLDM_SUCCESS);
33c63f63a2SAndrew Jeffery }
34c63f63a2SAndrew Jeffery 
TEST(msgbuf,init_overflow)35c63f63a2SAndrew Jeffery TEST(msgbuf, init_overflow)
36c63f63a2SAndrew Jeffery {
37c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
38c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
39c63f63a2SAndrew Jeffery     // NOLINTNEXTLINE(performance-no-int-to-ptr)
4007febdbbSAndrew Jeffery     void* buf = (void*)UINTPTR_MAX;
41c63f63a2SAndrew Jeffery 
42c8df31c1SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_init_cc(ctx, 0, buf, 2), PLDM_SUCCESS);
43c63f63a2SAndrew Jeffery }
44c63f63a2SAndrew Jeffery 
TEST(msgbuf,init_success)45c63f63a2SAndrew Jeffery TEST(msgbuf, init_success)
46c63f63a2SAndrew Jeffery {
47c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
48c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
49c63f63a2SAndrew Jeffery     uint8_t buf[1] = {};
50c63f63a2SAndrew Jeffery 
51c8df31c1SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_init_cc(ctx, sizeof(buf), buf, sizeof(buf)),
52c63f63a2SAndrew Jeffery               PLDM_SUCCESS);
53c63f63a2SAndrew Jeffery }
54c63f63a2SAndrew Jeffery 
TEST(msgbuf,destroy_none)55c63f63a2SAndrew Jeffery TEST(msgbuf, destroy_none)
56c63f63a2SAndrew Jeffery {
57c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
58c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
59c63f63a2SAndrew Jeffery     uint8_t buf[1] = {};
60c63f63a2SAndrew Jeffery 
61c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, sizeof(buf), buf, sizeof(buf)),
62c63f63a2SAndrew Jeffery               PLDM_SUCCESS);
63c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
64c63f63a2SAndrew Jeffery }
65c63f63a2SAndrew Jeffery 
TEST(msgbuf,destroy_exact)66c63f63a2SAndrew Jeffery TEST(msgbuf, destroy_exact)
67c63f63a2SAndrew Jeffery {
68c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
69c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
70c63f63a2SAndrew Jeffery     uint8_t buf[1] = {0xa5};
71c63f63a2SAndrew Jeffery     uint8_t val;
72c63f63a2SAndrew Jeffery 
73c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, sizeof(buf), buf, sizeof(buf)),
74c63f63a2SAndrew Jeffery               PLDM_SUCCESS);
75c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_extract_uint8(ctx, &val), PLDM_SUCCESS);
76c63f63a2SAndrew Jeffery     EXPECT_EQ(val, 0xa5);
77c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
78c63f63a2SAndrew Jeffery }
79c63f63a2SAndrew Jeffery 
TEST(msgbuf,destroy_over)80c63f63a2SAndrew Jeffery TEST(msgbuf, destroy_over)
81c63f63a2SAndrew Jeffery {
82c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
83c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
84c63f63a2SAndrew Jeffery     uint8_t buf[1] = {0xa5};
85c63f63a2SAndrew Jeffery     uint8_t val;
86c63f63a2SAndrew Jeffery 
87c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, sizeof(buf), buf, sizeof(buf)),
88c63f63a2SAndrew Jeffery               PLDM_SUCCESS);
89c63f63a2SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_extract_uint8(ctx, &val), PLDM_SUCCESS);
90c63f63a2SAndrew Jeffery     ASSERT_EQ(val, 0xa5);
91c63f63a2SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_uint8(ctx, &val), PLDM_SUCCESS);
92c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
93c63f63a2SAndrew Jeffery }
94c63f63a2SAndrew Jeffery 
TEST(msgbuf,destroy_under)95c63f63a2SAndrew Jeffery TEST(msgbuf, destroy_under)
96c63f63a2SAndrew Jeffery {
97c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
98c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
99c63f63a2SAndrew Jeffery     uint8_t buf[2] = {0x5a, 0xa5};
100c63f63a2SAndrew Jeffery     uint8_t val;
101c63f63a2SAndrew Jeffery 
102c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, sizeof(buf), buf, sizeof(buf)),
103c63f63a2SAndrew Jeffery               PLDM_SUCCESS);
104c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_extract_uint8(ctx, &val), PLDM_SUCCESS);
105c63f63a2SAndrew Jeffery     EXPECT_EQ(val, 0x5a);
106c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
107c63f63a2SAndrew Jeffery }
108c63f63a2SAndrew Jeffery 
TEST(msgbuf,extract_one_uint8)109c63f63a2SAndrew Jeffery TEST(msgbuf, extract_one_uint8)
110c63f63a2SAndrew Jeffery {
111c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
112c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
113c63f63a2SAndrew Jeffery     uint8_t buf[1] = {0xa5};
114c63f63a2SAndrew Jeffery     uint8_t val;
115c63f63a2SAndrew Jeffery 
116c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, sizeof(buf), buf, sizeof(buf)),
117c63f63a2SAndrew Jeffery               PLDM_SUCCESS);
118c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_extract_uint8(ctx, &val), PLDM_SUCCESS);
119c63f63a2SAndrew Jeffery     EXPECT_EQ(val, 0xa5);
120c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
121c63f63a2SAndrew Jeffery }
122c63f63a2SAndrew Jeffery 
TEST(msgbuf,extract_over_uint8)123c63f63a2SAndrew Jeffery TEST(msgbuf, extract_over_uint8)
124c63f63a2SAndrew Jeffery {
125c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
126c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
127c63f63a2SAndrew Jeffery     uint8_t buf[1] = {};
128c63f63a2SAndrew Jeffery     uint8_t val;
129c63f63a2SAndrew Jeffery 
130c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
131c63f63a2SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_uint8(ctx, &val), PLDM_SUCCESS);
132c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
133c63f63a2SAndrew Jeffery }
134c63f63a2SAndrew Jeffery 
TEST(msgbuf,extract_under_uint8)1352ff8cf89SAndrew Jeffery TEST(msgbuf, extract_under_uint8)
1362ff8cf89SAndrew Jeffery {
1372ff8cf89SAndrew Jeffery     struct pldm_msgbuf _ctx;
1382ff8cf89SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
1392ff8cf89SAndrew Jeffery 
1402ff8cf89SAndrew Jeffery     uint8_t buf[1] = {};
1412ff8cf89SAndrew Jeffery     uint8_t val;
1422ff8cf89SAndrew Jeffery 
143c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
1442ff8cf89SAndrew Jeffery     ctx->remaining = INTMAX_MIN;
1452ff8cf89SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_uint8(ctx, &val), PLDM_SUCCESS);
1462ff8cf89SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
1472ff8cf89SAndrew Jeffery }
1482ff8cf89SAndrew Jeffery 
TEST(msgbuf,extract_one_int8)149c63f63a2SAndrew Jeffery TEST(msgbuf, extract_one_int8)
150c63f63a2SAndrew Jeffery {
151c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
152c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
153c63f63a2SAndrew Jeffery     int8_t buf[1] = {-1};
154c63f63a2SAndrew Jeffery     int8_t val;
155c63f63a2SAndrew Jeffery 
156c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, sizeof(buf), buf, sizeof(buf)),
157c63f63a2SAndrew Jeffery               PLDM_SUCCESS);
158c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_extract_int8(ctx, &val), PLDM_SUCCESS);
159c63f63a2SAndrew Jeffery     EXPECT_EQ(val, -1);
160c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
161c63f63a2SAndrew Jeffery }
162c63f63a2SAndrew Jeffery 
TEST(msgbuf,extract_over_int8)163c63f63a2SAndrew Jeffery TEST(msgbuf, extract_over_int8)
164c63f63a2SAndrew Jeffery {
165c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
166c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
167c63f63a2SAndrew Jeffery     int8_t buf[1] = {};
168c63f63a2SAndrew Jeffery     int8_t val;
169c63f63a2SAndrew Jeffery 
170c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
171c63f63a2SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_int8(ctx, &val), PLDM_SUCCESS);
172c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
173c63f63a2SAndrew Jeffery }
174c63f63a2SAndrew Jeffery 
TEST(msgbuf,extract_under_int8)1752ff8cf89SAndrew Jeffery TEST(msgbuf, extract_under_int8)
1762ff8cf89SAndrew Jeffery {
1772ff8cf89SAndrew Jeffery     struct pldm_msgbuf _ctx;
1782ff8cf89SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
1792ff8cf89SAndrew Jeffery 
1802ff8cf89SAndrew Jeffery     uint8_t buf[1] = {};
1812ff8cf89SAndrew Jeffery     int8_t val;
1822ff8cf89SAndrew Jeffery 
183c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
1842ff8cf89SAndrew Jeffery     ctx->remaining = INTMAX_MIN;
1852ff8cf89SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_int8(ctx, &val), PLDM_SUCCESS);
1862ff8cf89SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
1872ff8cf89SAndrew Jeffery }
1882ff8cf89SAndrew Jeffery 
TEST(msgbuf,extract_one_uint16)189c63f63a2SAndrew Jeffery TEST(msgbuf, extract_one_uint16)
190c63f63a2SAndrew Jeffery {
191c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
192c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
193c63f63a2SAndrew Jeffery     uint16_t buf[1] = {htole16(0x5aa5)};
194c63f63a2SAndrew Jeffery     uint16_t val = {};
195c63f63a2SAndrew Jeffery 
196c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, sizeof(buf), buf, sizeof(buf)),
197c63f63a2SAndrew Jeffery               PLDM_SUCCESS);
198c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctx, &val), PLDM_SUCCESS);
199c63f63a2SAndrew Jeffery     EXPECT_EQ(val, 0x5aa5);
200c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
201c63f63a2SAndrew Jeffery }
202c63f63a2SAndrew Jeffery 
TEST(msgbuf,extract_under_uint16)2032ff8cf89SAndrew Jeffery TEST(msgbuf, extract_under_uint16)
2042ff8cf89SAndrew Jeffery {
2052ff8cf89SAndrew Jeffery     struct pldm_msgbuf _ctx;
2062ff8cf89SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
2072ff8cf89SAndrew Jeffery 
2082ff8cf89SAndrew Jeffery     uint16_t buf[1] = {};
2092ff8cf89SAndrew Jeffery     uint16_t val;
2102ff8cf89SAndrew Jeffery 
211c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
2122ff8cf89SAndrew Jeffery     ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
2132ff8cf89SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_uint16(ctx, &val), PLDM_SUCCESS);
2142ff8cf89SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
2152ff8cf89SAndrew Jeffery }
2162ff8cf89SAndrew Jeffery 
TEST(msgbuf,extract_over_uint16)217c63f63a2SAndrew Jeffery TEST(msgbuf, extract_over_uint16)
218c63f63a2SAndrew Jeffery {
219c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
220c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
221c63f63a2SAndrew Jeffery     uint16_t buf[1] = {};
222c63f63a2SAndrew Jeffery     uint16_t val;
223c63f63a2SAndrew Jeffery 
224c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
225c63f63a2SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_uint16(ctx, &val), PLDM_SUCCESS);
226c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
227c63f63a2SAndrew Jeffery }
228c63f63a2SAndrew Jeffery 
TEST(msgbuf,extract_one_int16)229c63f63a2SAndrew Jeffery TEST(msgbuf, extract_one_int16)
230c63f63a2SAndrew Jeffery {
231c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
232c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
233c63f63a2SAndrew Jeffery     int16_t buf[1] = {(int16_t)(htole16((uint16_t)INT16_MIN))};
234c63f63a2SAndrew Jeffery     int16_t val;
235c63f63a2SAndrew Jeffery 
236c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, sizeof(buf), buf, sizeof(buf)),
237c63f63a2SAndrew Jeffery               PLDM_SUCCESS);
238c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_extract_int16(ctx, &val), PLDM_SUCCESS);
239c63f63a2SAndrew Jeffery     EXPECT_EQ(val, INT16_MIN);
240c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
241c63f63a2SAndrew Jeffery }
242c63f63a2SAndrew Jeffery 
TEST(msgbuf,extract_over_int16)243c63f63a2SAndrew Jeffery TEST(msgbuf, extract_over_int16)
244c63f63a2SAndrew Jeffery {
245c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
246c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
247c63f63a2SAndrew Jeffery     int16_t buf[1] = {};
248c63f63a2SAndrew Jeffery     int16_t val;
249c63f63a2SAndrew Jeffery 
250c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
251c63f63a2SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_int16(ctx, &val), PLDM_SUCCESS);
252c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
253c63f63a2SAndrew Jeffery }
254c63f63a2SAndrew Jeffery 
TEST(msgbuf,extract_under_int16)2552ff8cf89SAndrew Jeffery TEST(msgbuf, extract_under_int16)
2562ff8cf89SAndrew Jeffery {
2572ff8cf89SAndrew Jeffery     struct pldm_msgbuf _ctx;
2582ff8cf89SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
2592ff8cf89SAndrew Jeffery 
2602ff8cf89SAndrew Jeffery     int16_t buf[1] = {};
2612ff8cf89SAndrew Jeffery     int16_t val;
2622ff8cf89SAndrew Jeffery 
263c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
2642ff8cf89SAndrew Jeffery     ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
2652ff8cf89SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_int16(ctx, &val), PLDM_SUCCESS);
2662ff8cf89SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
2672ff8cf89SAndrew Jeffery }
2682ff8cf89SAndrew Jeffery 
TEST(msgbuf,extract_one_uint32)269c63f63a2SAndrew Jeffery TEST(msgbuf, extract_one_uint32)
270c63f63a2SAndrew Jeffery {
271c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
272c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
273c63f63a2SAndrew Jeffery     uint32_t buf[1] = {htole32(0x5a00ffa5)};
274c63f63a2SAndrew Jeffery     uint32_t val;
275c63f63a2SAndrew Jeffery 
276c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, sizeof(buf), buf, sizeof(buf)),
277c63f63a2SAndrew Jeffery               PLDM_SUCCESS);
278c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_extract_uint32(ctx, &val), PLDM_SUCCESS);
279c63f63a2SAndrew Jeffery     EXPECT_EQ(val, 0x5a00ffa5);
280c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
281c63f63a2SAndrew Jeffery }
282c63f63a2SAndrew Jeffery 
TEST(msgbuf,extract_over_uint32)283c63f63a2SAndrew Jeffery TEST(msgbuf, extract_over_uint32)
284c63f63a2SAndrew Jeffery {
285c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
286c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
287c63f63a2SAndrew Jeffery     uint32_t buf[1] = {};
288c63f63a2SAndrew Jeffery     uint32_t val;
289c63f63a2SAndrew Jeffery 
290c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
291c63f63a2SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_uint32(ctx, &val), PLDM_SUCCESS);
292c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
293c63f63a2SAndrew Jeffery }
294c63f63a2SAndrew Jeffery 
TEST(msgbuf,extract_under_uint32)2952ff8cf89SAndrew Jeffery TEST(msgbuf, extract_under_uint32)
2962ff8cf89SAndrew Jeffery {
2972ff8cf89SAndrew Jeffery     struct pldm_msgbuf _ctx;
2982ff8cf89SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
2992ff8cf89SAndrew Jeffery 
3002ff8cf89SAndrew Jeffery     uint32_t buf[1] = {};
3012ff8cf89SAndrew Jeffery     uint32_t val;
3022ff8cf89SAndrew Jeffery 
303c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
3042ff8cf89SAndrew Jeffery     ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
3052ff8cf89SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_uint32(ctx, &val), PLDM_SUCCESS);
3062ff8cf89SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
3072ff8cf89SAndrew Jeffery }
3082ff8cf89SAndrew Jeffery 
TEST(msgbuf,extract_one_int32)309c63f63a2SAndrew Jeffery TEST(msgbuf, extract_one_int32)
310c63f63a2SAndrew Jeffery {
311c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
312c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
313c63f63a2SAndrew Jeffery     int32_t buf[1] = {(int32_t)(htole32((uint32_t)(INT32_MIN)))};
314c63f63a2SAndrew Jeffery     int32_t val;
315c63f63a2SAndrew Jeffery 
316c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, sizeof(buf), buf, sizeof(buf)),
317c63f63a2SAndrew Jeffery               PLDM_SUCCESS);
318c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_extract_int32(ctx, &val), PLDM_SUCCESS);
319c63f63a2SAndrew Jeffery     EXPECT_EQ(val, INT32_MIN);
320c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
321c63f63a2SAndrew Jeffery }
322c63f63a2SAndrew Jeffery 
TEST(msgbuf,extract_over_int32)323c63f63a2SAndrew Jeffery TEST(msgbuf, extract_over_int32)
324c63f63a2SAndrew Jeffery {
325c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
326c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
327c63f63a2SAndrew Jeffery     int32_t buf[1] = {};
328c63f63a2SAndrew Jeffery     int32_t val;
329c63f63a2SAndrew Jeffery 
330c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
331c63f63a2SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_int32(ctx, &val), PLDM_SUCCESS);
332c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
333c63f63a2SAndrew Jeffery }
334c63f63a2SAndrew Jeffery 
TEST(msgbuf,extract_under_int32)3352ff8cf89SAndrew Jeffery TEST(msgbuf, extract_under_int32)
3362ff8cf89SAndrew Jeffery {
3372ff8cf89SAndrew Jeffery     struct pldm_msgbuf _ctx;
3382ff8cf89SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
3392ff8cf89SAndrew Jeffery 
3402ff8cf89SAndrew Jeffery     int32_t buf[1] = {};
3412ff8cf89SAndrew Jeffery     int32_t val;
3422ff8cf89SAndrew Jeffery 
343c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
3442ff8cf89SAndrew Jeffery     ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
3452ff8cf89SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_int32(ctx, &val), PLDM_SUCCESS);
3462ff8cf89SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
3472ff8cf89SAndrew Jeffery }
3482ff8cf89SAndrew Jeffery 
TEST(msgbuf,extract_one_real32)349c63f63a2SAndrew Jeffery TEST(msgbuf, extract_one_real32)
350c63f63a2SAndrew Jeffery {
351c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
352c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
353c63f63a2SAndrew Jeffery     uint32_t buf[1] = {};
354c63f63a2SAndrew Jeffery     uint32_t xform;
355c63f63a2SAndrew Jeffery     real32_t val;
356c63f63a2SAndrew Jeffery 
357c63f63a2SAndrew Jeffery     val = FLT_MAX;
358c63f63a2SAndrew Jeffery     memcpy(&xform, &val, sizeof(val));
359c63f63a2SAndrew Jeffery     buf[0] = htole32(xform);
360c63f63a2SAndrew Jeffery     val = 0;
361c63f63a2SAndrew Jeffery 
362c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, sizeof(buf), buf, sizeof(buf)),
363c63f63a2SAndrew Jeffery               PLDM_SUCCESS);
364c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_extract_real32(ctx, &val), PLDM_SUCCESS);
365c63f63a2SAndrew Jeffery     EXPECT_EQ(val, FLT_MAX);
366c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
367c63f63a2SAndrew Jeffery }
368c63f63a2SAndrew Jeffery 
TEST(msgbuf,extract_over_real32)369c63f63a2SAndrew Jeffery TEST(msgbuf, extract_over_real32)
370c63f63a2SAndrew Jeffery {
371c63f63a2SAndrew Jeffery     struct pldm_msgbuf _ctx;
372c63f63a2SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
373c63f63a2SAndrew Jeffery     real32_t buf[1] = {};
374c63f63a2SAndrew Jeffery     real32_t val;
375c63f63a2SAndrew Jeffery 
376c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
377c63f63a2SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_real32(ctx, &val), PLDM_SUCCESS);
378c63f63a2SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
379c63f63a2SAndrew Jeffery }
380369b121aSAndrew Jeffery 
TEST(msgbuf,extract_under_real32)3812ff8cf89SAndrew Jeffery TEST(msgbuf, extract_under_real32)
3822ff8cf89SAndrew Jeffery {
3832ff8cf89SAndrew Jeffery     struct pldm_msgbuf _ctx;
3842ff8cf89SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
3852ff8cf89SAndrew Jeffery 
3862ff8cf89SAndrew Jeffery     real32_t buf[1] = {};
3872ff8cf89SAndrew Jeffery     real32_t val;
3882ff8cf89SAndrew Jeffery 
389c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
3902ff8cf89SAndrew Jeffery     ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
3912ff8cf89SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_real32(ctx, &val), PLDM_SUCCESS);
3922ff8cf89SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
3932ff8cf89SAndrew Jeffery }
3942ff8cf89SAndrew Jeffery 
TEST(msgbuf,extract_array_uint8_buf0_req0)395369b121aSAndrew Jeffery TEST(msgbuf, extract_array_uint8_buf0_req0)
396369b121aSAndrew Jeffery {
397369b121aSAndrew Jeffery     struct pldm_msgbuf _ctx;
398369b121aSAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
399369b121aSAndrew Jeffery     uint8_t buf[1] = {};
400369b121aSAndrew Jeffery     uint8_t arr[1];
401369b121aSAndrew Jeffery 
402c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
4030a1be3cbSAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_extract_array_uint8(ctx, 0, arr, 0), PLDM_SUCCESS);
404369b121aSAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
405369b121aSAndrew Jeffery }
406369b121aSAndrew Jeffery 
TEST(msgbuf,extract_array_uint8_buf1_req1)407369b121aSAndrew Jeffery TEST(msgbuf, extract_array_uint8_buf1_req1)
408369b121aSAndrew Jeffery {
409369b121aSAndrew Jeffery     struct pldm_msgbuf _ctx;
410369b121aSAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
411369b121aSAndrew Jeffery     uint8_t buf[1] = {};
412369b121aSAndrew Jeffery     uint8_t arr[1];
413369b121aSAndrew Jeffery 
414c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, sizeof(buf)), PLDM_SUCCESS);
4150a1be3cbSAndrew Jeffery     EXPECT_EQ(
4160a1be3cbSAndrew Jeffery         pldm_msgbuf_extract_array_uint8(ctx, sizeof(arr), arr, sizeof(arr)),
417369b121aSAndrew Jeffery         PLDM_SUCCESS);
418369b121aSAndrew Jeffery     EXPECT_EQ(arr[0], 0);
419369b121aSAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
420369b121aSAndrew Jeffery }
421369b121aSAndrew Jeffery 
TEST(msgbuf,extract_array_uint8_buf1_req2)422369b121aSAndrew Jeffery TEST(msgbuf, extract_array_uint8_buf1_req2)
423369b121aSAndrew Jeffery {
424369b121aSAndrew Jeffery     struct pldm_msgbuf _ctx;
425369b121aSAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
426369b121aSAndrew Jeffery     uint8_t buf[1] = {};
427369b121aSAndrew Jeffery     uint8_t arr[2];
428369b121aSAndrew Jeffery 
429c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, sizeof(buf)), PLDM_SUCCESS);
4300a1be3cbSAndrew Jeffery     EXPECT_NE(
4310a1be3cbSAndrew Jeffery         pldm_msgbuf_extract_array_uint8(ctx, sizeof(arr), arr, sizeof(arr)),
432369b121aSAndrew Jeffery         PLDM_SUCCESS);
433369b121aSAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
434369b121aSAndrew Jeffery }
435db7b8324SAndrew Jeffery 
TEST(msgbuf,extract_under_array_uint8)4362ff8cf89SAndrew Jeffery TEST(msgbuf, extract_under_array_uint8)
4372ff8cf89SAndrew Jeffery {
4382ff8cf89SAndrew Jeffery     struct pldm_msgbuf _ctx;
4392ff8cf89SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
4402ff8cf89SAndrew Jeffery     uint8_t buf[1] = {};
4412ff8cf89SAndrew Jeffery     uint8_t arr[1];
4422ff8cf89SAndrew Jeffery 
443c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
4442ff8cf89SAndrew Jeffery     ctx->remaining = INTMAX_MIN;
4450a1be3cbSAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_array_uint8(ctx, 1, arr, 1), PLDM_SUCCESS);
4462ff8cf89SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
4472ff8cf89SAndrew Jeffery }
4482ff8cf89SAndrew Jeffery 
TEST(msgbuf,extract_array_char_buf0_req0)4491c57144dSAndrew Jeffery TEST(msgbuf, extract_array_char_buf0_req0)
4501c57144dSAndrew Jeffery {
4511c57144dSAndrew Jeffery     struct pldm_msgbuf _ctx;
4521c57144dSAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
4531c57144dSAndrew Jeffery     char buf[1] = {'\0'};
4541c57144dSAndrew Jeffery     char arr[1] = {'1'};
4551c57144dSAndrew Jeffery 
4561c57144dSAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
4570a1be3cbSAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_extract_array_char(ctx, 0, arr, 0), 0);
4581c57144dSAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(ctx), 0);
4591c57144dSAndrew Jeffery }
4601c57144dSAndrew Jeffery 
TEST(msgbuf,extract_array_char_buf1_req1)4611c57144dSAndrew Jeffery TEST(msgbuf, extract_array_char_buf1_req1)
4621c57144dSAndrew Jeffery {
4631c57144dSAndrew Jeffery     struct pldm_msgbuf _ctx;
4641c57144dSAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
4651c57144dSAndrew Jeffery     char buf[1] = {'\0'};
4661c57144dSAndrew Jeffery     char arr[1] = {'1'};
4671c57144dSAndrew Jeffery 
4681c57144dSAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
4690a1be3cbSAndrew Jeffery     EXPECT_EQ(
4700a1be3cbSAndrew Jeffery         pldm_msgbuf_extract_array_char(ctx, sizeof(arr), arr, sizeof(arr)), 0);
4711c57144dSAndrew Jeffery     EXPECT_EQ(arr[0], '\0');
4721c57144dSAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(ctx), 0);
4731c57144dSAndrew Jeffery }
4741c57144dSAndrew Jeffery 
TEST(msgbuf,extract_array_char_buf1_req2)4751c57144dSAndrew Jeffery TEST(msgbuf, extract_array_char_buf1_req2)
4761c57144dSAndrew Jeffery {
4771c57144dSAndrew Jeffery     struct pldm_msgbuf _ctx;
4781c57144dSAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
4791c57144dSAndrew Jeffery     char buf[1] = {'\0'};
4801c57144dSAndrew Jeffery     char arr[2] = {'1', '2'};
4811c57144dSAndrew Jeffery 
4821c57144dSAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
4830a1be3cbSAndrew Jeffery     EXPECT_NE(
4840a1be3cbSAndrew Jeffery         pldm_msgbuf_extract_array_char(ctx, sizeof(arr), arr, sizeof(arr)), 0);
4851c57144dSAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(ctx), -EOVERFLOW);
4861c57144dSAndrew Jeffery }
4871c57144dSAndrew Jeffery 
TEST(msgbuf,extract_under_array_char)4881c57144dSAndrew Jeffery TEST(msgbuf, extract_under_array_char)
4891c57144dSAndrew Jeffery {
4901c57144dSAndrew Jeffery     struct pldm_msgbuf _ctx;
4911c57144dSAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
4921c57144dSAndrew Jeffery     char buf[1] = {'\0'};
4931c57144dSAndrew Jeffery     char arr[1] = {'1'};
4941c57144dSAndrew Jeffery 
4951c57144dSAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
4961c57144dSAndrew Jeffery     ctx->remaining = INTMAX_MIN;
4970a1be3cbSAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_array_char(ctx, 1, arr, 1), 0);
4981c57144dSAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(ctx), -EOVERFLOW);
4991c57144dSAndrew Jeffery }
5001c57144dSAndrew Jeffery 
TEST(msgbuf,consumed_under)501db7b8324SAndrew Jeffery TEST(msgbuf, consumed_under)
502db7b8324SAndrew Jeffery {
503db7b8324SAndrew Jeffery     struct pldm_msgbuf _ctx;
504db7b8324SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
505db7b8324SAndrew Jeffery     uint8_t buf[1] = {};
506db7b8324SAndrew Jeffery 
507c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, sizeof(buf)), PLDM_SUCCESS);
508db7b8324SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy_consumed(ctx), PLDM_ERROR_INVALID_LENGTH);
509db7b8324SAndrew Jeffery }
510db7b8324SAndrew Jeffery 
TEST(msgbuf,consumed_exact)511db7b8324SAndrew Jeffery TEST(msgbuf, consumed_exact)
512db7b8324SAndrew Jeffery {
513db7b8324SAndrew Jeffery     struct pldm_msgbuf _ctx;
514db7b8324SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
515db7b8324SAndrew Jeffery     uint8_t buf[1] = {};
516db7b8324SAndrew Jeffery     uint8_t val;
517db7b8324SAndrew Jeffery 
518c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, sizeof(buf)), PLDM_SUCCESS);
519db7b8324SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_extract_uint8(ctx, &val), PLDM_SUCCESS);
520db7b8324SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy_consumed(ctx), PLDM_SUCCESS);
521db7b8324SAndrew Jeffery }
522db7b8324SAndrew Jeffery 
TEST(msgbuf,consumed_over)523db7b8324SAndrew Jeffery TEST(msgbuf, consumed_over)
524db7b8324SAndrew Jeffery {
525db7b8324SAndrew Jeffery     struct pldm_msgbuf _ctx;
526db7b8324SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
527db7b8324SAndrew Jeffery     uint8_t buf[1] = {};
528db7b8324SAndrew Jeffery     uint8_t val[2];
529db7b8324SAndrew Jeffery 
530c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, sizeof(buf)), PLDM_SUCCESS);
531db7b8324SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_extract_uint8(ctx, &val[0]), PLDM_SUCCESS);
532db7b8324SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_extract_uint8(ctx, &val[1]), PLDM_SUCCESS);
533db7b8324SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy_consumed(ctx), PLDM_ERROR_INVALID_LENGTH);
534db7b8324SAndrew Jeffery }
535062c8762SThu Nguyen 
TEST(msgbuf,pldm_msgbuf_insert_int32_good)536062c8762SThu Nguyen TEST(msgbuf, pldm_msgbuf_insert_int32_good)
537062c8762SThu Nguyen {
538062c8762SThu Nguyen     struct pldm_msgbuf _ctx;
539062c8762SThu Nguyen     struct pldm_msgbuf* ctx = &_ctx;
540062c8762SThu Nguyen     int32_t src = -12345;
541062c8762SThu Nguyen     int32_t checkVal = 0;
542062c8762SThu Nguyen     uint8_t buf[sizeof(int32_t)] = {};
543062c8762SThu Nguyen 
544c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, sizeof(buf)), PLDM_SUCCESS);
545062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_insert_int32(ctx, src), PLDM_SUCCESS);
546062c8762SThu Nguyen 
547062c8762SThu Nguyen     struct pldm_msgbuf _ctxExtract;
548062c8762SThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
549062c8762SThu Nguyen 
550c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctxExtract, 0, buf, sizeof(buf)),
551c8df31c1SAndrew Jeffery               PLDM_SUCCESS);
552062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_int32(ctxExtract, &checkVal), PLDM_SUCCESS);
553062c8762SThu Nguyen 
554062c8762SThu Nguyen     EXPECT_EQ(src, checkVal);
555062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), PLDM_SUCCESS);
556062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
557062c8762SThu Nguyen }
558062c8762SThu Nguyen 
TEST(msgbuf,insert_under_int32)5592ff8cf89SAndrew Jeffery TEST(msgbuf, insert_under_int32)
5602ff8cf89SAndrew Jeffery {
5612ff8cf89SAndrew Jeffery     struct pldm_msgbuf _ctx;
5622ff8cf89SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
5632ff8cf89SAndrew Jeffery 
5642ff8cf89SAndrew Jeffery     int32_t buf[1] = {};
5652ff8cf89SAndrew Jeffery     int32_t val = 0;
5662ff8cf89SAndrew Jeffery 
567c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
5682ff8cf89SAndrew Jeffery     ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
5692ff8cf89SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_insert_int32(ctx, val), PLDM_SUCCESS);
5702ff8cf89SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
5712ff8cf89SAndrew Jeffery }
5722ff8cf89SAndrew Jeffery 
TEST(msgbuf,pldm_msgbuf_insert_uint32_good)573062c8762SThu Nguyen TEST(msgbuf, pldm_msgbuf_insert_uint32_good)
574062c8762SThu Nguyen {
575062c8762SThu Nguyen     struct pldm_msgbuf _ctx;
576062c8762SThu Nguyen     struct pldm_msgbuf* ctx = &_ctx;
577062c8762SThu Nguyen     uint32_t src = 0xf1223344;
578062c8762SThu Nguyen     uint32_t checkVal = 0;
579062c8762SThu Nguyen     uint8_t buf[sizeof(uint32_t)] = {};
580062c8762SThu Nguyen 
581c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, sizeof(buf)), PLDM_SUCCESS);
582062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_insert_uint32(ctx, src), PLDM_SUCCESS);
583062c8762SThu Nguyen 
584062c8762SThu Nguyen     struct pldm_msgbuf _ctxExtract;
585062c8762SThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
586062c8762SThu Nguyen 
587c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctxExtract, 0, buf, sizeof(buf)),
588c8df31c1SAndrew Jeffery               PLDM_SUCCESS);
589062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint32(ctxExtract, &checkVal), PLDM_SUCCESS);
590062c8762SThu Nguyen 
591062c8762SThu Nguyen     EXPECT_EQ(src, checkVal);
592062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), PLDM_SUCCESS);
593062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
594062c8762SThu Nguyen }
595062c8762SThu Nguyen 
TEST(msgbuf,insert_under_uint32)5962ff8cf89SAndrew Jeffery TEST(msgbuf, insert_under_uint32)
5972ff8cf89SAndrew Jeffery {
5982ff8cf89SAndrew Jeffery     struct pldm_msgbuf _ctx;
5992ff8cf89SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
6002ff8cf89SAndrew Jeffery 
6012ff8cf89SAndrew Jeffery     uint32_t buf[1] = {};
6022ff8cf89SAndrew Jeffery     uint32_t val = 0;
6032ff8cf89SAndrew Jeffery 
604c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
6052ff8cf89SAndrew Jeffery     ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
6062ff8cf89SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_insert_uint32(ctx, val), PLDM_SUCCESS);
6072ff8cf89SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
6082ff8cf89SAndrew Jeffery }
6092ff8cf89SAndrew Jeffery 
TEST(msgbuf,pldm_msgbuf_insert_uint16_good)610062c8762SThu Nguyen TEST(msgbuf, pldm_msgbuf_insert_uint16_good)
611062c8762SThu Nguyen {
612062c8762SThu Nguyen     struct pldm_msgbuf _ctx;
613062c8762SThu Nguyen     struct pldm_msgbuf* ctx = &_ctx;
614062c8762SThu Nguyen     uint16_t src = 0xf344;
615062c8762SThu Nguyen     uint16_t checkVal = 0;
616062c8762SThu Nguyen     uint8_t buf[sizeof(uint16_t)] = {};
617062c8762SThu Nguyen 
618c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, sizeof(uint16_t)), PLDM_SUCCESS);
619062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_insert_uint16(ctx, src), PLDM_SUCCESS);
620062c8762SThu Nguyen 
621062c8762SThu Nguyen     struct pldm_msgbuf _ctxExtract;
622062c8762SThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
623062c8762SThu Nguyen 
624c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctxExtract, 0, buf, sizeof(buf)),
625c8df31c1SAndrew Jeffery               PLDM_SUCCESS);
626062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &checkVal), PLDM_SUCCESS);
627062c8762SThu Nguyen 
628062c8762SThu Nguyen     EXPECT_EQ(src, checkVal);
629062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), PLDM_SUCCESS);
630062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
631062c8762SThu Nguyen }
632062c8762SThu Nguyen 
TEST(msgbuf,insert_under_uint16)6332ff8cf89SAndrew Jeffery TEST(msgbuf, insert_under_uint16)
6342ff8cf89SAndrew Jeffery {
6352ff8cf89SAndrew Jeffery     struct pldm_msgbuf _ctx;
6362ff8cf89SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
6372ff8cf89SAndrew Jeffery 
6382ff8cf89SAndrew Jeffery     uint16_t buf[1] = {};
6392ff8cf89SAndrew Jeffery     uint16_t val = 0;
6402ff8cf89SAndrew Jeffery 
641c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
6422ff8cf89SAndrew Jeffery     ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
6432ff8cf89SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_insert_uint16(ctx, val), PLDM_SUCCESS);
6442ff8cf89SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
6452ff8cf89SAndrew Jeffery }
6462ff8cf89SAndrew Jeffery 
TEST(msgbuf,pldm_msgbuf_insert_int16_good)647062c8762SThu Nguyen TEST(msgbuf, pldm_msgbuf_insert_int16_good)
648062c8762SThu Nguyen {
649062c8762SThu Nguyen     struct pldm_msgbuf _ctx;
650062c8762SThu Nguyen     struct pldm_msgbuf* ctx = &_ctx;
651062c8762SThu Nguyen     int16_t src = -12;
652062c8762SThu Nguyen     int16_t checkVal = 0;
653062c8762SThu Nguyen     uint8_t buf[sizeof(int16_t)] = {};
654062c8762SThu Nguyen 
655c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, sizeof(uint16_t)), PLDM_SUCCESS);
656062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_insert_int16(ctx, src), PLDM_SUCCESS);
657062c8762SThu Nguyen 
658062c8762SThu Nguyen     struct pldm_msgbuf _ctxExtract;
659062c8762SThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
660062c8762SThu Nguyen 
661c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctxExtract, 0, buf, sizeof(buf)),
662c8df31c1SAndrew Jeffery               PLDM_SUCCESS);
663062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_int16(ctxExtract, &checkVal), PLDM_SUCCESS);
664062c8762SThu Nguyen 
665062c8762SThu Nguyen     EXPECT_EQ(src, checkVal);
666062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), PLDM_SUCCESS);
667062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
668062c8762SThu Nguyen }
669062c8762SThu Nguyen 
TEST(msgbuf,insert_under_int16)6702ff8cf89SAndrew Jeffery TEST(msgbuf, insert_under_int16)
6712ff8cf89SAndrew Jeffery {
6722ff8cf89SAndrew Jeffery     struct pldm_msgbuf _ctx;
6732ff8cf89SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
6742ff8cf89SAndrew Jeffery 
6752ff8cf89SAndrew Jeffery     int16_t buf[1] = {};
6762ff8cf89SAndrew Jeffery     int16_t val = 0;
6772ff8cf89SAndrew Jeffery 
678c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
6792ff8cf89SAndrew Jeffery     ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
6802ff8cf89SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_insert_int16(ctx, val), PLDM_SUCCESS);
6812ff8cf89SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
6822ff8cf89SAndrew Jeffery }
6832ff8cf89SAndrew Jeffery 
TEST(msgbuf,pldm_msgbuf_insert_uint8_good)684062c8762SThu Nguyen TEST(msgbuf, pldm_msgbuf_insert_uint8_good)
685062c8762SThu Nguyen {
686062c8762SThu Nguyen     struct pldm_msgbuf _ctx;
687062c8762SThu Nguyen     struct pldm_msgbuf* ctx = &_ctx;
688062c8762SThu Nguyen     uint8_t src = 0xf4;
689062c8762SThu Nguyen     uint8_t checkVal = 0;
690062c8762SThu Nguyen     uint8_t buf[sizeof(uint8_t)] = {};
691062c8762SThu Nguyen 
692c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, sizeof(buf)), PLDM_SUCCESS);
693062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_insert_uint8(ctx, src), PLDM_SUCCESS);
694062c8762SThu Nguyen 
695062c8762SThu Nguyen     struct pldm_msgbuf _ctxExtract;
696062c8762SThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
697062c8762SThu Nguyen 
698c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctxExtract, 0, buf, sizeof(buf)),
699c8df31c1SAndrew Jeffery               PLDM_SUCCESS);
700062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint8(ctxExtract, &checkVal), PLDM_SUCCESS);
701062c8762SThu Nguyen 
702062c8762SThu Nguyen     EXPECT_EQ(src, checkVal);
703062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), PLDM_SUCCESS);
704062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
705062c8762SThu Nguyen }
706062c8762SThu Nguyen 
TEST(msgbuf,insert_under_uint8)7072ff8cf89SAndrew Jeffery TEST(msgbuf, insert_under_uint8)
7082ff8cf89SAndrew Jeffery {
7092ff8cf89SAndrew Jeffery     struct pldm_msgbuf _ctx;
7102ff8cf89SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
7112ff8cf89SAndrew Jeffery 
7122ff8cf89SAndrew Jeffery     uint8_t buf[1] = {};
7132ff8cf89SAndrew Jeffery     uint8_t val = 0;
7142ff8cf89SAndrew Jeffery 
715c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
7162ff8cf89SAndrew Jeffery     ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
7172ff8cf89SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_insert_uint8(ctx, val), PLDM_SUCCESS);
7182ff8cf89SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
7192ff8cf89SAndrew Jeffery }
7202ff8cf89SAndrew Jeffery 
TEST(msgbuf,pldm_msgbuf_insert_int8_good)721062c8762SThu Nguyen TEST(msgbuf, pldm_msgbuf_insert_int8_good)
722062c8762SThu Nguyen {
723062c8762SThu Nguyen     struct pldm_msgbuf _ctx;
724062c8762SThu Nguyen     struct pldm_msgbuf* ctx = &_ctx;
725062c8762SThu Nguyen     int8_t src = -4;
726062c8762SThu Nguyen     int8_t checkVal = 0;
727062c8762SThu Nguyen     uint8_t buf[sizeof(int8_t)] = {};
728062c8762SThu Nguyen 
729c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, sizeof(buf)), PLDM_SUCCESS);
730062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_insert_int8(ctx, src), PLDM_SUCCESS);
731062c8762SThu Nguyen 
732062c8762SThu Nguyen     struct pldm_msgbuf _ctxExtract;
733062c8762SThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
734062c8762SThu Nguyen 
735c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctxExtract, 0, buf, sizeof(buf)),
736c8df31c1SAndrew Jeffery               PLDM_SUCCESS);
737062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_int8(ctxExtract, &checkVal), PLDM_SUCCESS);
738062c8762SThu Nguyen 
739062c8762SThu Nguyen     EXPECT_EQ(src, checkVal);
740062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), PLDM_SUCCESS);
741062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
742062c8762SThu Nguyen }
743062c8762SThu Nguyen 
TEST(msgbuf,insert_under_int8)7442ff8cf89SAndrew Jeffery TEST(msgbuf, insert_under_int8)
7452ff8cf89SAndrew Jeffery {
7462ff8cf89SAndrew Jeffery     struct pldm_msgbuf _ctx;
7472ff8cf89SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
7482ff8cf89SAndrew Jeffery 
7492ff8cf89SAndrew Jeffery     int8_t buf[1] = {};
7502ff8cf89SAndrew Jeffery     int8_t val = 0;
7512ff8cf89SAndrew Jeffery 
752c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
7532ff8cf89SAndrew Jeffery     ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
7542ff8cf89SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_insert_int8(ctx, val), PLDM_SUCCESS);
7552ff8cf89SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
7562ff8cf89SAndrew Jeffery }
7572ff8cf89SAndrew Jeffery 
TEST(msgbuf,pldm_msgbuf_insert_array_uint8_good)758062c8762SThu Nguyen TEST(msgbuf, pldm_msgbuf_insert_array_uint8_good)
759062c8762SThu Nguyen {
760062c8762SThu Nguyen     struct pldm_msgbuf _ctx;
761062c8762SThu Nguyen     struct pldm_msgbuf* ctx = &_ctx;
762062c8762SThu Nguyen     uint8_t src[6] = {0x11, 0x22, 0x44, 0x55, 0x66, 0x77};
763062c8762SThu Nguyen     uint8_t buf[6] = {};
764062c8762SThu Nguyen     uint8_t retBuff[6] = {};
765062c8762SThu Nguyen 
766c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, sizeof(buf)), PLDM_SUCCESS);
7670a1be3cbSAndrew Jeffery     EXPECT_EQ(
7680a1be3cbSAndrew Jeffery         pldm_msgbuf_insert_array_uint8(ctx, sizeof(src), src, sizeof(src)),
769062c8762SThu Nguyen         PLDM_SUCCESS);
770062c8762SThu Nguyen 
771062c8762SThu Nguyen     struct pldm_msgbuf _ctxExtract;
772062c8762SThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
773062c8762SThu Nguyen 
774c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctxExtract, 0, buf, sizeof(buf)),
775c8df31c1SAndrew Jeffery               PLDM_SUCCESS);
7760a1be3cbSAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_extract_array_uint8(ctxExtract, sizeof(retBuff),
7770a1be3cbSAndrew Jeffery                                               retBuff, sizeof(retBuff)),
778062c8762SThu Nguyen               PLDM_SUCCESS);
779062c8762SThu Nguyen 
780062c8762SThu Nguyen     EXPECT_EQ(memcmp(src, retBuff, sizeof(retBuff)), 0);
781062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), PLDM_SUCCESS);
782062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
783062c8762SThu Nguyen }
784062c8762SThu Nguyen 
TEST(msgbuf,insert_under_array_uint8)7852ff8cf89SAndrew Jeffery TEST(msgbuf, insert_under_array_uint8)
7862ff8cf89SAndrew Jeffery {
7872ff8cf89SAndrew Jeffery     struct pldm_msgbuf _ctx;
7882ff8cf89SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
7892ff8cf89SAndrew Jeffery 
7902ff8cf89SAndrew Jeffery     uint8_t buf[1] = {};
7912ff8cf89SAndrew Jeffery     uint8_t val[1] = {0};
7922ff8cf89SAndrew Jeffery 
793c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
7942ff8cf89SAndrew Jeffery     ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
7950a1be3cbSAndrew Jeffery     EXPECT_NE(
7960a1be3cbSAndrew Jeffery         pldm_msgbuf_insert_array_uint8(ctx, sizeof(val), val, sizeof(val)),
7972ff8cf89SAndrew Jeffery         PLDM_SUCCESS);
7982ff8cf89SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
7992ff8cf89SAndrew Jeffery }
8002ff8cf89SAndrew Jeffery 
TEST(msgbuf,pldm_msgbuf_insert_array_char_good)8011c57144dSAndrew Jeffery TEST(msgbuf, pldm_msgbuf_insert_array_char_good)
8021c57144dSAndrew Jeffery {
8031c57144dSAndrew Jeffery     struct pldm_msgbuf _ctx;
8041c57144dSAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
8051c57144dSAndrew Jeffery     char src[6] = {0x11, 0x22, 0x44, 0x55, 0x66, 0x77};
8061c57144dSAndrew Jeffery     char buf[6] = {};
8071c57144dSAndrew Jeffery     char retBuff[6] = {};
8081c57144dSAndrew Jeffery 
8091c57144dSAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
8100a1be3cbSAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_insert_array_char(ctx, sizeof(src), src, sizeof(src)),
8110a1be3cbSAndrew Jeffery               0);
8121c57144dSAndrew Jeffery 
8131c57144dSAndrew Jeffery     struct pldm_msgbuf _ctxExtract;
8141c57144dSAndrew Jeffery     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
8151c57144dSAndrew Jeffery 
8161c57144dSAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)), 0);
8170a1be3cbSAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_extract_array_char(ctxExtract, sizeof(retBuff),
8180a1be3cbSAndrew Jeffery                                              retBuff, sizeof(retBuff)),
8191c57144dSAndrew Jeffery               0);
8201c57144dSAndrew Jeffery 
8211c57144dSAndrew Jeffery     EXPECT_EQ(memcmp(src, retBuff, sizeof(retBuff)), 0);
8221c57144dSAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), 0);
8231c57144dSAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), 0);
8241c57144dSAndrew Jeffery }
8251c57144dSAndrew Jeffery 
TEST(msgbuf,insert_under_array_char)8261c57144dSAndrew Jeffery TEST(msgbuf, insert_under_array_char)
8271c57144dSAndrew Jeffery {
8281c57144dSAndrew Jeffery     struct pldm_msgbuf _ctx;
8291c57144dSAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
8301c57144dSAndrew Jeffery     char buf[1] = {};
8311c57144dSAndrew Jeffery     char val[1] = {0};
8321c57144dSAndrew Jeffery 
8331c57144dSAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
8341c57144dSAndrew Jeffery     ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
8350a1be3cbSAndrew Jeffery     EXPECT_NE(pldm_msgbuf_insert_array_char(ctx, sizeof(val), val, sizeof(val)),
8360a1be3cbSAndrew Jeffery               0);
8371c57144dSAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), -EOVERFLOW);
8381c57144dSAndrew Jeffery }
8391c57144dSAndrew Jeffery 
TEST(msgbuf,pldm_msgbuf_span_required_good)840062c8762SThu Nguyen TEST(msgbuf, pldm_msgbuf_span_required_good)
841062c8762SThu Nguyen {
842062c8762SThu Nguyen     struct pldm_msgbuf _ctx;
843062c8762SThu Nguyen     struct pldm_msgbuf* ctx = &_ctx;
844062c8762SThu Nguyen     uint8_t src[6] = {0x11, 0x22, 0x44, 0x55, 0x66, 0x77};
845062c8762SThu Nguyen     uint8_t buf[6] = {0};
846062c8762SThu Nguyen     const size_t required = 4;
847062c8762SThu Nguyen     uint8_t expectData[required] = {0x44, 0x55, 0x66, 0x77};
848062c8762SThu Nguyen     uint16_t testVal;
849062c8762SThu Nguyen     uint8_t* retBuff = NULL;
850062c8762SThu Nguyen 
851c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, sizeof(buf)), PLDM_SUCCESS);
8520a1be3cbSAndrew Jeffery     EXPECT_EQ(
8530a1be3cbSAndrew Jeffery         pldm_msgbuf_insert_array_uint8(ctx, sizeof(src), src, sizeof(src)),
854062c8762SThu Nguyen         PLDM_SUCCESS);
855062c8762SThu Nguyen 
856062c8762SThu Nguyen     struct pldm_msgbuf _ctxExtract;
857062c8762SThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
858062c8762SThu Nguyen 
859c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctxExtract, 0, buf, sizeof(buf)),
860c8df31c1SAndrew Jeffery               PLDM_SUCCESS);
861062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &testVal), PLDM_SUCCESS);
862062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_span_required(ctxExtract, required, (void**)&retBuff),
863062c8762SThu Nguyen               PLDM_SUCCESS);
864062c8762SThu Nguyen 
865062c8762SThu Nguyen     EXPECT_EQ(memcmp(expectData, retBuff, required), 0);
866062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), PLDM_SUCCESS);
867062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
868062c8762SThu Nguyen }
869062c8762SThu Nguyen 
TEST(msgbuf,pldm_msgbuf_span_required_bad)870062c8762SThu Nguyen TEST(msgbuf, pldm_msgbuf_span_required_bad)
871062c8762SThu Nguyen {
872062c8762SThu Nguyen     struct pldm_msgbuf _ctx;
873062c8762SThu Nguyen     struct pldm_msgbuf* ctx = &_ctx;
874062c8762SThu Nguyen     uint8_t src[6] = {0x11, 0x22, 0x44, 0x55, 0x66, 0x77};
875062c8762SThu Nguyen     uint8_t buf[6] = {0};
876*7939382fSVarsha Kaverappa     const size_t required = 4;
877062c8762SThu Nguyen     uint16_t testVal;
878062c8762SThu Nguyen     [[maybe_unused]] uint8_t* retBuff = NULL;
879062c8762SThu Nguyen 
880c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, sizeof(buf)), PLDM_SUCCESS);
8810a1be3cbSAndrew Jeffery     EXPECT_EQ(
8820a1be3cbSAndrew Jeffery         pldm_msgbuf_insert_array_uint8(ctx, sizeof(src), src, sizeof(src)),
883062c8762SThu Nguyen         PLDM_SUCCESS);
884062c8762SThu Nguyen 
885062c8762SThu Nguyen     struct pldm_msgbuf _ctxExtract;
886062c8762SThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
887062c8762SThu Nguyen 
888c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctxExtract, 0, buf, sizeof(buf)),
889c8df31c1SAndrew Jeffery               PLDM_SUCCESS);
890062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &testVal), PLDM_SUCCESS);
891*7939382fSVarsha Kaverappa     EXPECT_EQ(pldm_msgbuf_span_required(ctxExtract, required, NULL),
892*7939382fSVarsha Kaverappa               PLDM_SUCCESS);
893062c8762SThu Nguyen 
894062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), PLDM_SUCCESS);
895062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
896062c8762SThu Nguyen }
897062c8762SThu Nguyen 
TEST(msgbuf,span_required_under)8982ff8cf89SAndrew Jeffery TEST(msgbuf, span_required_under)
8992ff8cf89SAndrew Jeffery {
9002ff8cf89SAndrew Jeffery     struct pldm_msgbuf _ctx;
9012ff8cf89SAndrew Jeffery     struct pldm_msgbuf* ctx = &_ctx;
9022ff8cf89SAndrew Jeffery 
9032ff8cf89SAndrew Jeffery     uint8_t buf[1] = {};
9042ff8cf89SAndrew Jeffery     void* cursor = nullptr;
9052ff8cf89SAndrew Jeffery 
906c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, 0), PLDM_SUCCESS);
9072ff8cf89SAndrew Jeffery     ctx->remaining = INTMAX_MIN;
9082ff8cf89SAndrew Jeffery     EXPECT_NE(pldm_msgbuf_span_required(ctx, 1, &cursor), PLDM_SUCCESS);
9092ff8cf89SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_ERROR_INVALID_LENGTH);
9102ff8cf89SAndrew Jeffery }
9112ff8cf89SAndrew Jeffery 
TEST(msgbuf,pldm_msgbuf_span_string_ascii_good)9129c83d681SThu Nguyen TEST(msgbuf, pldm_msgbuf_span_string_ascii_good)
9139c83d681SThu Nguyen {
9149c83d681SThu Nguyen     struct pldm_msgbuf _ctxExtract;
9159c83d681SThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
9169c83d681SThu Nguyen     uint8_t src[9] = {0x11, 0x22, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x77};
9179c83d681SThu Nguyen     constexpr size_t required = 6;
9189c83d681SThu Nguyen     const char expectData[required] = {0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00};
9199c83d681SThu Nguyen     uint16_t testVal;
9209c83d681SThu Nguyen     uint8_t testVal1;
9219c83d681SThu Nguyen     char* retBuff = NULL;
9229c83d681SThu Nguyen 
9239c83d681SThu Nguyen     ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
9249c83d681SThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &testVal), 0);
9259c83d681SThu Nguyen     EXPECT_EQ(0x2211, testVal);
9269c83d681SThu Nguyen     EXPECT_EQ(pldm_msgbuf_span_string_ascii(ctxExtract, (void**)&retBuff, NULL),
9279c83d681SThu Nguyen               0);
9289c83d681SThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint8(ctxExtract, &testVal1), 0);
9299c83d681SThu Nguyen     EXPECT_EQ(0x77, testVal1);
9309c83d681SThu Nguyen 
9319c83d681SThu Nguyen     EXPECT_EQ(required, strlen(retBuff) + 1);
9329c83d681SThu Nguyen     EXPECT_EQ(strncmp(expectData, retBuff, strlen(retBuff) + 1), 0);
9339c83d681SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), 0);
9349c83d681SThu Nguyen }
9359c83d681SThu Nguyen 
TEST(msgbuf,pldm_msgbuf_span_string_ascii_good_with_length)9369c83d681SThu Nguyen TEST(msgbuf, pldm_msgbuf_span_string_ascii_good_with_length)
9379c83d681SThu Nguyen {
9389c83d681SThu Nguyen     struct pldm_msgbuf _ctxExtract;
9399c83d681SThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
9409c83d681SThu Nguyen     uint8_t src[9] = {0x11, 0x22, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x77};
9419c83d681SThu Nguyen     constexpr size_t required = 6;
9429c83d681SThu Nguyen     const char expectData[required] = {0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00};
9439c83d681SThu Nguyen     uint16_t testVal;
9449c83d681SThu Nguyen     uint8_t testVal1;
9459c83d681SThu Nguyen     char* retBuff = NULL;
9469c83d681SThu Nguyen     size_t length;
9479c83d681SThu Nguyen 
9489c83d681SThu Nguyen     ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
9499c83d681SThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &testVal), 0);
9509c83d681SThu Nguyen     EXPECT_EQ(0x2211, testVal);
9519c83d681SThu Nguyen     EXPECT_EQ(
9529c83d681SThu Nguyen         pldm_msgbuf_span_string_ascii(ctxExtract, (void**)&retBuff, &length),
9539c83d681SThu Nguyen         0);
9549c83d681SThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint8(ctxExtract, &testVal1), 0);
9559c83d681SThu Nguyen     EXPECT_EQ(0x77, testVal1);
9569c83d681SThu Nguyen 
9579c83d681SThu Nguyen     EXPECT_EQ(required, strlen(retBuff) + 1);
9589c83d681SThu Nguyen     EXPECT_EQ(length, strlen(retBuff) + 1);
9599c83d681SThu Nguyen     EXPECT_EQ(required, length);
9609c83d681SThu Nguyen     EXPECT_EQ(strncmp(expectData, retBuff, strlen(retBuff) + 1), 0);
9619c83d681SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), 0);
9629c83d681SThu Nguyen }
9639c83d681SThu Nguyen 
TEST(msgbuf,pldm_msgbuf_span_string_ascii_allow_null_args)9649c83d681SThu Nguyen TEST(msgbuf, pldm_msgbuf_span_string_ascii_allow_null_args)
9659c83d681SThu Nguyen {
9669c83d681SThu Nguyen     struct pldm_msgbuf _ctxExtract;
9679c83d681SThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
9689c83d681SThu Nguyen     uint8_t src[8] = {0x11, 0x22, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00};
9699c83d681SThu Nguyen     uint16_t testVal;
9709c83d681SThu Nguyen 
9719c83d681SThu Nguyen     ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
9729c83d681SThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &testVal), 0);
9739c83d681SThu Nguyen     EXPECT_EQ(0x2211, testVal);
9749c83d681SThu Nguyen     EXPECT_EQ(pldm_msgbuf_span_string_ascii(ctxExtract, NULL, NULL), 0);
9759c83d681SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), 0);
9769c83d681SThu Nguyen }
9779c83d681SThu Nguyen 
TEST(msgbuf,pldm_msgbuf_span_string_ascii_bad_no_terminator)9789c83d681SThu Nguyen TEST(msgbuf, pldm_msgbuf_span_string_ascii_bad_no_terminator)
9799c83d681SThu Nguyen {
9809c83d681SThu Nguyen     struct pldm_msgbuf _ctxExtract;
9819c83d681SThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
9829c83d681SThu Nguyen     uint8_t src[8] = {0x11, 0x22, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77};
9839c83d681SThu Nguyen     uint16_t testVal;
9849c83d681SThu Nguyen     char* retBuff = NULL;
9859c83d681SThu Nguyen 
9869c83d681SThu Nguyen     ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
9879c83d681SThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &testVal), 0);
9889c83d681SThu Nguyen     EXPECT_EQ(0x2211, testVal);
9899c83d681SThu Nguyen     EXPECT_EQ(pldm_msgbuf_span_string_ascii(ctxExtract, (void**)&retBuff, NULL),
9909c83d681SThu Nguyen               -EOVERFLOW);
9919c83d681SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), -EOVERFLOW);
9929c83d681SThu Nguyen }
9939c83d681SThu Nguyen 
TEST(msgbuf,pldm_msgbuf_span_string_ascii_under)9949c83d681SThu Nguyen TEST(msgbuf, pldm_msgbuf_span_string_ascii_under)
9959c83d681SThu Nguyen {
9969c83d681SThu Nguyen     struct pldm_msgbuf _ctxExtract;
9979c83d681SThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
9989c83d681SThu Nguyen 
9999c83d681SThu Nguyen     uint8_t src[1] = {};
10009c83d681SThu Nguyen     char* retBuff = NULL;
10019c83d681SThu Nguyen 
10029c83d681SThu Nguyen     ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, 0), 0);
10039c83d681SThu Nguyen     ctxExtract->remaining = INTMAX_MIN;
10049c83d681SThu Nguyen     EXPECT_NE(pldm_msgbuf_span_string_ascii(ctxExtract, (void**)&retBuff, NULL),
10059c83d681SThu Nguyen               0);
10069c83d681SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), -EOVERFLOW);
10079c83d681SThu Nguyen }
10089c83d681SThu Nguyen 
str16len(char16_t * startptr)10091523778dSThu Nguyen static size_t str16len(char16_t* startptr)
10101523778dSThu Nguyen {
10111523778dSThu Nguyen     char16_t* endptr = startptr;
10121523778dSThu Nguyen     while (*endptr)
10131523778dSThu Nguyen     {
10141523778dSThu Nguyen         endptr++;
10151523778dSThu Nguyen     }
10161523778dSThu Nguyen     return endptr - startptr;
10171523778dSThu Nguyen }
10181523778dSThu Nguyen 
TEST(msgbuf,pldm_msgbuf_span_string_utf16_good)10191523778dSThu Nguyen TEST(msgbuf, pldm_msgbuf_span_string_utf16_good)
10201523778dSThu Nguyen {
10211523778dSThu Nguyen     struct pldm_msgbuf _ctxExtract;
10221523778dSThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
10231523778dSThu Nguyen     uint8_t src[] __attribute__((aligned(alignof(char16_t)))) = {
10241523778dSThu Nguyen         0x11, 0x22, 0x11, 0x68, 0x22, 0x65, 0x33, 0x6c,
10251523778dSThu Nguyen         0x44, 0x6c, 0x55, 0x6f, 0x00, 0x00, 0x34, 0x12};
10261523778dSThu Nguyen     const char expectData[] = {0x11, 0x68, 0x22, 0x65, 0x33, 0x6c,
10271523778dSThu Nguyen                                0x44, 0x6c, 0x55, 0x6f, 0x00, 0x00};
10281523778dSThu Nguyen     uint16_t testVal;
10291523778dSThu Nguyen     uint16_t testVal1;
10301523778dSThu Nguyen     void* retBuff = NULL;
10311523778dSThu Nguyen 
10321523778dSThu Nguyen     ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
10331523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &testVal), 0);
10341523778dSThu Nguyen     EXPECT_EQ(0x2211, testVal);
10351523778dSThu Nguyen 
10361523778dSThu Nguyen     ASSERT_EQ(pldm_msgbuf_span_string_utf16(ctxExtract, (void**)&retBuff, NULL),
10371523778dSThu Nguyen               0);
10381523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &testVal1), 0);
10391523778dSThu Nguyen     EXPECT_EQ(0x1234, testVal1);
10401523778dSThu Nguyen 
10411523778dSThu Nguyen     ASSERT_EQ(0, (uintptr_t)retBuff & (alignof(char16_t) - 1));
10421523778dSThu Nguyen     EXPECT_EQ(6, str16len((char16_t*)retBuff) + 1);
10431523778dSThu Nguyen     EXPECT_EQ(0, memcmp(expectData, retBuff, sizeof(expectData)));
10441523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), 0);
10451523778dSThu Nguyen }
10461523778dSThu Nguyen 
TEST(msgbuf,pldm_msgbuf_span_string_utf16_good2)10471523778dSThu Nguyen TEST(msgbuf, pldm_msgbuf_span_string_utf16_good2)
10481523778dSThu Nguyen {
10491523778dSThu Nguyen     struct pldm_msgbuf _ctxExtract;
10501523778dSThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
10511523778dSThu Nguyen     uint8_t src[24] = {0x11, 0x22, 0x11, 0x68, 0x22, 0x65, 0x33, 0x6c,
10521523778dSThu Nguyen                        0x44, 0x6c, 0x55, 0x6f, 0x00, 0x00, 0x34, 0x12,
10531523778dSThu Nguyen                        0x44, 0x6c, 0x55, 0x6f, 0x00, 0x00, 0x34, 0x12};
10541523778dSThu Nguyen     constexpr size_t required = 6;
10551523778dSThu Nguyen     const char16_t expectData[required] = {0x6811, 0x6522, 0x6c33,
10561523778dSThu Nguyen                                            0x6c44, 0x6f55, 0x0000};
10571523778dSThu Nguyen     const char16_t expectData1[3] = {0x6c44, 0x6f55, 0x0000};
10581523778dSThu Nguyen     uint16_t testVal;
10591523778dSThu Nguyen     uint16_t testVal1;
10601523778dSThu Nguyen     char* retBuff = NULL;
10611523778dSThu Nguyen     char* retBuff1 = NULL;
10621523778dSThu Nguyen     size_t length = 0;
10631523778dSThu Nguyen 
10641523778dSThu Nguyen     ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
10651523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &testVal), 0);
10661523778dSThu Nguyen     EXPECT_EQ(0x2211, testVal);
10671523778dSThu Nguyen 
10681523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_span_string_utf16(ctxExtract, (void**)&retBuff, NULL),
10691523778dSThu Nguyen               0);
10701523778dSThu Nguyen 
10711523778dSThu Nguyen     ASSERT_EQ(0, (uintptr_t)retBuff & (alignof(char16_t) - 1));
10721523778dSThu Nguyen     EXPECT_EQ(6, str16len((char16_t*)retBuff) + 1);
10731523778dSThu Nguyen     EXPECT_EQ(memcmp(expectData, retBuff,
10741523778dSThu Nguyen                      sizeof(char16_t) * (str16len((char16_t*)retBuff) + 1)),
10751523778dSThu Nguyen               0);
10761523778dSThu Nguyen 
10771523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &testVal1), 0);
10781523778dSThu Nguyen     EXPECT_EQ(0x1234, testVal1);
10791523778dSThu Nguyen 
10801523778dSThu Nguyen     EXPECT_EQ(
10811523778dSThu Nguyen         pldm_msgbuf_span_string_utf16(ctxExtract, (void**)&retBuff1, &length),
10821523778dSThu Nguyen         0);
10831523778dSThu Nguyen 
10841523778dSThu Nguyen     EXPECT_EQ(0, length % 2);
10851523778dSThu Nguyen     EXPECT_EQ(memcmp(expectData1, retBuff1, length), 0);
10861523778dSThu Nguyen 
10871523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &testVal1), 0);
10881523778dSThu Nguyen     EXPECT_EQ(0x1234, testVal1);
10891523778dSThu Nguyen 
10901523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), 0);
10911523778dSThu Nguyen }
10921523778dSThu Nguyen 
TEST(msgbuf,pldm_msgbuf_span_string_utf16_allow_null_args)10931523778dSThu Nguyen TEST(msgbuf, pldm_msgbuf_span_string_utf16_allow_null_args)
10941523778dSThu Nguyen {
10951523778dSThu Nguyen     struct pldm_msgbuf _ctxExtract;
10961523778dSThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
10971523778dSThu Nguyen     uint8_t src[14] = {0x11, 0x22, 0x11, 0x68, 0x22, 0x65, 0x33,
10981523778dSThu Nguyen                        0x6c, 0x44, 0x6c, 0x55, 0x6f, 0x00, 0x00};
10991523778dSThu Nguyen     uint16_t testVal;
11001523778dSThu Nguyen 
11011523778dSThu Nguyen     ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
11021523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &testVal), 0);
11031523778dSThu Nguyen     EXPECT_EQ(0x2211, testVal);
11041523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_span_string_utf16(ctxExtract, NULL, NULL), 0);
11051523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), 0);
11061523778dSThu Nguyen }
11071523778dSThu Nguyen 
TEST(msgbuf,pldm_msgbuf_span_string_utf16_bad_no_terminator)11081523778dSThu Nguyen TEST(msgbuf, pldm_msgbuf_span_string_utf16_bad_no_terminator)
11091523778dSThu Nguyen {
11101523778dSThu Nguyen     struct pldm_msgbuf _ctxExtract;
11111523778dSThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
11121523778dSThu Nguyen     uint8_t src[14] = {0x11, 0x22, 0x11, 0x68, 0x22, 0x65, 0x33,
11131523778dSThu Nguyen                        0x6c, 0x44, 0x6c, 0x55, 0x6f, 0x66, 0x77};
11141523778dSThu Nguyen     uint16_t testVal;
11151523778dSThu Nguyen     char16_t* retBuff = NULL;
11161523778dSThu Nguyen 
11171523778dSThu Nguyen     ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
11181523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &testVal), 0);
11191523778dSThu Nguyen     EXPECT_EQ(0x2211, testVal);
11201523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_span_string_utf16(ctxExtract, (void**)&retBuff, NULL),
11211523778dSThu Nguyen               -EOVERFLOW);
11221523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), -EOVERFLOW);
11231523778dSThu Nguyen }
11241523778dSThu Nguyen 
TEST(msgbuf,pldm_msgbuf_span_string_utf16_bad_odd_size)11251523778dSThu Nguyen TEST(msgbuf, pldm_msgbuf_span_string_utf16_bad_odd_size)
11261523778dSThu Nguyen {
11271523778dSThu Nguyen     struct pldm_msgbuf _ctxExtract;
11281523778dSThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
11291523778dSThu Nguyen     uint8_t src[] = {0x11, 0x22, 0x11, 0x68, 0x22, 0x65, 0x33,
11301523778dSThu Nguyen                      0x6c, 0x44, 0x6c, 0x55, 0x00, 0x00};
11311523778dSThu Nguyen     uint16_t testVal;
11321523778dSThu Nguyen     char16_t* retBuff = NULL;
11331523778dSThu Nguyen 
11341523778dSThu Nguyen     ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
11351523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &testVal), 0);
11361523778dSThu Nguyen     EXPECT_EQ(0x2211, testVal);
11371523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_span_string_utf16(ctxExtract, (void**)&retBuff, NULL),
11381523778dSThu Nguyen               -EOVERFLOW);
11391523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), -EOVERFLOW);
11401523778dSThu Nguyen }
11411523778dSThu Nguyen 
TEST(msgbuf,pldm_msgbuf_span_string_utf16_mix)11421523778dSThu Nguyen TEST(msgbuf, pldm_msgbuf_span_string_utf16_mix)
11431523778dSThu Nguyen {
11441523778dSThu Nguyen     struct pldm_msgbuf _ctxExtract;
11451523778dSThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
11461523778dSThu Nguyen     uint8_t src[36] = {0x2,  0x65, 0x6e, 0x00, // Language Tag "en"
11471523778dSThu Nguyen                        0x00, 0x53, 0x00, 0x30, 0x00, 0x53, 0x00,
11481523778dSThu Nguyen                        0x58, 0x00, 0x00,                   // Entity Name "S0S"
11491523778dSThu Nguyen                        0x66, 0x6e, 0x00,                   // Language Tag "en"
11501523778dSThu Nguyen                        0x00, 0x53, 0x00, 0x31, 0x00, 0x00, // Entity Name "S1"
11511523778dSThu Nguyen                        0x67, 0x6e, 0x00,                   // Language Tag "en"
11521523778dSThu Nguyen                        0x00, 0x52, 0x00, 0x52, 0x00, 0x33, 0x00,
11531523778dSThu Nguyen                        0x00, // Entity Name "RR3"
11541523778dSThu Nguyen                        0x77, 0x88};
11551523778dSThu Nguyen     uint8_t name_count;
11561523778dSThu Nguyen     uint16_t test_val;
11571523778dSThu Nguyen     char* tag = NULL;
11581523778dSThu Nguyen     char* name = NULL;
11591523778dSThu Nguyen     char* tag1 = NULL;
11601523778dSThu Nguyen     char* name1 = NULL;
11611523778dSThu Nguyen     char* tag2 = NULL;
11621523778dSThu Nguyen     char* name2 = NULL;
11631523778dSThu Nguyen     const char expectTag0[3] = {0x65, 0x6e, 0x00};
11641523778dSThu Nguyen     const char expectTag1[3] = {0x66, 0x6e, 0x00};
11651523778dSThu Nguyen     const char expectTag2[3] = {0x67, 0x6e, 0x00};
11661523778dSThu Nguyen 
11671523778dSThu Nguyen     const char16_t expectName0[5] = {0x5300, 0x3000, 0x5300, 0x5800, 0x0000};
11681523778dSThu Nguyen     const char16_t expectName1[3] = {0x5300, 0x3100, 0x0000};
11691523778dSThu Nguyen     const char16_t expectName2[4] = {0x5200, 0x5200, 0x3300, 0x0000};
11701523778dSThu Nguyen     size_t length = 0;
11711523778dSThu Nguyen 
11721523778dSThu Nguyen     ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
11731523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint8(ctxExtract, &name_count), 0);
11741523778dSThu Nguyen     EXPECT_EQ(0x2, name_count);
11751523778dSThu Nguyen 
11761523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_span_string_ascii(ctxExtract, (void**)&tag, NULL), 0);
11771523778dSThu Nguyen     EXPECT_EQ(strncmp(expectTag0, tag, strlen(tag) + 1), 0);
11781523778dSThu Nguyen 
11791523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_span_string_utf16(ctxExtract, (void**)&name, NULL),
11801523778dSThu Nguyen               0);
11811523778dSThu Nguyen     ASSERT_EQ(0, (uintptr_t)name & (alignof(char16_t) - 1));
11821523778dSThu Nguyen     EXPECT_EQ(5, str16len((char16_t*)name) + 1);
11831523778dSThu Nguyen     EXPECT_EQ(memcmp(expectName0, name,
11841523778dSThu Nguyen                      sizeof(char16_t) * (str16len((char16_t*)name) + 1)),
11851523778dSThu Nguyen               0);
11861523778dSThu Nguyen 
11871523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_span_string_ascii(ctxExtract, (void**)&tag1, &length),
11881523778dSThu Nguyen               0);
11891523778dSThu Nguyen     EXPECT_EQ(strncmp(expectTag1, tag1, length), 0);
11901523778dSThu Nguyen     EXPECT_EQ(
11911523778dSThu Nguyen         pldm_msgbuf_span_string_utf16(ctxExtract, (void**)&name1, &length), 0);
11921523778dSThu Nguyen     EXPECT_EQ(0, length % 2);
11931523778dSThu Nguyen     EXPECT_EQ(memcmp(expectName1, name1, length), 0);
11941523778dSThu Nguyen 
11951523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_span_string_ascii(ctxExtract, (void**)&tag2, NULL),
11961523778dSThu Nguyen               0);
11971523778dSThu Nguyen     EXPECT_EQ(strncmp(expectTag2, tag2, strlen(tag2) + 1), 0);
11981523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_span_string_utf16(ctxExtract, (void**)&name2, NULL),
11991523778dSThu Nguyen               0);
12001523778dSThu Nguyen     ASSERT_EQ(0, (uintptr_t)name2 & (alignof(char16_t) - 1));
12011523778dSThu Nguyen     EXPECT_EQ(4, str16len((char16_t*)name2) + 1);
12021523778dSThu Nguyen     EXPECT_EQ(memcmp(expectName2, name2,
12031523778dSThu Nguyen                      sizeof(char16_t) * (str16len((char16_t*)name2) + 1)),
12041523778dSThu Nguyen               0);
12051523778dSThu Nguyen 
12061523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &test_val), 0);
12071523778dSThu Nguyen     EXPECT_EQ(0x8877, test_val);
12081523778dSThu Nguyen 
12091523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), 0);
12101523778dSThu Nguyen }
12111523778dSThu Nguyen 
TEST(msgbuf,pldm_msgbuf_span_string_utf16_under)12121523778dSThu Nguyen TEST(msgbuf, pldm_msgbuf_span_string_utf16_under)
12131523778dSThu Nguyen {
12141523778dSThu Nguyen     struct pldm_msgbuf _ctxExtract;
12151523778dSThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
12161523778dSThu Nguyen 
12171523778dSThu Nguyen     uint8_t src[1] = {};
12181523778dSThu Nguyen     char* retBuff = NULL;
12191523778dSThu Nguyen 
12201523778dSThu Nguyen     ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, 0), 0);
12211523778dSThu Nguyen     ctxExtract->remaining = INTMAX_MIN;
12221523778dSThu Nguyen     EXPECT_NE(pldm_msgbuf_span_string_utf16(ctxExtract, (void**)&retBuff, NULL),
12231523778dSThu Nguyen               0);
12241523778dSThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), -EOVERFLOW);
12251523778dSThu Nguyen }
12261523778dSThu Nguyen 
TEST(msgbuf,pldm_msgbuf_span_remaining_good)1227062c8762SThu Nguyen TEST(msgbuf, pldm_msgbuf_span_remaining_good)
1228062c8762SThu Nguyen {
1229062c8762SThu Nguyen     struct pldm_msgbuf _ctx;
1230062c8762SThu Nguyen     struct pldm_msgbuf* ctx = &_ctx;
1231062c8762SThu Nguyen     uint8_t src[8] = {0x11, 0x22, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99};
1232062c8762SThu Nguyen     uint8_t buf[8] = {0};
1233062c8762SThu Nguyen     uint16_t testVal;
1234062c8762SThu Nguyen     uint8_t expectData[6] = {0x44, 0x55, 0x66, 0x77, 0x88, 0x99};
1235062c8762SThu Nguyen     size_t remaining;
1236062c8762SThu Nguyen     uint8_t* retBuff = NULL;
1237062c8762SThu Nguyen 
1238c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, sizeof(buf)), PLDM_SUCCESS);
12390a1be3cbSAndrew Jeffery     EXPECT_EQ(
12400a1be3cbSAndrew Jeffery         pldm_msgbuf_insert_array_uint8(ctx, sizeof(src), src, sizeof(src)),
1241062c8762SThu Nguyen         PLDM_SUCCESS);
1242062c8762SThu Nguyen 
1243062c8762SThu Nguyen     struct pldm_msgbuf _ctxExtract;
1244062c8762SThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
1245062c8762SThu Nguyen 
1246c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctxExtract, 0, buf, sizeof(buf)),
1247c8df31c1SAndrew Jeffery               PLDM_SUCCESS);
1248062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &testVal), PLDM_SUCCESS);
1249062c8762SThu Nguyen     EXPECT_EQ(
1250062c8762SThu Nguyen         pldm_msgbuf_span_remaining(ctxExtract, (void**)&retBuff, &remaining),
1251062c8762SThu Nguyen         PLDM_SUCCESS);
1252062c8762SThu Nguyen 
1253062c8762SThu Nguyen     EXPECT_EQ(remaining, sizeof(expectData));
1254062c8762SThu Nguyen     EXPECT_EQ(memcmp(expectData, retBuff, remaining), 0);
1255062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), PLDM_SUCCESS);
1256062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
1257062c8762SThu Nguyen }
1258062c8762SThu Nguyen 
TEST(msgbuf,pldm_msgbuf_span_remaining_bad)1259062c8762SThu Nguyen TEST(msgbuf, pldm_msgbuf_span_remaining_bad)
1260062c8762SThu Nguyen {
1261062c8762SThu Nguyen     struct pldm_msgbuf _ctx;
1262062c8762SThu Nguyen     struct pldm_msgbuf* ctx = &_ctx;
1263062c8762SThu Nguyen     uint8_t src[8] = {0x11, 0x22, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99};
1264062c8762SThu Nguyen     uint8_t buf[8] = {0};
1265062c8762SThu Nguyen     uint16_t testVal;
1266062c8762SThu Nguyen 
1267c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, buf, sizeof(buf)), PLDM_SUCCESS);
12680a1be3cbSAndrew Jeffery     EXPECT_EQ(
12690a1be3cbSAndrew Jeffery         pldm_msgbuf_insert_array_uint8(ctx, sizeof(src), src, sizeof(src)),
1270062c8762SThu Nguyen         PLDM_SUCCESS);
1271062c8762SThu Nguyen 
1272062c8762SThu Nguyen     struct pldm_msgbuf _ctxExtract;
1273062c8762SThu Nguyen     struct pldm_msgbuf* ctxExtract = &_ctxExtract;
1274062c8762SThu Nguyen 
1275c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(ctxExtract, 0, buf, sizeof(buf)),
1276c8df31c1SAndrew Jeffery               PLDM_SUCCESS);
1277062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, &testVal), PLDM_SUCCESS);
1278062c8762SThu Nguyen 
1279062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), PLDM_SUCCESS);
1280062c8762SThu Nguyen     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
1281062c8762SThu Nguyen }
1282909bf7c2SVarsha Kaverappa 
TEST(msgbuf,pldm_msgbuf_copy_good)1283909bf7c2SVarsha Kaverappa TEST(msgbuf, pldm_msgbuf_copy_good)
1284909bf7c2SVarsha Kaverappa {
1285909bf7c2SVarsha Kaverappa     struct pldm_msgbuf _src;
1286909bf7c2SVarsha Kaverappa     struct pldm_msgbuf* src = &_src;
1287909bf7c2SVarsha Kaverappa     uint16_t buf[1] = {htole16(0x5aa5)};
1288909bf7c2SVarsha Kaverappa 
1289c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(src, sizeof(buf), buf, sizeof(buf)),
1290909bf7c2SVarsha Kaverappa               PLDM_SUCCESS);
1291909bf7c2SVarsha Kaverappa 
1292909bf7c2SVarsha Kaverappa     struct pldm_msgbuf _dst;
1293909bf7c2SVarsha Kaverappa     struct pldm_msgbuf* dst = &_dst;
1294909bf7c2SVarsha Kaverappa     uint16_t checkVal = 0;
1295909bf7c2SVarsha Kaverappa     uint8_t buf1[sizeof(buf)] = {};
1296909bf7c2SVarsha Kaverappa 
1297c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(dst, sizeof(buf1), buf1, sizeof(buf1)),
1298909bf7c2SVarsha Kaverappa               PLDM_SUCCESS);
1299909bf7c2SVarsha Kaverappa     EXPECT_EQ(pldm_msgbuf_copy(dst, src, buf[0], name), PLDM_SUCCESS);
1300909bf7c2SVarsha Kaverappa 
1301c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(dst, sizeof(buf1), buf1, sizeof(buf1)),
1302909bf7c2SVarsha Kaverappa               PLDM_SUCCESS);
1303909bf7c2SVarsha Kaverappa     EXPECT_EQ(pldm_msgbuf_extract_uint16(dst, &checkVal), PLDM_SUCCESS);
1304909bf7c2SVarsha Kaverappa 
1305909bf7c2SVarsha Kaverappa     EXPECT_EQ(pldm_msgbuf_destroy(src), PLDM_SUCCESS);
1306909bf7c2SVarsha Kaverappa     EXPECT_EQ(pldm_msgbuf_destroy(dst), PLDM_SUCCESS);
13078b879600SAndrew Jeffery 
13088b879600SAndrew Jeffery     EXPECT_EQ(buf[0], checkVal);
1309909bf7c2SVarsha Kaverappa }
1310909bf7c2SVarsha Kaverappa 
TEST(msgbuf,pldm_msgbuf_copy_bad)1311909bf7c2SVarsha Kaverappa TEST(msgbuf, pldm_msgbuf_copy_bad)
1312909bf7c2SVarsha Kaverappa {
1313909bf7c2SVarsha Kaverappa     struct pldm_msgbuf _src;
1314909bf7c2SVarsha Kaverappa     struct pldm_msgbuf* src = &_src;
1315909bf7c2SVarsha Kaverappa     struct pldm_msgbuf _dst;
1316909bf7c2SVarsha Kaverappa     struct pldm_msgbuf* dst = &_dst;
1317909bf7c2SVarsha Kaverappa     uint8_t buf[1] = {sizeof(uint8_t)};
1318909bf7c2SVarsha Kaverappa     uint8_t buf1[1] = {sizeof(uint16_t)};
1319909bf7c2SVarsha Kaverappa     uint16_t value = 8;
1320909bf7c2SVarsha Kaverappa 
1321c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(src, 0, buf, sizeof(buf)), PLDM_SUCCESS);
1322c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(dst, 0, buf1, sizeof(buf1)), PLDM_SUCCESS);
1323909bf7c2SVarsha Kaverappa     EXPECT_EQ(pldm_msgbuf_copy(dst, src, value, name),
1324909bf7c2SVarsha Kaverappa               PLDM_ERROR_INVALID_LENGTH);
1325909bf7c2SVarsha Kaverappa 
1326c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(src, 0, buf1, sizeof(buf1)), PLDM_SUCCESS);
1327c8df31c1SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_cc(dst, 0, buf, sizeof(buf)), PLDM_SUCCESS);
1328909bf7c2SVarsha Kaverappa     EXPECT_EQ(pldm_msgbuf_copy(dst, src, value, name),
1329909bf7c2SVarsha Kaverappa               PLDM_ERROR_INVALID_LENGTH);
1330909bf7c2SVarsha Kaverappa }
13318b879600SAndrew Jeffery 
TEST(msgbuf,pldm_msgbuf_copy_string_ascii_exact)13328b879600SAndrew Jeffery TEST(msgbuf, pldm_msgbuf_copy_string_ascii_exact)
13338b879600SAndrew Jeffery {
13348b879600SAndrew Jeffery     const char msg[] = "this is a message";
13358b879600SAndrew Jeffery 
13368b879600SAndrew Jeffery     struct pldm_msgbuf _src;
13378b879600SAndrew Jeffery     struct pldm_msgbuf* src = &_src;
13388b879600SAndrew Jeffery     struct pldm_msgbuf _dst;
13398b879600SAndrew Jeffery     struct pldm_msgbuf* dst = &_dst;
13408b879600SAndrew Jeffery 
13418b879600SAndrew Jeffery     char buf[sizeof(msg)] = {};
13428b879600SAndrew Jeffery 
13438b879600SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, msg, sizeof(msg)), 0);
13448b879600SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf, sizeof(buf)), 0);
13458b879600SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_copy_string_ascii(dst, src), 0);
13468b879600SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(dst), 0);
13478b879600SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(src), 0);
13488b879600SAndrew Jeffery     EXPECT_EQ(0, memcmp(msg, buf, sizeof(buf)));
13498b879600SAndrew Jeffery }
13508b879600SAndrew Jeffery 
TEST(msgbuf,pldm_msgbuf_copy_string_ascii_dst_exceeds_src)13518b879600SAndrew Jeffery TEST(msgbuf, pldm_msgbuf_copy_string_ascii_dst_exceeds_src)
13528b879600SAndrew Jeffery {
13538b879600SAndrew Jeffery     const char msg[] = "this is a message";
13548b879600SAndrew Jeffery 
13558b879600SAndrew Jeffery     struct pldm_msgbuf _src;
13568b879600SAndrew Jeffery     struct pldm_msgbuf* src = &_src;
13578b879600SAndrew Jeffery     struct pldm_msgbuf _dst;
13588b879600SAndrew Jeffery     struct pldm_msgbuf* dst = &_dst;
13598b879600SAndrew Jeffery 
13608b879600SAndrew Jeffery     char buf[sizeof(msg) + 1] = {};
13618b879600SAndrew Jeffery 
13628b879600SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, msg, sizeof(msg)), 0);
13638b879600SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf, sizeof(buf)), 0);
13648b879600SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_copy_string_ascii(dst, src), 0);
13658b879600SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(dst), 0);
13668b879600SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(src), 0);
13678b879600SAndrew Jeffery     EXPECT_EQ(0, memcmp(buf, msg, sizeof(msg)));
13688b879600SAndrew Jeffery }
13698b879600SAndrew Jeffery 
TEST(msgbuf,pldm_msgbuf_copy_string_ascii_src_exceeds_dst)13708b879600SAndrew Jeffery TEST(msgbuf, pldm_msgbuf_copy_string_ascii_src_exceeds_dst)
13718b879600SAndrew Jeffery {
13728b879600SAndrew Jeffery     const char msg[] = "this is a message";
13738b879600SAndrew Jeffery 
13748b879600SAndrew Jeffery     struct pldm_msgbuf _src;
13758b879600SAndrew Jeffery     struct pldm_msgbuf* src = &_src;
13768b879600SAndrew Jeffery     struct pldm_msgbuf _dst;
13778b879600SAndrew Jeffery     struct pldm_msgbuf* dst = &_dst;
13788b879600SAndrew Jeffery 
13798b879600SAndrew Jeffery     char buf[sizeof(msg) - 1] = {};
13808b879600SAndrew Jeffery 
13818b879600SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, msg, sizeof(msg)), 0);
13828b879600SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf, sizeof(buf)), 0);
13838b879600SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_copy_string_ascii(dst, src), -EOVERFLOW);
13848b879600SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(dst), -EOVERFLOW);
13858b879600SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(src), 0);
13868b879600SAndrew Jeffery }
13878b879600SAndrew Jeffery 
TEST(msgbuf,pldm_msgbuf_copy_string_ascii_unterminated_src)13888b879600SAndrew Jeffery TEST(msgbuf, pldm_msgbuf_copy_string_ascii_unterminated_src)
13898b879600SAndrew Jeffery {
13908b879600SAndrew Jeffery     const char msg[] = {'a'};
13918b879600SAndrew Jeffery 
13928b879600SAndrew Jeffery     struct pldm_msgbuf _src;
13938b879600SAndrew Jeffery     struct pldm_msgbuf* src = &_src;
13948b879600SAndrew Jeffery     struct pldm_msgbuf _dst;
13958b879600SAndrew Jeffery     struct pldm_msgbuf* dst = &_dst;
13968b879600SAndrew Jeffery 
13978b879600SAndrew Jeffery     char buf[sizeof(msg)] = {};
13988b879600SAndrew Jeffery 
13998b879600SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, msg, sizeof(msg)), 0);
14008b879600SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf, sizeof(buf)), 0);
14018b879600SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_copy_string_ascii(dst, src), -EOVERFLOW);
14028b879600SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(dst), 0);
14038b879600SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(src), -EOVERFLOW);
14048b879600SAndrew Jeffery }
140556f73f95SAndrew Jeffery 
TEST(msgbuf,pldm_msgbuf_copy_utf16_exact)140656f73f95SAndrew Jeffery TEST(msgbuf, pldm_msgbuf_copy_utf16_exact)
140756f73f95SAndrew Jeffery {
140856f73f95SAndrew Jeffery     const char16_t msg[] = u"this is a message";
140956f73f95SAndrew Jeffery 
141056f73f95SAndrew Jeffery     struct pldm_msgbuf _src;
141156f73f95SAndrew Jeffery     struct pldm_msgbuf* src = &_src;
141256f73f95SAndrew Jeffery     struct pldm_msgbuf _dst;
141356f73f95SAndrew Jeffery     struct pldm_msgbuf* dst = &_dst;
141456f73f95SAndrew Jeffery 
141556f73f95SAndrew Jeffery     char buf[sizeof(msg)] = {};
141656f73f95SAndrew Jeffery 
141756f73f95SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, msg, sizeof(msg)), 0);
141856f73f95SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf, sizeof(buf)), 0);
141956f73f95SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_copy_string_utf16(dst, src), 0);
142056f73f95SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(dst), 0);
142156f73f95SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(src), 0);
142256f73f95SAndrew Jeffery     EXPECT_EQ(0, memcmp(buf, msg, sizeof(msg)));
142356f73f95SAndrew Jeffery }
142456f73f95SAndrew Jeffery 
TEST(msgbuf,pldm_msgbuf_copy_utf16_dst_exceeds_src)142556f73f95SAndrew Jeffery TEST(msgbuf, pldm_msgbuf_copy_utf16_dst_exceeds_src)
142656f73f95SAndrew Jeffery {
142756f73f95SAndrew Jeffery     const char16_t msg[] = u"this is a message";
142856f73f95SAndrew Jeffery 
142956f73f95SAndrew Jeffery     struct pldm_msgbuf _src;
143056f73f95SAndrew Jeffery     struct pldm_msgbuf* src = &_src;
143156f73f95SAndrew Jeffery     struct pldm_msgbuf _dst;
143256f73f95SAndrew Jeffery     struct pldm_msgbuf* dst = &_dst;
143356f73f95SAndrew Jeffery 
143456f73f95SAndrew Jeffery     char buf[sizeof(msg) + 1] = {};
143556f73f95SAndrew Jeffery 
143656f73f95SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, msg, sizeof(msg)), 0);
143756f73f95SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf, sizeof(buf)), 0);
143856f73f95SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_copy_string_utf16(dst, src), 0);
143956f73f95SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(dst), 0);
144056f73f95SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(src), 0);
144156f73f95SAndrew Jeffery     EXPECT_EQ(0, memcmp(buf, msg, sizeof(msg)));
144256f73f95SAndrew Jeffery }
144356f73f95SAndrew Jeffery 
TEST(msgbuf,pldm_msgbuf_copy_utf16_src_exceeds_dst)144456f73f95SAndrew Jeffery TEST(msgbuf, pldm_msgbuf_copy_utf16_src_exceeds_dst)
144556f73f95SAndrew Jeffery {
144656f73f95SAndrew Jeffery     const char16_t msg[] = u"this is a message";
144756f73f95SAndrew Jeffery 
144856f73f95SAndrew Jeffery     struct pldm_msgbuf _src;
144956f73f95SAndrew Jeffery     struct pldm_msgbuf* src = &_src;
145056f73f95SAndrew Jeffery     struct pldm_msgbuf _dst;
145156f73f95SAndrew Jeffery     struct pldm_msgbuf* dst = &_dst;
145256f73f95SAndrew Jeffery 
145356f73f95SAndrew Jeffery     char buf[sizeof(msg) - 1] = {};
145456f73f95SAndrew Jeffery 
145556f73f95SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, msg, sizeof(msg)), 0);
145656f73f95SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf, sizeof(buf)), 0);
145756f73f95SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_copy_string_utf16(dst, src), -EOVERFLOW);
145856f73f95SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(dst), -EOVERFLOW);
145956f73f95SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(src), 0);
146056f73f95SAndrew Jeffery }
146156f73f95SAndrew Jeffery 
TEST(msgbuf,pldm_msgbuf_copy_utf16_unterminated_src)146256f73f95SAndrew Jeffery TEST(msgbuf, pldm_msgbuf_copy_utf16_unterminated_src)
146356f73f95SAndrew Jeffery {
146456f73f95SAndrew Jeffery     const char16_t msg[] = {u'a'};
146556f73f95SAndrew Jeffery 
146656f73f95SAndrew Jeffery     struct pldm_msgbuf _src;
146756f73f95SAndrew Jeffery     struct pldm_msgbuf* src = &_src;
146856f73f95SAndrew Jeffery     struct pldm_msgbuf _dst;
146956f73f95SAndrew Jeffery     struct pldm_msgbuf* dst = &_dst;
147056f73f95SAndrew Jeffery 
147156f73f95SAndrew Jeffery     char buf[sizeof(msg)] = {};
147256f73f95SAndrew Jeffery 
147356f73f95SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, msg, sizeof(msg)), 0);
147456f73f95SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf, sizeof(buf)), 0);
147556f73f95SAndrew Jeffery     EXPECT_EQ(pldm_msgbuf_copy_string_utf16(dst, src), -EOVERFLOW);
147656f73f95SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(dst), 0);
147756f73f95SAndrew Jeffery     ASSERT_EQ(pldm_msgbuf_destroy(src), -EOVERFLOW);
147856f73f95SAndrew Jeffery }
1479