blob: 992475b409aefe56125eb0a8c4b199b59b13340b [file] [log] [blame]
Andrew Jefferyc63f63a2023-02-24 22:29:33 +10301#include <endian.h>
Thu Nguyen15237782024-07-02 09:30:41 +00002#include <libpldm/utils.h>
Andrew Jefferyc63f63a2023-02-24 22:29:33 +10303
4#include <cfloat>
5
6#include <gtest/gtest.h>
7
8/* We're exercising the implementation so disable the asserts for now */
9#ifndef NDEBUG
10#define NDEBUG 1
11#endif
12
John Chung7a8d9322025-08-27 20:56:19 -050013#include "msgbuf.hpp"
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103014
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103015TEST(msgbuf, init_bad_minsize)
16{
John Chung7a8d9322025-08-27 20:56:19 -050017 struct pldm_msgbuf_rw _ctx;
18 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103019 uint8_t buf[1] = {};
20
Andrew Jeffery830c1eb2024-10-04 10:48:10 +093021 EXPECT_NE(pldm_msgbuf_init_errno(ctx, sizeof(buf) + 1U, buf, sizeof(buf)),
22 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103023}
24
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103025TEST(msgbuf, init_bad_len)
26{
John Chung7a8d9322025-08-27 20:56:19 -050027 struct pldm_msgbuf_rw _ctx;
28 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103029 uint8_t buf[1] = {};
30
Andrew Jeffery830c1eb2024-10-04 10:48:10 +093031 EXPECT_NE(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, SIZE_MAX), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103032}
33
34TEST(msgbuf, init_overflow)
35{
John Chung7a8d9322025-08-27 20:56:19 -050036 struct pldm_msgbuf_rw _ctx;
37 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103038 // NOLINTNEXTLINE(performance-no-int-to-ptr)
Andrew Jeffery07febdb2024-05-17 14:17:14 +093039 void* buf = (void*)UINTPTR_MAX;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103040
Andrew Jeffery830c1eb2024-10-04 10:48:10 +093041 EXPECT_NE(pldm_msgbuf_init_errno(ctx, 0, buf, 2), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103042}
43
44TEST(msgbuf, init_success)
45{
John Chung7a8d9322025-08-27 20:56:19 -050046 struct pldm_msgbuf_rw _ctx;
47 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103048 uint8_t buf[1] = {};
49
Andrew Jeffery830c1eb2024-10-04 10:48:10 +093050 EXPECT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103051}
52
53TEST(msgbuf, destroy_none)
54{
John Chung7a8d9322025-08-27 20:56:19 -050055 struct pldm_msgbuf_rw _ctx;
56 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103057 uint8_t buf[1] = {};
58
Andrew Jeffery830c1eb2024-10-04 10:48:10 +093059 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +103060 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103061}
62
63TEST(msgbuf, destroy_exact)
64{
John Chung7a8d9322025-08-27 20:56:19 -050065 struct pldm_msgbuf_ro _ctx;
66 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103067 uint8_t buf[1] = {0xa5};
68 uint8_t val;
69
Andrew Jeffery830c1eb2024-10-04 10:48:10 +093070 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
71 EXPECT_EQ(pldm_msgbuf_extract_uint8(ctx, val), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103072 EXPECT_EQ(val, 0xa5);
Andrew Jeffery70d21c92025-03-05 12:59:42 +103073 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103074}
75
76TEST(msgbuf, destroy_over)
77{
John Chung7a8d9322025-08-27 20:56:19 -050078 struct pldm_msgbuf_ro _ctx;
79 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103080 uint8_t buf[1] = {0xa5};
81 uint8_t val;
82
Andrew Jeffery830c1eb2024-10-04 10:48:10 +093083 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
84 ASSERT_EQ(pldm_msgbuf_extract_uint8(ctx, val), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103085 ASSERT_EQ(val, 0xa5);
Andrew Jeffery830c1eb2024-10-04 10:48:10 +093086 EXPECT_NE(pldm_msgbuf_extract_uint8(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +103087 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103088}
89
90TEST(msgbuf, destroy_under)
91{
John Chung7a8d9322025-08-27 20:56:19 -050092 struct pldm_msgbuf_ro _ctx;
93 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103094 uint8_t buf[2] = {0x5a, 0xa5};
95 uint8_t val;
96
Andrew Jeffery830c1eb2024-10-04 10:48:10 +093097 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
98 EXPECT_EQ(pldm_msgbuf_extract_uint8(ctx, val), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +103099 EXPECT_EQ(val, 0x5a);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030100 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030101}
102
103TEST(msgbuf, extract_one_uint8)
104{
John Chung7a8d9322025-08-27 20:56:19 -0500105 struct pldm_msgbuf_ro _ctx;
106 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030107 uint8_t buf[1] = {0xa5};
108 uint8_t val;
109
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930110 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
111 EXPECT_EQ(pldm_msgbuf_extract_uint8(ctx, val), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030112 EXPECT_EQ(val, 0xa5);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030113 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030114}
115
116TEST(msgbuf, extract_over_uint8)
117{
John Chung7a8d9322025-08-27 20:56:19 -0500118 struct pldm_msgbuf_ro _ctx;
119 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030120 uint8_t buf[1] = {};
121 uint8_t val;
122
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930123 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
124 EXPECT_NE(pldm_msgbuf_extract_uint8(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030125 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030126}
127
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930128TEST(msgbuf, extract_under_uint8)
129{
John Chung7a8d9322025-08-27 20:56:19 -0500130 struct pldm_msgbuf_ro _ctx;
131 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930132
133 uint8_t buf[1] = {};
134 uint8_t val;
135
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930136 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930137 ctx->remaining = INTMAX_MIN;
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930138 EXPECT_NE(pldm_msgbuf_extract_uint8(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030139 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930140}
141
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030142TEST(msgbuf, extract_one_int8)
143{
John Chung7a8d9322025-08-27 20:56:19 -0500144 struct pldm_msgbuf_ro _ctx;
145 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030146 int8_t buf[1] = {-1};
147 int8_t val;
148
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930149 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
150 EXPECT_EQ(pldm_msgbuf_extract_int8(ctx, val), 0);
Andrew Jeffery71a0a7e2025-03-08 22:46:32 +1030151 ASSERT_EQ(pldm_msgbuf_complete(ctx), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030152 EXPECT_EQ(val, -1);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030153}
154
155TEST(msgbuf, extract_over_int8)
156{
John Chung7a8d9322025-08-27 20:56:19 -0500157 struct pldm_msgbuf_ro _ctx;
158 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030159 int8_t buf[1] = {};
160 int8_t val;
161
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930162 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
163 EXPECT_NE(pldm_msgbuf_extract_int8(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030164 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030165}
166
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930167TEST(msgbuf, extract_under_int8)
168{
John Chung7a8d9322025-08-27 20:56:19 -0500169 struct pldm_msgbuf_ro _ctx;
170 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930171
172 uint8_t buf[1] = {};
173 int8_t val;
174
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930175 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930176 ctx->remaining = INTMAX_MIN;
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930177 EXPECT_NE(pldm_msgbuf_extract_int8(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030178 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930179}
180
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030181TEST(msgbuf, extract_one_uint16)
182{
John Chung7a8d9322025-08-27 20:56:19 -0500183 struct pldm_msgbuf_ro _ctx;
184 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030185 uint16_t buf[1] = {htole16(0x5aa5)};
186 uint16_t val = {};
187
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930188 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
189 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctx, val), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030190 EXPECT_EQ(val, 0x5aa5);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030191 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030192}
193
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930194TEST(msgbuf, extract_under_uint16)
195{
John Chung7a8d9322025-08-27 20:56:19 -0500196 struct pldm_msgbuf_ro _ctx;
197 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930198
199 uint16_t buf[1] = {};
200 uint16_t val;
201
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930202 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930203 ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930204 EXPECT_NE(pldm_msgbuf_extract_uint16(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030205 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930206}
207
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030208TEST(msgbuf, extract_over_uint16)
209{
John Chung7a8d9322025-08-27 20:56:19 -0500210 struct pldm_msgbuf_ro _ctx;
211 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030212 uint16_t buf[1] = {};
213 uint16_t val;
214
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930215 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
216 EXPECT_NE(pldm_msgbuf_extract_uint16(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030217 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030218}
219
220TEST(msgbuf, extract_one_int16)
221{
John Chung7a8d9322025-08-27 20:56:19 -0500222 struct pldm_msgbuf_ro _ctx;
223 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030224 int16_t buf[1] = {(int16_t)(htole16((uint16_t)INT16_MIN))};
225 int16_t val;
226
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930227 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
Andrew Jefferyfcc15b82025-08-12 06:12:24 +0000228 ASSERT_EQ(pldm_msgbuf_extract_int16(ctx, val), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030229 EXPECT_EQ(val, INT16_MIN);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030230 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030231}
232
233TEST(msgbuf, extract_over_int16)
234{
John Chung7a8d9322025-08-27 20:56:19 -0500235 struct pldm_msgbuf_ro _ctx;
236 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030237 int16_t buf[1] = {};
238 int16_t val;
239
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930240 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
241 EXPECT_NE(pldm_msgbuf_extract_int16(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030242 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030243}
244
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930245TEST(msgbuf, extract_under_int16)
246{
John Chung7a8d9322025-08-27 20:56:19 -0500247 struct pldm_msgbuf_ro _ctx;
248 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930249
250 int16_t buf[1] = {};
251 int16_t val;
252
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930253 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930254 ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930255 EXPECT_NE(pldm_msgbuf_extract_int16(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030256 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930257}
258
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030259TEST(msgbuf, extract_one_uint32)
260{
John Chung7a8d9322025-08-27 20:56:19 -0500261 struct pldm_msgbuf_ro _ctx;
262 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030263 uint32_t buf[1] = {htole32(0x5a00ffa5)};
264 uint32_t val;
265
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930266 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
Andrew Jefferyfcc15b82025-08-12 06:12:24 +0000267 ASSERT_EQ(pldm_msgbuf_extract_uint32(ctx, val), 0);
Andrew Jeffery94f7fd62025-09-16 11:28:05 +0930268 EXPECT_EQ(val, 0x5a00ffa5u);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030269 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030270}
271
272TEST(msgbuf, extract_over_uint32)
273{
John Chung7a8d9322025-08-27 20:56:19 -0500274 struct pldm_msgbuf_ro _ctx;
275 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030276 uint32_t buf[1] = {};
277 uint32_t val;
278
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930279 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
280 EXPECT_NE(pldm_msgbuf_extract_uint32(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030281 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030282}
283
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930284TEST(msgbuf, extract_under_uint32)
285{
John Chung7a8d9322025-08-27 20:56:19 -0500286 struct pldm_msgbuf_ro _ctx;
287 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930288
289 uint32_t buf[1] = {};
290 uint32_t val;
291
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930292 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930293 ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930294 EXPECT_NE(pldm_msgbuf_extract_uint32(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030295 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930296}
297
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030298TEST(msgbuf, extract_one_int32)
299{
John Chung7a8d9322025-08-27 20:56:19 -0500300 struct pldm_msgbuf_ro _ctx;
301 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030302 int32_t buf[1] = {(int32_t)(htole32((uint32_t)(INT32_MIN)))};
303 int32_t val;
304
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930305 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
306 EXPECT_EQ(pldm_msgbuf_extract_int32(ctx, val), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030307 EXPECT_EQ(val, INT32_MIN);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030308 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030309}
310
311TEST(msgbuf, extract_over_int32)
312{
John Chung7a8d9322025-08-27 20:56:19 -0500313 struct pldm_msgbuf_ro _ctx;
314 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030315 int32_t buf[1] = {};
316 int32_t val;
317
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930318 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
319 EXPECT_NE(pldm_msgbuf_extract_int32(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030320 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030321}
322
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930323TEST(msgbuf, extract_under_int32)
324{
John Chung7a8d9322025-08-27 20:56:19 -0500325 struct pldm_msgbuf_ro _ctx;
326 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930327
328 int32_t buf[1] = {};
329 int32_t val;
330
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930331 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930332 ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930333 EXPECT_NE(pldm_msgbuf_extract_int32(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030334 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930335}
336
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030337TEST(msgbuf, extract_one_real32)
338{
John Chung7a8d9322025-08-27 20:56:19 -0500339 struct pldm_msgbuf_ro _ctx;
340 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030341 uint32_t buf[1] = {};
342 uint32_t xform;
343 real32_t val;
344
345 val = FLT_MAX;
346 memcpy(&xform, &val, sizeof(val));
347 buf[0] = htole32(xform);
348 val = 0;
349
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930350 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
351 EXPECT_EQ(pldm_msgbuf_extract_real32(ctx, val), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030352 EXPECT_EQ(val, FLT_MAX);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030353 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030354}
355
356TEST(msgbuf, extract_over_real32)
357{
John Chung7a8d9322025-08-27 20:56:19 -0500358 struct pldm_msgbuf_ro _ctx;
359 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030360 real32_t buf[1] = {};
361 real32_t val;
362
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930363 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
364 EXPECT_NE(pldm_msgbuf_extract_real32(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030365 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jefferyc63f63a2023-02-24 22:29:33 +1030366}
Andrew Jeffery369b1212023-04-20 15:44:48 +0930367
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930368TEST(msgbuf, extract_under_real32)
369{
John Chung7a8d9322025-08-27 20:56:19 -0500370 struct pldm_msgbuf_ro _ctx;
371 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930372
373 real32_t buf[1] = {};
374 real32_t val;
375
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930376 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930377 ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930378 EXPECT_NE(pldm_msgbuf_extract_real32(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030379 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930380}
381
Andrew Jeffery369b1212023-04-20 15:44:48 +0930382TEST(msgbuf, extract_array_uint8_buf0_req0)
383{
John Chung7a8d9322025-08-27 20:56:19 -0500384 struct pldm_msgbuf_ro _ctx;
385 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery369b1212023-04-20 15:44:48 +0930386 uint8_t buf[1] = {};
387 uint8_t arr[1];
388
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930389 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
390 EXPECT_EQ(pldm_msgbuf_extract_array_uint8(ctx, 0, arr, 0), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030391 ASSERT_EQ(pldm_msgbuf_complete(ctx), 0);
Andrew Jeffery369b1212023-04-20 15:44:48 +0930392}
393
394TEST(msgbuf, extract_array_uint8_buf1_req1)
395{
John Chung7a8d9322025-08-27 20:56:19 -0500396 struct pldm_msgbuf_ro _ctx;
397 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery369b1212023-04-20 15:44:48 +0930398 uint8_t buf[1] = {};
399 uint8_t arr[1];
400
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930401 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000402 EXPECT_EQ(
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930403 pldm_msgbuf_extract_array_uint8(ctx, sizeof(arr), arr, sizeof(arr)), 0);
Andrew Jeffery369b1212023-04-20 15:44:48 +0930404 EXPECT_EQ(arr[0], 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030405 ASSERT_EQ(pldm_msgbuf_complete(ctx), 0);
Andrew Jeffery369b1212023-04-20 15:44:48 +0930406}
407
408TEST(msgbuf, extract_array_uint8_buf1_req2)
409{
John Chung7a8d9322025-08-27 20:56:19 -0500410 struct pldm_msgbuf_ro _ctx;
411 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery369b1212023-04-20 15:44:48 +0930412 uint8_t buf[1] = {};
413 uint8_t arr[2];
414
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930415 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000416 EXPECT_NE(
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930417 pldm_msgbuf_extract_array_uint8(ctx, sizeof(arr), arr, sizeof(arr)), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030418 ASSERT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery369b1212023-04-20 15:44:48 +0930419}
Andrew Jefferydb7b8322023-04-12 23:05:21 +0930420
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930421TEST(msgbuf, extract_under_array_uint8)
422{
John Chung7a8d9322025-08-27 20:56:19 -0500423 struct pldm_msgbuf_ro _ctx;
424 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930425 uint8_t buf[1] = {};
426 uint8_t arr[1];
427
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930428 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930429 ctx->remaining = INTMAX_MIN;
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930430 EXPECT_NE(pldm_msgbuf_extract_array_uint8(ctx, 1, arr, 1), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030431 ASSERT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930432}
433
Andrew Jeffery1c571442024-07-08 10:25:48 +0930434TEST(msgbuf, extract_array_char_buf0_req0)
435{
John Chung7a8d9322025-08-27 20:56:19 -0500436 struct pldm_msgbuf_ro _ctx;
437 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery1c571442024-07-08 10:25:48 +0930438 char buf[1] = {'\0'};
439 char arr[1] = {'1'};
440
441 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000442 EXPECT_EQ(pldm_msgbuf_extract_array_char(ctx, 0, arr, 0), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030443 ASSERT_EQ(pldm_msgbuf_complete(ctx), 0);
Andrew Jeffery1c571442024-07-08 10:25:48 +0930444}
445
446TEST(msgbuf, extract_array_char_buf1_req1)
447{
John Chung7a8d9322025-08-27 20:56:19 -0500448 struct pldm_msgbuf_ro _ctx;
449 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery1c571442024-07-08 10:25:48 +0930450 char buf[1] = {'\0'};
451 char arr[1] = {'1'};
452
453 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000454 EXPECT_EQ(
455 pldm_msgbuf_extract_array_char(ctx, sizeof(arr), arr, sizeof(arr)), 0);
Andrew Jeffery1c571442024-07-08 10:25:48 +0930456 EXPECT_EQ(arr[0], '\0');
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030457 ASSERT_EQ(pldm_msgbuf_complete(ctx), 0);
Andrew Jeffery1c571442024-07-08 10:25:48 +0930458}
459
460TEST(msgbuf, extract_array_char_buf1_req2)
461{
John Chung7a8d9322025-08-27 20:56:19 -0500462 struct pldm_msgbuf_ro _ctx;
463 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery1c571442024-07-08 10:25:48 +0930464 char buf[1] = {'\0'};
465 char arr[2] = {'1', '2'};
466
467 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000468 EXPECT_NE(
469 pldm_msgbuf_extract_array_char(ctx, sizeof(arr), arr, sizeof(arr)), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030470 ASSERT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery1c571442024-07-08 10:25:48 +0930471}
472
473TEST(msgbuf, extract_under_array_char)
474{
John Chung7a8d9322025-08-27 20:56:19 -0500475 struct pldm_msgbuf_ro _ctx;
476 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery1c571442024-07-08 10:25:48 +0930477 char buf[1] = {'\0'};
478 char arr[1] = {'1'};
479
480 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
481 ctx->remaining = INTMAX_MIN;
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000482 EXPECT_NE(pldm_msgbuf_extract_array_char(ctx, 1, arr, 1), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030483 ASSERT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery1c571442024-07-08 10:25:48 +0930484}
485
Andrew Jefferydb7b8322023-04-12 23:05:21 +0930486TEST(msgbuf, consumed_under)
487{
John Chung7a8d9322025-08-27 20:56:19 -0500488 struct pldm_msgbuf_rw _ctx;
489 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jefferydb7b8322023-04-12 23:05:21 +0930490 uint8_t buf[1] = {};
491
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930492 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030493 EXPECT_EQ(pldm_msgbuf_complete_consumed(ctx), -EBADMSG);
Andrew Jefferydb7b8322023-04-12 23:05:21 +0930494}
495
496TEST(msgbuf, consumed_exact)
497{
John Chung7a8d9322025-08-27 20:56:19 -0500498 struct pldm_msgbuf_ro _ctx;
499 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferydb7b8322023-04-12 23:05:21 +0930500 uint8_t buf[1] = {};
501 uint8_t val;
502
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930503 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
504 EXPECT_EQ(pldm_msgbuf_extract_uint8(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030505 EXPECT_EQ(pldm_msgbuf_complete_consumed(ctx), 0);
Andrew Jefferydb7b8322023-04-12 23:05:21 +0930506}
507
508TEST(msgbuf, consumed_over)
509{
John Chung7a8d9322025-08-27 20:56:19 -0500510 struct pldm_msgbuf_ro _ctx;
511 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jefferydb7b8322023-04-12 23:05:21 +0930512 uint8_t buf[1] = {};
Andrew Jefferye5f12532024-10-01 12:18:49 +0930513 uint8_t valid;
514 uint8_t invalid;
Andrew Jefferydb7b8322023-04-12 23:05:21 +0930515
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930516 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
517 EXPECT_EQ(pldm_msgbuf_extract_uint8(ctx, valid), 0);
518 EXPECT_NE(pldm_msgbuf_extract_uint8(ctx, invalid), 0);
Andrew Jeffery63b5a662025-03-05 13:26:12 +1030519 EXPECT_EQ(pldm_msgbuf_complete_consumed(ctx), -EOVERFLOW);
Andrew Jefferydb7b8322023-04-12 23:05:21 +0930520}
Thu Nguyen062c8762023-04-22 20:45:04 +0700521
522TEST(msgbuf, pldm_msgbuf_insert_int32_good)
523{
John Chung7a8d9322025-08-27 20:56:19 -0500524 struct pldm_msgbuf_rw _ctx;
525 struct pldm_msgbuf_rw* ctx = &_ctx;
Thu Nguyen062c8762023-04-22 20:45:04 +0700526 int32_t src = -12345;
527 int32_t checkVal = 0;
528 uint8_t buf[sizeof(int32_t)] = {};
529
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930530 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
531 EXPECT_EQ(pldm_msgbuf_insert_int32(ctx, src), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700532
John Chung7a8d9322025-08-27 20:56:19 -0500533 struct pldm_msgbuf_ro _ctxExtract;
534 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen062c8762023-04-22 20:45:04 +0700535
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930536 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)), 0);
537 EXPECT_EQ(pldm_msgbuf_extract_int32(ctxExtract, checkVal), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700538
539 EXPECT_EQ(src, checkVal);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030540 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
541 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700542}
543
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930544TEST(msgbuf, insert_under_int32)
545{
John Chung7a8d9322025-08-27 20:56:19 -0500546 struct pldm_msgbuf_rw _ctx;
547 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930548
549 int32_t buf[1] = {};
550 int32_t val = 0;
551
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930552 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930553 ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930554 EXPECT_NE(pldm_msgbuf_insert_int32(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030555 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930556}
557
Thu Nguyen062c8762023-04-22 20:45:04 +0700558TEST(msgbuf, pldm_msgbuf_insert_uint32_good)
559{
John Chung7a8d9322025-08-27 20:56:19 -0500560 struct pldm_msgbuf_rw _ctx;
561 struct pldm_msgbuf_rw* ctx = &_ctx;
Thu Nguyen062c8762023-04-22 20:45:04 +0700562 uint32_t src = 0xf1223344;
563 uint32_t checkVal = 0;
564 uint8_t buf[sizeof(uint32_t)] = {};
565
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930566 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
567 EXPECT_EQ(pldm_msgbuf_insert_uint32(ctx, src), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700568
John Chung7a8d9322025-08-27 20:56:19 -0500569 struct pldm_msgbuf_ro _ctxExtract;
570 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen062c8762023-04-22 20:45:04 +0700571
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930572 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)), 0);
573 EXPECT_EQ(pldm_msgbuf_extract_uint32(ctxExtract, checkVal), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700574
575 EXPECT_EQ(src, checkVal);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030576 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
577 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700578}
579
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930580TEST(msgbuf, insert_under_uint32)
581{
John Chung7a8d9322025-08-27 20:56:19 -0500582 struct pldm_msgbuf_rw _ctx;
583 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930584
585 uint32_t buf[1] = {};
586 uint32_t val = 0;
587
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930588 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930589 ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930590 EXPECT_NE(pldm_msgbuf_insert_uint32(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030591 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930592}
593
Thu Nguyen062c8762023-04-22 20:45:04 +0700594TEST(msgbuf, pldm_msgbuf_insert_uint16_good)
595{
John Chung7a8d9322025-08-27 20:56:19 -0500596 struct pldm_msgbuf_rw _ctx;
597 struct pldm_msgbuf_rw* ctx = &_ctx;
Thu Nguyen062c8762023-04-22 20:45:04 +0700598 uint16_t src = 0xf344;
599 uint16_t checkVal = 0;
600 uint8_t buf[sizeof(uint16_t)] = {};
601
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930602 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(uint16_t)), 0);
603 EXPECT_EQ(pldm_msgbuf_insert_uint16(ctx, src), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700604
John Chung7a8d9322025-08-27 20:56:19 -0500605 struct pldm_msgbuf_ro _ctxExtract;
606 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen062c8762023-04-22 20:45:04 +0700607
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930608 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)), 0);
609 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, checkVal), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700610
611 EXPECT_EQ(src, checkVal);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030612 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
613 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700614}
615
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930616TEST(msgbuf, insert_under_uint16)
617{
John Chung7a8d9322025-08-27 20:56:19 -0500618 struct pldm_msgbuf_rw _ctx;
619 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930620
621 uint16_t buf[1] = {};
622 uint16_t val = 0;
623
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930624 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930625 ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930626 EXPECT_NE(pldm_msgbuf_insert_uint16(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030627 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930628}
629
Thu Nguyen062c8762023-04-22 20:45:04 +0700630TEST(msgbuf, pldm_msgbuf_insert_int16_good)
631{
John Chung7a8d9322025-08-27 20:56:19 -0500632 struct pldm_msgbuf_rw _ctx;
633 struct pldm_msgbuf_rw* ctx = &_ctx;
Thu Nguyen062c8762023-04-22 20:45:04 +0700634 int16_t src = -12;
635 int16_t checkVal = 0;
636 uint8_t buf[sizeof(int16_t)] = {};
637
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930638 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(uint16_t)), 0);
639 EXPECT_EQ(pldm_msgbuf_insert_int16(ctx, src), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700640
John Chung7a8d9322025-08-27 20:56:19 -0500641 struct pldm_msgbuf_ro _ctxExtract;
642 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen062c8762023-04-22 20:45:04 +0700643
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930644 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)), 0);
645 EXPECT_EQ(pldm_msgbuf_extract_int16(ctxExtract, checkVal), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700646
647 EXPECT_EQ(src, checkVal);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030648 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
649 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700650}
651
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930652TEST(msgbuf, insert_under_int16)
653{
John Chung7a8d9322025-08-27 20:56:19 -0500654 struct pldm_msgbuf_rw _ctx;
655 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930656
657 int16_t buf[1] = {};
658 int16_t val = 0;
659
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930660 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930661 ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930662 EXPECT_NE(pldm_msgbuf_insert_int16(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030663 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930664}
665
Thu Nguyen062c8762023-04-22 20:45:04 +0700666TEST(msgbuf, pldm_msgbuf_insert_uint8_good)
667{
John Chung7a8d9322025-08-27 20:56:19 -0500668 struct pldm_msgbuf_rw _ctx;
669 struct pldm_msgbuf_rw* ctx = &_ctx;
Thu Nguyen062c8762023-04-22 20:45:04 +0700670 uint8_t src = 0xf4;
671 uint8_t checkVal = 0;
672 uint8_t buf[sizeof(uint8_t)] = {};
673
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930674 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
675 EXPECT_EQ(pldm_msgbuf_insert_uint8(ctx, src), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700676
John Chung7a8d9322025-08-27 20:56:19 -0500677 struct pldm_msgbuf_ro _ctxExtract;
678 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen062c8762023-04-22 20:45:04 +0700679
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930680 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)), 0);
681 EXPECT_EQ(pldm_msgbuf_extract_uint8(ctxExtract, checkVal), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700682
683 EXPECT_EQ(src, checkVal);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030684 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
685 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700686}
687
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930688TEST(msgbuf, insert_under_uint8)
689{
John Chung7a8d9322025-08-27 20:56:19 -0500690 struct pldm_msgbuf_rw _ctx;
691 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930692
693 uint8_t buf[1] = {};
694 uint8_t val = 0;
695
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930696 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930697 ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930698 EXPECT_NE(pldm_msgbuf_insert_uint8(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030699 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930700}
701
Thu Nguyen062c8762023-04-22 20:45:04 +0700702TEST(msgbuf, pldm_msgbuf_insert_int8_good)
703{
John Chung7a8d9322025-08-27 20:56:19 -0500704 struct pldm_msgbuf_rw _ctx;
705 struct pldm_msgbuf_rw* ctx = &_ctx;
Thu Nguyen062c8762023-04-22 20:45:04 +0700706 int8_t src = -4;
707 int8_t checkVal = 0;
708 uint8_t buf[sizeof(int8_t)] = {};
709
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930710 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
711 EXPECT_EQ(pldm_msgbuf_insert_int8(ctx, src), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700712
John Chung7a8d9322025-08-27 20:56:19 -0500713 struct pldm_msgbuf_ro _ctxExtract;
714 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen062c8762023-04-22 20:45:04 +0700715
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930716 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)), 0);
717 EXPECT_EQ(pldm_msgbuf_extract_int8(ctxExtract, checkVal), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700718
719 EXPECT_EQ(src, checkVal);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030720 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
721 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700722}
723
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930724TEST(msgbuf, insert_under_int8)
725{
John Chung7a8d9322025-08-27 20:56:19 -0500726 struct pldm_msgbuf_rw _ctx;
727 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930728
729 int8_t buf[1] = {};
730 int8_t val = 0;
731
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930732 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930733 ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930734 EXPECT_NE(pldm_msgbuf_insert_int8(ctx, val), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030735 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930736}
737
Thu Nguyen062c8762023-04-22 20:45:04 +0700738TEST(msgbuf, pldm_msgbuf_insert_array_uint8_good)
739{
John Chung7a8d9322025-08-27 20:56:19 -0500740 struct pldm_msgbuf_rw _ctx;
741 struct pldm_msgbuf_rw* ctx = &_ctx;
Thu Nguyen062c8762023-04-22 20:45:04 +0700742 uint8_t src[6] = {0x11, 0x22, 0x44, 0x55, 0x66, 0x77};
743 uint8_t buf[6] = {};
744 uint8_t retBuff[6] = {};
745
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930746 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000747 EXPECT_EQ(
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930748 pldm_msgbuf_insert_array_uint8(ctx, sizeof(src), src, sizeof(src)), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700749
John Chung7a8d9322025-08-27 20:56:19 -0500750 struct pldm_msgbuf_ro _ctxExtract;
751 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen062c8762023-04-22 20:45:04 +0700752
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930753 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)), 0);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000754 EXPECT_EQ(pldm_msgbuf_extract_array_uint8(ctxExtract, sizeof(retBuff),
755 retBuff, sizeof(retBuff)),
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930756 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700757
758 EXPECT_EQ(memcmp(src, retBuff, sizeof(retBuff)), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030759 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
760 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700761}
762
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930763TEST(msgbuf, insert_under_array_uint8)
764{
John Chung7a8d9322025-08-27 20:56:19 -0500765 struct pldm_msgbuf_rw _ctx;
766 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930767
768 uint8_t buf[1] = {};
769 uint8_t val[1] = {0};
770
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930771 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930772 ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000773 EXPECT_NE(
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930774 pldm_msgbuf_insert_array_uint8(ctx, sizeof(val), val, sizeof(val)), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030775 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930776}
777
Andrew Jeffery1c571442024-07-08 10:25:48 +0930778TEST(msgbuf, pldm_msgbuf_insert_array_char_good)
779{
John Chung7a8d9322025-08-27 20:56:19 -0500780 struct pldm_msgbuf_rw _ctx;
781 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jeffery1c571442024-07-08 10:25:48 +0930782 char src[6] = {0x11, 0x22, 0x44, 0x55, 0x66, 0x77};
783 char buf[6] = {};
784 char retBuff[6] = {};
785
786 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000787 EXPECT_EQ(pldm_msgbuf_insert_array_char(ctx, sizeof(src), src, sizeof(src)),
788 0);
Andrew Jeffery1c571442024-07-08 10:25:48 +0930789
John Chung7a8d9322025-08-27 20:56:19 -0500790 struct pldm_msgbuf_ro _ctxExtract;
791 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Andrew Jeffery1c571442024-07-08 10:25:48 +0930792
793 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)), 0);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000794 EXPECT_EQ(pldm_msgbuf_extract_array_char(ctxExtract, sizeof(retBuff),
795 retBuff, sizeof(retBuff)),
796 0);
Andrew Jeffery1c571442024-07-08 10:25:48 +0930797
798 EXPECT_EQ(memcmp(src, retBuff, sizeof(retBuff)), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030799 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
800 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Andrew Jeffery1c571442024-07-08 10:25:48 +0930801}
802
Andrew Jeffery1c571442024-07-08 10:25:48 +0930803TEST(msgbuf, insert_under_array_char)
804{
John Chung7a8d9322025-08-27 20:56:19 -0500805 struct pldm_msgbuf_rw _ctx;
806 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jeffery1c571442024-07-08 10:25:48 +0930807 char buf[1] = {};
808 char val[1] = {0};
809
810 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
811 ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000812 EXPECT_NE(pldm_msgbuf_insert_array_char(ctx, sizeof(val), val, sizeof(val)),
813 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030814 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery1c571442024-07-08 10:25:48 +0930815}
816
Thu Nguyen062c8762023-04-22 20:45:04 +0700817TEST(msgbuf, pldm_msgbuf_span_required_good)
818{
John Chung7a8d9322025-08-27 20:56:19 -0500819 struct pldm_msgbuf_rw _ctx;
820 struct pldm_msgbuf_rw* ctx = &_ctx;
Thu Nguyen062c8762023-04-22 20:45:04 +0700821 uint8_t src[6] = {0x11, 0x22, 0x44, 0x55, 0x66, 0x77};
822 uint8_t buf[6] = {0};
823 const size_t required = 4;
824 uint8_t expectData[required] = {0x44, 0x55, 0x66, 0x77};
825 uint16_t testVal;
826 uint8_t* retBuff = NULL;
827
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930828 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000829 EXPECT_EQ(
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930830 pldm_msgbuf_insert_array_uint8(ctx, sizeof(src), src, sizeof(src)), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700831
John Chung7a8d9322025-08-27 20:56:19 -0500832 struct pldm_msgbuf_ro _ctxExtract;
833 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen062c8762023-04-22 20:45:04 +0700834
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930835 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)), 0);
836 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, testVal), 0);
John Chung7a8d9322025-08-27 20:56:19 -0500837 EXPECT_EQ(
838 pldm_msgbuf_span_required(ctxExtract, required, (const void**)&retBuff),
839 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700840
841 EXPECT_EQ(memcmp(expectData, retBuff, required), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030842 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
843 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700844}
845
846TEST(msgbuf, pldm_msgbuf_span_required_bad)
847{
John Chung7a8d9322025-08-27 20:56:19 -0500848 struct pldm_msgbuf_rw _ctx;
849 struct pldm_msgbuf_rw* ctx = &_ctx;
Thu Nguyen062c8762023-04-22 20:45:04 +0700850 uint8_t src[6] = {0x11, 0x22, 0x44, 0x55, 0x66, 0x77};
851 uint8_t buf[6] = {0};
Varsha Kaverappa79393822024-08-07 00:40:13 -0500852 const size_t required = 4;
Thu Nguyen062c8762023-04-22 20:45:04 +0700853 uint16_t testVal;
854 [[maybe_unused]] uint8_t* retBuff = NULL;
855
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930856 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000857 EXPECT_EQ(
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930858 pldm_msgbuf_insert_array_uint8(ctx, sizeof(src), src, sizeof(src)), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700859
John Chung7a8d9322025-08-27 20:56:19 -0500860 struct pldm_msgbuf_ro _ctxExtract;
861 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen062c8762023-04-22 20:45:04 +0700862
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930863 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)), 0);
864 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, testVal), 0);
865 EXPECT_EQ(pldm_msgbuf_span_required(ctxExtract, required, NULL), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700866
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030867 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
868 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +0700869}
870
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930871TEST(msgbuf, span_required_under)
872{
John Chung7a8d9322025-08-27 20:56:19 -0500873 struct pldm_msgbuf_rw _ctx;
874 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930875
876 uint8_t buf[1] = {};
877 void* cursor = nullptr;
878
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930879 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930880 ctx->remaining = INTMAX_MIN;
Andrew Jeffery830c1eb2024-10-04 10:48:10 +0930881 EXPECT_NE(pldm_msgbuf_span_required(ctx, 1, &cursor), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030882 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
Andrew Jeffery2ff8cf82024-05-17 15:20:46 +0930883}
884
Thu Nguyen9c83d682024-07-02 08:43:09 +0000885TEST(msgbuf, pldm_msgbuf_span_string_ascii_good)
886{
John Chung7a8d9322025-08-27 20:56:19 -0500887 struct pldm_msgbuf_ro _ctxExtract;
888 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen9c83d682024-07-02 08:43:09 +0000889 uint8_t src[9] = {0x11, 0x22, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x77};
890 constexpr size_t required = 6;
891 const char expectData[required] = {0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00};
892 uint16_t testVal;
893 uint8_t testVal1;
894 char* retBuff = NULL;
895
896 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
Andrew Jefferye5f12532024-10-01 12:18:49 +0930897 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, testVal), 0);
Thu Nguyen9c83d682024-07-02 08:43:09 +0000898 EXPECT_EQ(0x2211, testVal);
John Chung7a8d9322025-08-27 20:56:19 -0500899 EXPECT_EQ(
900 pldm_msgbuf_span_string_ascii(ctxExtract, (const void**)&retBuff, NULL),
901 0);
Andrew Jefferye5f12532024-10-01 12:18:49 +0930902 EXPECT_EQ(pldm_msgbuf_extract_uint8(ctxExtract, testVal1), 0);
Thu Nguyen9c83d682024-07-02 08:43:09 +0000903 EXPECT_EQ(0x77, testVal1);
904
905 EXPECT_EQ(required, strlen(retBuff) + 1);
906 EXPECT_EQ(strncmp(expectData, retBuff, strlen(retBuff) + 1), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030907 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
Thu Nguyen9c83d682024-07-02 08:43:09 +0000908}
909
910TEST(msgbuf, pldm_msgbuf_span_string_ascii_good_with_length)
911{
John Chung7a8d9322025-08-27 20:56:19 -0500912 struct pldm_msgbuf_ro _ctxExtract;
913 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen9c83d682024-07-02 08:43:09 +0000914 uint8_t src[9] = {0x11, 0x22, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x77};
915 constexpr size_t required = 6;
916 const char expectData[required] = {0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00};
917 uint16_t testVal;
918 uint8_t testVal1;
919 char* retBuff = NULL;
920 size_t length;
921
922 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
Andrew Jefferye5f12532024-10-01 12:18:49 +0930923 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, testVal), 0);
Thu Nguyen9c83d682024-07-02 08:43:09 +0000924 EXPECT_EQ(0x2211, testVal);
John Chung7a8d9322025-08-27 20:56:19 -0500925 EXPECT_EQ(pldm_msgbuf_span_string_ascii(ctxExtract, (const void**)&retBuff,
926 &length),
927 0);
Andrew Jefferye5f12532024-10-01 12:18:49 +0930928 EXPECT_EQ(pldm_msgbuf_extract_uint8(ctxExtract, testVal1), 0);
Thu Nguyen9c83d682024-07-02 08:43:09 +0000929 EXPECT_EQ(0x77, testVal1);
930
931 EXPECT_EQ(required, strlen(retBuff) + 1);
932 EXPECT_EQ(length, strlen(retBuff) + 1);
933 EXPECT_EQ(required, length);
934 EXPECT_EQ(strncmp(expectData, retBuff, strlen(retBuff) + 1), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030935 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
Thu Nguyen9c83d682024-07-02 08:43:09 +0000936}
937
938TEST(msgbuf, pldm_msgbuf_span_string_ascii_allow_null_args)
939{
John Chung7a8d9322025-08-27 20:56:19 -0500940 struct pldm_msgbuf_ro _ctxExtract;
941 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen9c83d682024-07-02 08:43:09 +0000942 uint8_t src[8] = {0x11, 0x22, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00};
943 uint16_t testVal;
944
945 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
Andrew Jefferye5f12532024-10-01 12:18:49 +0930946 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, testVal), 0);
Thu Nguyen9c83d682024-07-02 08:43:09 +0000947 EXPECT_EQ(0x2211, testVal);
948 EXPECT_EQ(pldm_msgbuf_span_string_ascii(ctxExtract, NULL, NULL), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030949 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
Thu Nguyen9c83d682024-07-02 08:43:09 +0000950}
951
952TEST(msgbuf, pldm_msgbuf_span_string_ascii_bad_no_terminator)
953{
John Chung7a8d9322025-08-27 20:56:19 -0500954 struct pldm_msgbuf_ro _ctxExtract;
955 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen9c83d682024-07-02 08:43:09 +0000956 uint8_t src[8] = {0x11, 0x22, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77};
957 uint16_t testVal;
958 char* retBuff = NULL;
959
960 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
Andrew Jefferye5f12532024-10-01 12:18:49 +0930961 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, testVal), 0);
Thu Nguyen9c83d682024-07-02 08:43:09 +0000962 EXPECT_EQ(0x2211, testVal);
John Chung7a8d9322025-08-27 20:56:19 -0500963 EXPECT_EQ(
964 pldm_msgbuf_span_string_ascii(ctxExtract, (const void**)&retBuff, NULL),
965 -EOVERFLOW);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030966 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), -EOVERFLOW);
Thu Nguyen9c83d682024-07-02 08:43:09 +0000967}
968
969TEST(msgbuf, pldm_msgbuf_span_string_ascii_under)
970{
John Chung7a8d9322025-08-27 20:56:19 -0500971 struct pldm_msgbuf_rw _ctxExtract;
972 struct pldm_msgbuf_rw* ctxExtract = &_ctxExtract;
Thu Nguyen9c83d682024-07-02 08:43:09 +0000973
974 uint8_t src[1] = {};
975 char* retBuff = NULL;
976
977 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, 0), 0);
978 ctxExtract->remaining = INTMAX_MIN;
979 EXPECT_NE(pldm_msgbuf_span_string_ascii(ctxExtract, (void**)&retBuff, NULL),
980 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030981 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), -EOVERFLOW);
Thu Nguyen9c83d682024-07-02 08:43:09 +0000982}
983
Thu Nguyen15237782024-07-02 09:30:41 +0000984static size_t str16len(char16_t* startptr)
985{
986 char16_t* endptr = startptr;
987 while (*endptr)
988 {
989 endptr++;
990 }
991 return endptr - startptr;
992}
993
994TEST(msgbuf, pldm_msgbuf_span_string_utf16_good)
995{
John Chung7a8d9322025-08-27 20:56:19 -0500996 struct pldm_msgbuf_ro _ctxExtract;
997 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen15237782024-07-02 09:30:41 +0000998 uint8_t src[] __attribute__((aligned(alignof(char16_t)))) = {
999 0x11, 0x22, 0x11, 0x68, 0x22, 0x65, 0x33, 0x6c,
1000 0x44, 0x6c, 0x55, 0x6f, 0x00, 0x00, 0x34, 0x12};
1001 const char expectData[] = {0x11, 0x68, 0x22, 0x65, 0x33, 0x6c,
1002 0x44, 0x6c, 0x55, 0x6f, 0x00, 0x00};
1003 uint16_t testVal;
1004 uint16_t testVal1;
1005 void* retBuff = NULL;
1006
1007 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
Andrew Jefferye5f12532024-10-01 12:18:49 +09301008 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, testVal), 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001009 EXPECT_EQ(0x2211, testVal);
1010
John Chung7a8d9322025-08-27 20:56:19 -05001011 ASSERT_EQ(
1012 pldm_msgbuf_span_string_utf16(ctxExtract, (const void**)&retBuff, NULL),
1013 0);
Andrew Jefferye5f12532024-10-01 12:18:49 +09301014 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, testVal1), 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001015 EXPECT_EQ(0x1234, testVal1);
1016
Andrew Jeffery94f7fd62025-09-16 11:28:05 +09301017 ASSERT_EQ(0ul, (uintptr_t)retBuff & (alignof(char16_t) - 1));
1018 EXPECT_EQ(6ul, str16len((char16_t*)retBuff) + 1);
Thu Nguyen15237782024-07-02 09:30:41 +00001019 EXPECT_EQ(0, memcmp(expectData, retBuff, sizeof(expectData)));
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301020 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001021}
1022
1023TEST(msgbuf, pldm_msgbuf_span_string_utf16_good2)
1024{
John Chung7a8d9322025-08-27 20:56:19 -05001025 struct pldm_msgbuf_ro _ctxExtract;
1026 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen15237782024-07-02 09:30:41 +00001027 uint8_t src[24] = {0x11, 0x22, 0x11, 0x68, 0x22, 0x65, 0x33, 0x6c,
1028 0x44, 0x6c, 0x55, 0x6f, 0x00, 0x00, 0x34, 0x12,
1029 0x44, 0x6c, 0x55, 0x6f, 0x00, 0x00, 0x34, 0x12};
1030 constexpr size_t required = 6;
1031 const char16_t expectData[required] = {0x6811, 0x6522, 0x6c33,
1032 0x6c44, 0x6f55, 0x0000};
1033 const char16_t expectData1[3] = {0x6c44, 0x6f55, 0x0000};
1034 uint16_t testVal;
1035 uint16_t testVal1;
1036 char* retBuff = NULL;
1037 char* retBuff1 = NULL;
1038 size_t length = 0;
1039
1040 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
Andrew Jefferye5f12532024-10-01 12:18:49 +09301041 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, testVal), 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001042 EXPECT_EQ(0x2211, testVal);
1043
John Chung7a8d9322025-08-27 20:56:19 -05001044 EXPECT_EQ(
1045 pldm_msgbuf_span_string_utf16(ctxExtract, (const void**)&retBuff, NULL),
1046 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001047
Andrew Jeffery94f7fd62025-09-16 11:28:05 +09301048 ASSERT_EQ(0ul, (uintptr_t)retBuff & (alignof(char16_t) - 1));
1049 EXPECT_EQ(6ul, str16len((char16_t*)retBuff) + 1);
Thu Nguyen15237782024-07-02 09:30:41 +00001050 EXPECT_EQ(memcmp(expectData, retBuff,
1051 sizeof(char16_t) * (str16len((char16_t*)retBuff) + 1)),
1052 0);
1053
Andrew Jefferye5f12532024-10-01 12:18:49 +09301054 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, testVal1), 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001055 EXPECT_EQ(0x1234, testVal1);
1056
John Chung7a8d9322025-08-27 20:56:19 -05001057 EXPECT_EQ(pldm_msgbuf_span_string_utf16(ctxExtract, (const void**)&retBuff1,
1058 &length),
1059 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001060
Andrew Jeffery94f7fd62025-09-16 11:28:05 +09301061 EXPECT_EQ(0ul, length % 2);
Thu Nguyen15237782024-07-02 09:30:41 +00001062 EXPECT_EQ(memcmp(expectData1, retBuff1, length), 0);
1063
Andrew Jefferye5f12532024-10-01 12:18:49 +09301064 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, testVal1), 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001065 EXPECT_EQ(0x1234, testVal1);
1066
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301067 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001068}
1069
1070TEST(msgbuf, pldm_msgbuf_span_string_utf16_allow_null_args)
1071{
John Chung7a8d9322025-08-27 20:56:19 -05001072 struct pldm_msgbuf_ro _ctxExtract;
1073 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen15237782024-07-02 09:30:41 +00001074 uint8_t src[14] = {0x11, 0x22, 0x11, 0x68, 0x22, 0x65, 0x33,
1075 0x6c, 0x44, 0x6c, 0x55, 0x6f, 0x00, 0x00};
1076 uint16_t testVal;
1077
1078 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
Andrew Jefferye5f12532024-10-01 12:18:49 +09301079 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, testVal), 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001080 EXPECT_EQ(0x2211, testVal);
1081 EXPECT_EQ(pldm_msgbuf_span_string_utf16(ctxExtract, NULL, NULL), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301082 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001083}
1084
1085TEST(msgbuf, pldm_msgbuf_span_string_utf16_bad_no_terminator)
1086{
John Chung7a8d9322025-08-27 20:56:19 -05001087 struct pldm_msgbuf_ro _ctxExtract;
1088 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen15237782024-07-02 09:30:41 +00001089 uint8_t src[14] = {0x11, 0x22, 0x11, 0x68, 0x22, 0x65, 0x33,
1090 0x6c, 0x44, 0x6c, 0x55, 0x6f, 0x66, 0x77};
1091 uint16_t testVal;
1092 char16_t* retBuff = NULL;
1093
1094 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
Andrew Jefferye5f12532024-10-01 12:18:49 +09301095 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, testVal), 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001096 EXPECT_EQ(0x2211, testVal);
John Chung7a8d9322025-08-27 20:56:19 -05001097 EXPECT_EQ(
1098 pldm_msgbuf_span_string_utf16(ctxExtract, (const void**)&retBuff, NULL),
1099 -EOVERFLOW);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301100 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), -EOVERFLOW);
Thu Nguyen15237782024-07-02 09:30:41 +00001101}
1102
1103TEST(msgbuf, pldm_msgbuf_span_string_utf16_bad_odd_size)
1104{
John Chung7a8d9322025-08-27 20:56:19 -05001105 struct pldm_msgbuf_ro _ctxExtract;
1106 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen15237782024-07-02 09:30:41 +00001107 uint8_t src[] = {0x11, 0x22, 0x11, 0x68, 0x22, 0x65, 0x33,
1108 0x6c, 0x44, 0x6c, 0x55, 0x00, 0x00};
1109 uint16_t testVal;
1110 char16_t* retBuff = NULL;
1111
1112 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
Andrew Jefferye5f12532024-10-01 12:18:49 +09301113 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, testVal), 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001114 EXPECT_EQ(0x2211, testVal);
John Chung7a8d9322025-08-27 20:56:19 -05001115 EXPECT_EQ(
1116 pldm_msgbuf_span_string_utf16(ctxExtract, (const void**)&retBuff, NULL),
1117 -EOVERFLOW);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301118 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), -EOVERFLOW);
Thu Nguyen15237782024-07-02 09:30:41 +00001119}
1120
1121TEST(msgbuf, pldm_msgbuf_span_string_utf16_mix)
1122{
John Chung7a8d9322025-08-27 20:56:19 -05001123 struct pldm_msgbuf_ro _ctxExtract;
1124 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen15237782024-07-02 09:30:41 +00001125 uint8_t src[36] = {0x2, 0x65, 0x6e, 0x00, // Language Tag "en"
1126 0x00, 0x53, 0x00, 0x30, 0x00, 0x53, 0x00,
1127 0x58, 0x00, 0x00, // Entity Name "S0S"
1128 0x66, 0x6e, 0x00, // Language Tag "en"
1129 0x00, 0x53, 0x00, 0x31, 0x00, 0x00, // Entity Name "S1"
1130 0x67, 0x6e, 0x00, // Language Tag "en"
1131 0x00, 0x52, 0x00, 0x52, 0x00, 0x33, 0x00,
1132 0x00, // Entity Name "RR3"
1133 0x77, 0x88};
1134 uint8_t name_count;
1135 uint16_t test_val;
1136 char* tag = NULL;
1137 char* name = NULL;
1138 char* tag1 = NULL;
1139 char* name1 = NULL;
1140 char* tag2 = NULL;
1141 char* name2 = NULL;
1142 const char expectTag0[3] = {0x65, 0x6e, 0x00};
1143 const char expectTag1[3] = {0x66, 0x6e, 0x00};
1144 const char expectTag2[3] = {0x67, 0x6e, 0x00};
1145
1146 const char16_t expectName0[5] = {0x5300, 0x3000, 0x5300, 0x5800, 0x0000};
1147 const char16_t expectName1[3] = {0x5300, 0x3100, 0x0000};
1148 const char16_t expectName2[4] = {0x5200, 0x5200, 0x3300, 0x0000};
1149 size_t length = 0;
1150
1151 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, sizeof(src)), 0);
Andrew Jefferye5f12532024-10-01 12:18:49 +09301152 EXPECT_EQ(pldm_msgbuf_extract_uint8(ctxExtract, name_count), 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001153 EXPECT_EQ(0x2, name_count);
1154
John Chung7a8d9322025-08-27 20:56:19 -05001155 EXPECT_EQ(
1156 pldm_msgbuf_span_string_ascii(ctxExtract, (const void**)&tag, NULL), 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001157 EXPECT_EQ(strncmp(expectTag0, tag, strlen(tag) + 1), 0);
1158
John Chung7a8d9322025-08-27 20:56:19 -05001159 EXPECT_EQ(
1160 pldm_msgbuf_span_string_utf16(ctxExtract, (const void**)&name, NULL),
1161 0);
Andrew Jeffery94f7fd62025-09-16 11:28:05 +09301162 ASSERT_EQ(0ul, (uintptr_t)name & (alignof(char16_t) - 1));
1163 EXPECT_EQ(5ul, str16len((char16_t*)name) + 1);
Thu Nguyen15237782024-07-02 09:30:41 +00001164 EXPECT_EQ(memcmp(expectName0, name,
1165 sizeof(char16_t) * (str16len((char16_t*)name) + 1)),
1166 0);
1167
Thu Nguyen15237782024-07-02 09:30:41 +00001168 EXPECT_EQ(
John Chung7a8d9322025-08-27 20:56:19 -05001169 pldm_msgbuf_span_string_ascii(ctxExtract, (const void**)&tag1, &length),
1170 0);
1171 EXPECT_EQ(strncmp(expectTag1, tag1, length), 0);
1172 EXPECT_EQ(pldm_msgbuf_span_string_utf16(ctxExtract, (const void**)&name1,
1173 &length),
1174 0);
Andrew Jeffery94f7fd62025-09-16 11:28:05 +09301175 EXPECT_EQ(0ul, length % 2);
Thu Nguyen15237782024-07-02 09:30:41 +00001176 EXPECT_EQ(memcmp(expectName1, name1, length), 0);
1177
John Chung7a8d9322025-08-27 20:56:19 -05001178 EXPECT_EQ(
1179 pldm_msgbuf_span_string_ascii(ctxExtract, (const void**)&tag2, NULL),
1180 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001181 EXPECT_EQ(strncmp(expectTag2, tag2, strlen(tag2) + 1), 0);
John Chung7a8d9322025-08-27 20:56:19 -05001182 EXPECT_EQ(
1183 pldm_msgbuf_span_string_utf16(ctxExtract, (const void**)&name2, NULL),
1184 0);
Andrew Jeffery94f7fd62025-09-16 11:28:05 +09301185 ASSERT_EQ(0ul, (uintptr_t)name2 & (alignof(char16_t) - 1));
1186 EXPECT_EQ(4ul, str16len((char16_t*)name2) + 1);
Thu Nguyen15237782024-07-02 09:30:41 +00001187 EXPECT_EQ(memcmp(expectName2, name2,
1188 sizeof(char16_t) * (str16len((char16_t*)name2) + 1)),
1189 0);
1190
Andrew Jefferye5f12532024-10-01 12:18:49 +09301191 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, test_val), 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001192 EXPECT_EQ(0x8877, test_val);
1193
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301194 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
Thu Nguyen15237782024-07-02 09:30:41 +00001195}
1196
1197TEST(msgbuf, pldm_msgbuf_span_string_utf16_under)
1198{
John Chung7a8d9322025-08-27 20:56:19 -05001199 struct pldm_msgbuf_rw _ctxExtract;
1200 struct pldm_msgbuf_rw* ctxExtract = &_ctxExtract;
Thu Nguyen15237782024-07-02 09:30:41 +00001201
1202 uint8_t src[1] = {};
1203 char* retBuff = NULL;
1204
1205 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, src, 0), 0);
1206 ctxExtract->remaining = INTMAX_MIN;
1207 EXPECT_NE(pldm_msgbuf_span_string_utf16(ctxExtract, (void**)&retBuff, NULL),
1208 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301209 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), -EOVERFLOW);
Thu Nguyen15237782024-07-02 09:30:41 +00001210}
1211
Thu Nguyen062c8762023-04-22 20:45:04 +07001212TEST(msgbuf, pldm_msgbuf_span_remaining_good)
1213{
John Chung7a8d9322025-08-27 20:56:19 -05001214 struct pldm_msgbuf_rw _ctx;
1215 struct pldm_msgbuf_rw* ctx = &_ctx;
Thu Nguyen062c8762023-04-22 20:45:04 +07001216 uint8_t src[8] = {0x11, 0x22, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99};
1217 uint8_t buf[8] = {0};
1218 uint16_t testVal;
1219 uint8_t expectData[6] = {0x44, 0x55, 0x66, 0x77, 0x88, 0x99};
1220 size_t remaining;
1221 uint8_t* retBuff = NULL;
1222
Andrew Jeffery830c1eb2024-10-04 10:48:10 +09301223 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +00001224 EXPECT_EQ(
Andrew Jeffery830c1eb2024-10-04 10:48:10 +09301225 pldm_msgbuf_insert_array_uint8(ctx, sizeof(src), src, sizeof(src)), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +07001226
John Chung7a8d9322025-08-27 20:56:19 -05001227 struct pldm_msgbuf_ro _ctxExtract;
1228 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen062c8762023-04-22 20:45:04 +07001229
Andrew Jeffery830c1eb2024-10-04 10:48:10 +09301230 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)), 0);
1231 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, testVal), 0);
John Chung7a8d9322025-08-27 20:56:19 -05001232 EXPECT_EQ(pldm_msgbuf_span_remaining(ctxExtract, (const void**)&retBuff,
1233 &remaining),
1234 0);
Thu Nguyen062c8762023-04-22 20:45:04 +07001235
1236 EXPECT_EQ(remaining, sizeof(expectData));
1237 EXPECT_EQ(memcmp(expectData, retBuff, remaining), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301238 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
1239 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +07001240}
1241
1242TEST(msgbuf, pldm_msgbuf_span_remaining_bad)
1243{
John Chung7a8d9322025-08-27 20:56:19 -05001244 struct pldm_msgbuf_rw _ctx;
1245 struct pldm_msgbuf_rw* ctx = &_ctx;
Thu Nguyen062c8762023-04-22 20:45:04 +07001246 uint8_t src[8] = {0x11, 0x22, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99};
1247 uint8_t buf[8] = {0};
1248 uint16_t testVal;
Thu Nguyen062c8762023-04-22 20:45:04 +07001249
Andrew Jeffery830c1eb2024-10-04 10:48:10 +09301250 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +00001251 EXPECT_EQ(
Andrew Jeffery830c1eb2024-10-04 10:48:10 +09301252 pldm_msgbuf_insert_array_uint8(ctx, sizeof(src), src, sizeof(src)), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +07001253
John Chung7a8d9322025-08-27 20:56:19 -05001254 struct pldm_msgbuf_ro _ctxExtract;
1255 struct pldm_msgbuf_ro* ctxExtract = &_ctxExtract;
Thu Nguyen062c8762023-04-22 20:45:04 +07001256
Andrew Jeffery830c1eb2024-10-04 10:48:10 +09301257 ASSERT_EQ(pldm_msgbuf_init_errno(ctxExtract, 0, buf, sizeof(buf)), 0);
1258 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctxExtract, testVal), 0);
Thu Nguyen062c8762023-04-22 20:45:04 +07001259
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301260 EXPECT_EQ(pldm_msgbuf_complete(ctxExtract), 0);
1261 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
Andrew Jeffery07febdb2024-05-17 14:17:14 +09301262}
Varsha Kaverappa909bf7c2024-05-03 06:18:42 -05001263
Andrew Jeffery560ff9c2025-03-08 10:40:46 +00001264TEST(msgbuf, pldm_msgbuf_span_until_0_1)
1265{
John Chung7a8d9322025-08-27 20:56:19 -05001266 struct pldm_msgbuf_rw _ctx;
1267 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jeffery560ff9c2025-03-08 10:40:46 +00001268 uint8_t buf[] = {1};
1269
1270 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
1271 EXPECT_EQ(pldm_msgbuf_span_until(ctx, 0, nullptr, nullptr), 0);
1272 ASSERT_EQ(pldm_msgbuf_complete_consumed(ctx), 0);
1273}
1274
1275TEST(msgbuf, pldm_msgbuf_span_until_0_1_p)
1276{
John Chung7a8d9322025-08-27 20:56:19 -05001277 struct pldm_msgbuf_rw _ctx;
1278 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jeffery560ff9c2025-03-08 10:40:46 +00001279 uint8_t buf[] = {1};
1280 void* start;
1281 size_t len;
1282
1283 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
1284 EXPECT_EQ(pldm_msgbuf_span_until(ctx, 0, &start, &len), 0);
1285 ASSERT_EQ(pldm_msgbuf_complete_consumed(ctx), 0);
1286 EXPECT_EQ(buf, start);
Andrew Jeffery94f7fd62025-09-16 11:28:05 +09301287 EXPECT_EQ(len, 1ul);
Andrew Jeffery560ff9c2025-03-08 10:40:46 +00001288}
1289
1290TEST(msgbuf, pldm_msgbuf_span_until_1_1)
1291{
John Chung7a8d9322025-08-27 20:56:19 -05001292 struct pldm_msgbuf_ro _ctx;
1293 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery560ff9c2025-03-08 10:40:46 +00001294 uint8_t buf[] = {1};
1295 uint8_t val;
1296
1297 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
1298 EXPECT_EQ(pldm_msgbuf_span_until(ctx, 1, nullptr, nullptr), 0);
1299 ASSERT_EQ(pldm_msgbuf_extract_uint8(ctx, val), 0);
1300 ASSERT_EQ(pldm_msgbuf_complete_consumed(ctx), 0);
1301}
1302
1303TEST(msgbuf, pldm_msgbuf_span_until_1_2)
1304{
John Chung7a8d9322025-08-27 20:56:19 -05001305 struct pldm_msgbuf_ro _ctx;
1306 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery560ff9c2025-03-08 10:40:46 +00001307 uint8_t buf[] = {0, 1};
1308 uint8_t val;
1309
1310 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
1311 EXPECT_EQ(pldm_msgbuf_span_until(ctx, 1, nullptr, nullptr), 0);
1312 ASSERT_EQ(pldm_msgbuf_extract_uint8(ctx, val), 0);
1313 ASSERT_EQ(pldm_msgbuf_complete_consumed(ctx), 0);
1314 EXPECT_EQ(val, 1);
1315}
1316
1317TEST(msgbuf, pldm_msgbuf_span_until_1_3)
1318{
John Chung7a8d9322025-08-27 20:56:19 -05001319 struct pldm_msgbuf_ro _ctx;
1320 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery560ff9c2025-03-08 10:40:46 +00001321 uint8_t buf[] = {0, 1, 2};
1322 uint8_t val;
1323
1324 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
1325 EXPECT_EQ(pldm_msgbuf_span_until(ctx, 1, nullptr, nullptr), 0);
1326 ASSERT_EQ(pldm_msgbuf_extract_uint8(ctx, val), 0);
1327 ASSERT_EQ(pldm_msgbuf_complete_consumed(ctx), 0);
Andrew Jeffery94f7fd62025-09-16 11:28:05 +09301328 EXPECT_EQ(val, 2u);
Andrew Jeffery560ff9c2025-03-08 10:40:46 +00001329}
1330
1331TEST(msgbuf, pldm_msgbuf_span_until_2_3)
1332{
John Chung7a8d9322025-08-27 20:56:19 -05001333 struct pldm_msgbuf_ro _ctx;
1334 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery560ff9c2025-03-08 10:40:46 +00001335 uint8_t buf[] = {0, 1, 2};
1336 uint8_t val0;
1337 uint8_t val1;
1338
1339 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
1340 EXPECT_EQ(pldm_msgbuf_span_until(ctx, 2, nullptr, nullptr), 0);
1341 ASSERT_EQ(pldm_msgbuf_extract_uint8(ctx, val0), 0);
1342 ASSERT_EQ(pldm_msgbuf_extract_uint8(ctx, val1), 0);
1343 ASSERT_EQ(pldm_msgbuf_complete_consumed(ctx), 0);
Andrew Jeffery94f7fd62025-09-16 11:28:05 +09301344 EXPECT_EQ(val0, 1u);
1345 EXPECT_EQ(val1, 2u);
Andrew Jeffery560ff9c2025-03-08 10:40:46 +00001346}
1347
1348TEST(msgbuf, pldm_msgbuf_span_until_short)
1349{
John Chung7a8d9322025-08-27 20:56:19 -05001350 struct pldm_msgbuf_rw _ctx;
1351 struct pldm_msgbuf_rw* ctx = &_ctx;
Andrew Jeffery560ff9c2025-03-08 10:40:46 +00001352 uint8_t buf[] = {1};
1353
1354 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
1355 EXPECT_EQ(pldm_msgbuf_span_until(ctx, 2, nullptr, nullptr), -EOVERFLOW);
1356 ASSERT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
1357}
1358
1359TEST(msgbuf, pldm_msgbuf_span_until_saturated)
1360{
John Chung7a8d9322025-08-27 20:56:19 -05001361 struct pldm_msgbuf_ro _ctx;
1362 struct pldm_msgbuf_ro* ctx = &_ctx;
Andrew Jeffery560ff9c2025-03-08 10:40:46 +00001363 uint8_t buf[] = {1};
1364 uint16_t val;
1365
1366 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, sizeof(buf)), 0);
1367 EXPECT_EQ(pldm_msgbuf_extract_uint16(ctx, val), -EOVERFLOW);
1368 EXPECT_EQ(pldm_msgbuf_span_until(ctx, 0, nullptr, nullptr), -EOVERFLOW);
1369 EXPECT_EQ(pldm_msgbuf_span_until(ctx, 0, nullptr, nullptr), -EOVERFLOW);
1370 ASSERT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
1371}
1372
Varsha Kaverappa909bf7c2024-05-03 06:18:42 -05001373TEST(msgbuf, pldm_msgbuf_copy_good)
1374{
John Chung7a8d9322025-08-27 20:56:19 -05001375 struct pldm_msgbuf_ro _src;
1376 struct pldm_msgbuf_ro* src = &_src;
Varsha Kaverappa909bf7c2024-05-03 06:18:42 -05001377 uint16_t buf[1] = {htole16(0x5aa5)};
1378
Andrew Jeffery830c1eb2024-10-04 10:48:10 +09301379 ASSERT_EQ(pldm_msgbuf_init_errno(src, sizeof(buf), buf, sizeof(buf)), 0);
Varsha Kaverappa909bf7c2024-05-03 06:18:42 -05001380
John Chung7a8d9322025-08-27 20:56:19 -05001381 struct pldm_msgbuf_rw _dst;
1382 struct pldm_msgbuf_rw* dst = &_dst;
Varsha Kaverappa909bf7c2024-05-03 06:18:42 -05001383 uint16_t checkVal = 0;
1384 uint8_t buf1[sizeof(buf)] = {};
1385
Andrew Jeffery830c1eb2024-10-04 10:48:10 +09301386 ASSERT_EQ(pldm_msgbuf_init_errno(dst, sizeof(buf1), buf1, sizeof(buf1)), 0);
1387 EXPECT_EQ(pldm_msgbuf_copy(dst, src, buf[0], name), 0);
Varsha Kaverappa909bf7c2024-05-03 06:18:42 -05001388
John Chung7a8d9322025-08-27 20:56:19 -05001389 ASSERT_EQ(pldm_msgbuf_init_errno(src, sizeof(buf1), buf1, sizeof(buf1)), 0);
1390 EXPECT_EQ(pldm_msgbuf_extract_uint16(src, checkVal), 0);
Varsha Kaverappa909bf7c2024-05-03 06:18:42 -05001391
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301392 EXPECT_EQ(pldm_msgbuf_complete(src), 0);
1393 EXPECT_EQ(pldm_msgbuf_complete(dst), 0);
Andrew Jeffery8b879602024-07-08 12:50:19 +09301394
1395 EXPECT_EQ(buf[0], checkVal);
Varsha Kaverappa909bf7c2024-05-03 06:18:42 -05001396}
1397
1398TEST(msgbuf, pldm_msgbuf_copy_bad)
1399{
John Chung7a8d9322025-08-27 20:56:19 -05001400 struct pldm_msgbuf_ro _src;
1401 struct pldm_msgbuf_ro* src = &_src;
1402 struct pldm_msgbuf_rw _dst;
1403 struct pldm_msgbuf_rw* dst = &_dst;
Varsha Kaverappa909bf7c2024-05-03 06:18:42 -05001404 uint8_t buf[1] = {sizeof(uint8_t)};
1405 uint8_t buf1[1] = {sizeof(uint16_t)};
1406 uint16_t value = 8;
1407
Andrew Jeffery830c1eb2024-10-04 10:48:10 +09301408 ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, buf, sizeof(buf)), 0);
1409 ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf1, sizeof(buf1)), 0);
1410 EXPECT_EQ(pldm_msgbuf_copy(dst, src, value, name), -EOVERFLOW);
Varsha Kaverappa909bf7c2024-05-03 06:18:42 -05001411
Andrew Jeffery830c1eb2024-10-04 10:48:10 +09301412 ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, buf1, sizeof(buf1)), 0);
1413 ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf, sizeof(buf)), 0);
1414 EXPECT_EQ(pldm_msgbuf_copy(dst, src, value, name), -EOVERFLOW);
Varsha Kaverappa909bf7c2024-05-03 06:18:42 -05001415}
Andrew Jeffery8b879602024-07-08 12:50:19 +09301416
1417TEST(msgbuf, pldm_msgbuf_copy_string_ascii_exact)
1418{
1419 const char msg[] = "this is a message";
1420
John Chung7a8d9322025-08-27 20:56:19 -05001421 struct pldm_msgbuf_ro _src;
1422 struct pldm_msgbuf_ro* src = &_src;
1423 struct pldm_msgbuf_rw _dst;
1424 struct pldm_msgbuf_rw* dst = &_dst;
Andrew Jeffery8b879602024-07-08 12:50:19 +09301425
1426 char buf[sizeof(msg)] = {};
1427
1428 ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, msg, sizeof(msg)), 0);
1429 ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf, sizeof(buf)), 0);
1430 EXPECT_EQ(pldm_msgbuf_copy_string_ascii(dst, src), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301431 ASSERT_EQ(pldm_msgbuf_complete(dst), 0);
1432 ASSERT_EQ(pldm_msgbuf_complete(src), 0);
Andrew Jeffery8b879602024-07-08 12:50:19 +09301433 EXPECT_EQ(0, memcmp(msg, buf, sizeof(buf)));
1434}
1435
1436TEST(msgbuf, pldm_msgbuf_copy_string_ascii_dst_exceeds_src)
1437{
1438 const char msg[] = "this is a message";
1439
John Chung7a8d9322025-08-27 20:56:19 -05001440 struct pldm_msgbuf_ro _src;
1441 struct pldm_msgbuf_ro* src = &_src;
1442 struct pldm_msgbuf_rw _dst;
1443 struct pldm_msgbuf_rw* dst = &_dst;
Andrew Jeffery8b879602024-07-08 12:50:19 +09301444
1445 char buf[sizeof(msg) + 1] = {};
1446
1447 ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, msg, sizeof(msg)), 0);
1448 ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf, sizeof(buf)), 0);
1449 EXPECT_EQ(pldm_msgbuf_copy_string_ascii(dst, src), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301450 ASSERT_EQ(pldm_msgbuf_complete(dst), 0);
1451 ASSERT_EQ(pldm_msgbuf_complete(src), 0);
Andrew Jeffery8b879602024-07-08 12:50:19 +09301452 EXPECT_EQ(0, memcmp(buf, msg, sizeof(msg)));
1453}
1454
1455TEST(msgbuf, pldm_msgbuf_copy_string_ascii_src_exceeds_dst)
1456{
1457 const char msg[] = "this is a message";
1458
John Chung7a8d9322025-08-27 20:56:19 -05001459 struct pldm_msgbuf_ro _src;
1460 struct pldm_msgbuf_ro* src = &_src;
1461 struct pldm_msgbuf_rw _dst;
1462 struct pldm_msgbuf_rw* dst = &_dst;
Andrew Jeffery8b879602024-07-08 12:50:19 +09301463
1464 char buf[sizeof(msg) - 1] = {};
1465
1466 ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, msg, sizeof(msg)), 0);
1467 ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf, sizeof(buf)), 0);
1468 EXPECT_EQ(pldm_msgbuf_copy_string_ascii(dst, src), -EOVERFLOW);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301469 ASSERT_EQ(pldm_msgbuf_complete(dst), -EOVERFLOW);
1470 ASSERT_EQ(pldm_msgbuf_complete(src), 0);
Andrew Jeffery8b879602024-07-08 12:50:19 +09301471}
1472
1473TEST(msgbuf, pldm_msgbuf_copy_string_ascii_unterminated_src)
1474{
1475 const char msg[] = {'a'};
1476
John Chung7a8d9322025-08-27 20:56:19 -05001477 struct pldm_msgbuf_ro _src;
1478 struct pldm_msgbuf_ro* src = &_src;
1479 struct pldm_msgbuf_rw _dst;
1480 struct pldm_msgbuf_rw* dst = &_dst;
Andrew Jeffery8b879602024-07-08 12:50:19 +09301481
1482 char buf[sizeof(msg)] = {};
1483
1484 ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, msg, sizeof(msg)), 0);
1485 ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf, sizeof(buf)), 0);
1486 EXPECT_EQ(pldm_msgbuf_copy_string_ascii(dst, src), -EOVERFLOW);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301487 ASSERT_EQ(pldm_msgbuf_complete(dst), 0);
1488 ASSERT_EQ(pldm_msgbuf_complete(src), -EOVERFLOW);
Andrew Jeffery8b879602024-07-08 12:50:19 +09301489}
Andrew Jeffery56f73f92024-07-08 12:50:28 +09301490
1491TEST(msgbuf, pldm_msgbuf_copy_utf16_exact)
1492{
1493 const char16_t msg[] = u"this is a message";
1494
John Chung7a8d9322025-08-27 20:56:19 -05001495 struct pldm_msgbuf_ro _src;
1496 struct pldm_msgbuf_ro* src = &_src;
1497 struct pldm_msgbuf_rw _dst;
1498 struct pldm_msgbuf_rw* dst = &_dst;
Andrew Jeffery56f73f92024-07-08 12:50:28 +09301499
1500 char buf[sizeof(msg)] = {};
1501
1502 ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, msg, sizeof(msg)), 0);
1503 ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf, sizeof(buf)), 0);
1504 EXPECT_EQ(pldm_msgbuf_copy_string_utf16(dst, src), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301505 ASSERT_EQ(pldm_msgbuf_complete(dst), 0);
1506 ASSERT_EQ(pldm_msgbuf_complete(src), 0);
Andrew Jeffery56f73f92024-07-08 12:50:28 +09301507 EXPECT_EQ(0, memcmp(buf, msg, sizeof(msg)));
1508}
1509
1510TEST(msgbuf, pldm_msgbuf_copy_utf16_dst_exceeds_src)
1511{
1512 const char16_t msg[] = u"this is a message";
1513
John Chung7a8d9322025-08-27 20:56:19 -05001514 struct pldm_msgbuf_ro _src;
1515 struct pldm_msgbuf_ro* src = &_src;
1516 struct pldm_msgbuf_rw _dst;
1517 struct pldm_msgbuf_rw* dst = &_dst;
Andrew Jeffery56f73f92024-07-08 12:50:28 +09301518
1519 char buf[sizeof(msg) + 1] = {};
1520
1521 ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, msg, sizeof(msg)), 0);
1522 ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf, sizeof(buf)), 0);
1523 EXPECT_EQ(pldm_msgbuf_copy_string_utf16(dst, src), 0);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301524 ASSERT_EQ(pldm_msgbuf_complete(dst), 0);
1525 ASSERT_EQ(pldm_msgbuf_complete(src), 0);
Andrew Jeffery56f73f92024-07-08 12:50:28 +09301526 EXPECT_EQ(0, memcmp(buf, msg, sizeof(msg)));
1527}
1528
1529TEST(msgbuf, pldm_msgbuf_copy_utf16_src_exceeds_dst)
1530{
1531 const char16_t msg[] = u"this is a message";
1532
John Chung7a8d9322025-08-27 20:56:19 -05001533 struct pldm_msgbuf_ro _src;
1534 struct pldm_msgbuf_ro* src = &_src;
1535 struct pldm_msgbuf_rw _dst;
1536 struct pldm_msgbuf_rw* dst = &_dst;
Andrew Jeffery56f73f92024-07-08 12:50:28 +09301537
1538 char buf[sizeof(msg) - 1] = {};
1539
1540 ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, msg, sizeof(msg)), 0);
1541 ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf, sizeof(buf)), 0);
1542 EXPECT_EQ(pldm_msgbuf_copy_string_utf16(dst, src), -EOVERFLOW);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301543 ASSERT_EQ(pldm_msgbuf_complete(dst), -EOVERFLOW);
1544 ASSERT_EQ(pldm_msgbuf_complete(src), 0);
Andrew Jeffery56f73f92024-07-08 12:50:28 +09301545}
1546
1547TEST(msgbuf, pldm_msgbuf_copy_utf16_unterminated_src)
1548{
1549 const char16_t msg[] = {u'a'};
1550
John Chung7a8d9322025-08-27 20:56:19 -05001551 struct pldm_msgbuf_ro _src;
1552 struct pldm_msgbuf_ro* src = &_src;
1553 struct pldm_msgbuf_rw _dst;
1554 struct pldm_msgbuf_rw* dst = &_dst;
Andrew Jeffery56f73f92024-07-08 12:50:28 +09301555
1556 char buf[sizeof(msg)] = {};
1557
1558 ASSERT_EQ(pldm_msgbuf_init_errno(src, 0, msg, sizeof(msg)), 0);
1559 ASSERT_EQ(pldm_msgbuf_init_errno(dst, 0, buf, sizeof(buf)), 0);
1560 EXPECT_EQ(pldm_msgbuf_copy_string_utf16(dst, src), -EOVERFLOW);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301561 ASSERT_EQ(pldm_msgbuf_complete(dst), 0);
1562 ASSERT_EQ(pldm_msgbuf_complete(src), -EOVERFLOW);
Andrew Jeffery56f73f92024-07-08 12:50:28 +09301563}
Chau Ly1a4eed92025-03-21 14:57:57 +00001564
1565TEST(msgbuf, extract_one_uint8_to_size)
1566{
John Chung7a8d9322025-08-27 20:56:19 -05001567 PLDM_MSGBUF_RO_DEFINE_P(ctx);
Chau Ly1a4eed92025-03-21 14:57:57 +00001568 uint8_t buf[1] = {0xa5};
1569
1570 size_t val;
1571
1572 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
1573 EXPECT_EQ(pldm_msgbuf_extract_uint8_to_size(ctx, val), 0);
Andrew Jeffery94f7fd62025-09-16 11:28:05 +09301574 EXPECT_EQ(val, (size_t)0xa5);
Chau Ly1a4eed92025-03-21 14:57:57 +00001575 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
1576}
1577
1578TEST(msgbuf, extract_under_uint8_to_size)
1579{
John Chung7a8d9322025-08-27 20:56:19 -05001580 PLDM_MSGBUF_RO_DEFINE_P(ctx);
Chau Ly1a4eed92025-03-21 14:57:57 +00001581 uint8_t buf[1] = {};
1582 size_t val;
1583
1584 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
1585 ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
1586 EXPECT_NE(pldm_msgbuf_extract_uint8_to_size(ctx, val), 0);
1587 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
1588}
1589
1590TEST(msgbuf, extract_over_uint8_to_size)
1591{
John Chung7a8d9322025-08-27 20:56:19 -05001592 PLDM_MSGBUF_RO_DEFINE_P(ctx);
Chau Ly1a4eed92025-03-21 14:57:57 +00001593 uint8_t buf[1] = {};
1594 size_t val;
1595
1596 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
1597 EXPECT_NE(pldm_msgbuf_extract_uint8_to_size(ctx, val), 0);
1598 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
1599}
1600
1601TEST(msgbuf, extract_one_uint16_to_size)
1602{
John Chung7a8d9322025-08-27 20:56:19 -05001603 PLDM_MSGBUF_RO_DEFINE_P(ctx);
Chau Ly1a4eed92025-03-21 14:57:57 +00001604 uint16_t buf[1] = {htole16(0x5aa5)};
1605 size_t val;
1606
1607 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
1608 EXPECT_EQ(pldm_msgbuf_extract_uint16_to_size(ctx, val), 0);
Andrew Jeffery94f7fd62025-09-16 11:28:05 +09301609 EXPECT_EQ(val, (size_t)0x5aa5);
Chau Ly1a4eed92025-03-21 14:57:57 +00001610 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
1611}
1612
1613TEST(msgbuf, extract_under_uint16_to_size)
1614{
John Chung7a8d9322025-08-27 20:56:19 -05001615 PLDM_MSGBUF_RO_DEFINE_P(ctx);
Chau Ly1a4eed92025-03-21 14:57:57 +00001616 uint16_t buf[1] = {};
1617 size_t val;
1618
1619 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
1620 ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
1621 EXPECT_NE(pldm_msgbuf_extract_uint16_to_size(ctx, val), 0);
1622 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
1623}
1624
1625TEST(msgbuf, extract_over_uint16_to_size)
1626{
John Chung7a8d9322025-08-27 20:56:19 -05001627 PLDM_MSGBUF_RO_DEFINE_P(ctx);
Chau Ly1a4eed92025-03-21 14:57:57 +00001628 uint16_t buf[1] = {};
1629 size_t val;
1630
1631 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
1632 EXPECT_NE(pldm_msgbuf_extract_uint16_to_size(ctx, val), 0);
1633 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
1634}
1635
1636TEST(msgbuf, extract_one_uint32_to_size)
1637{
John Chung7a8d9322025-08-27 20:56:19 -05001638 PLDM_MSGBUF_RO_DEFINE_P(ctx);
Chau Ly1a4eed92025-03-21 14:57:57 +00001639 uint32_t buf[1] = {htole32(0x5a00ffa5)};
1640 size_t val;
1641
1642 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
Andrew Jeffery94f7fd62025-09-16 11:28:05 +09301643 ASSERT_EQ(pldm_msgbuf_extract_uint32_to_size(ctx, val), 0);
1644 EXPECT_EQ(val, 0x5a00ffa5u);
Chau Ly1a4eed92025-03-21 14:57:57 +00001645 EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
1646}
1647
1648TEST(msgbuf, extract_under_uint32_to_size)
1649{
John Chung7a8d9322025-08-27 20:56:19 -05001650 PLDM_MSGBUF_RO_DEFINE_P(ctx);
Chau Ly1a4eed92025-03-21 14:57:57 +00001651 uint32_t buf[1] = {};
1652 size_t val;
1653
1654 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
1655 ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
1656 EXPECT_NE(pldm_msgbuf_extract_uint32_to_size(ctx, val), 0);
1657 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
1658}
1659
1660TEST(msgbuf, extract_over_uint32_to_size)
1661{
John Chung7a8d9322025-08-27 20:56:19 -05001662 PLDM_MSGBUF_RO_DEFINE_P(ctx);
Chau Ly1a4eed92025-03-21 14:57:57 +00001663 uint32_t buf[1] = {};
1664 size_t val;
1665
1666 ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
1667 EXPECT_NE(pldm_msgbuf_extract_uint32_to_size(ctx, val), 0);
1668 EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
1669}