blob: b2e9294bffeac6bceeb616bcb232dbe970ed55fe [file] [log] [blame]
John Chung7a8d9322025-08-27 20:56:19 -05001#include "msgbuf.hpp"
2
Andrew Jefferyb0c1d202023-11-07 22:08:44 +10303#include <libpldm/base.h>
4#include <libpldm/pldm_types.h>
5
Andrew Jeffery9c766792022-08-10 23:12:49 +09306#include <array>
Manojkiran Eda9a8e4972022-11-28 16:38:21 +05307#include <cstdint>
Andrew Jeffery9c766792022-08-10 23:12:49 +09308#include <cstring>
9#include <vector>
10
Andrew Jeffery9c766792022-08-10 23:12:49 +093011#include <gmock/gmock.h>
12#include <gtest/gtest.h>
13
14using testing::ElementsAreArray;
15
16constexpr auto hdrSize = sizeof(pldm_msg_hdr);
17
18TEST(PackPLDMMessage, BadPathTest)
19{
20 struct pldm_header_info hdr;
21 struct pldm_header_info* hdr_ptr = NULL;
22 pldm_msg_hdr msg{};
23
24 // PLDM header information pointer is NULL
25 auto rc = pack_pldm_header(hdr_ptr, &msg);
26 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
27
28 // PLDM message pointer is NULL
29 rc = pack_pldm_header(&hdr, nullptr);
30 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
31
32 // PLDM header information pointer and PLDM message pointer is NULL
33 rc = pack_pldm_header(hdr_ptr, nullptr);
34 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
35
36 // RESERVED message type
37 hdr.msg_type = PLDM_RESERVED;
38 rc = pack_pldm_header(&hdr, &msg);
39 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
40
41 // Instance ID out of range
42 hdr.msg_type = PLDM_REQUEST;
43 hdr.instance = 32;
44 rc = pack_pldm_header(&hdr, &msg);
45 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
46
47 // PLDM type out of range
48 hdr.msg_type = PLDM_REQUEST;
49 hdr.instance = 31;
50 hdr.pldm_type = 64;
51 rc = pack_pldm_header(&hdr, &msg);
52 EXPECT_EQ(rc, PLDM_ERROR_INVALID_PLDM_TYPE);
53}
54
55TEST(PackPLDMMessage, RequestMessageGoodPath)
56{
57 struct pldm_header_info hdr;
58 pldm_msg_hdr msg{};
59
60 // Message type is REQUEST and lower range of the field values
61 hdr.msg_type = PLDM_REQUEST;
62 hdr.instance = 0;
63 hdr.pldm_type = 0;
64 hdr.command = 0;
65
66 auto rc = pack_pldm_header(&hdr, &msg);
67 EXPECT_EQ(rc, PLDM_SUCCESS);
68 EXPECT_EQ(msg.request, 1);
69 EXPECT_EQ(msg.datagram, 0);
70 EXPECT_EQ(msg.instance_id, 0);
71 EXPECT_EQ(msg.type, 0);
72 EXPECT_EQ(msg.command, 0);
73
74 // Message type is REQUEST and upper range of the field values
75 hdr.instance = 31;
76 hdr.pldm_type = 63;
77 hdr.command = 255;
78
79 rc = pack_pldm_header(&hdr, &msg);
80 EXPECT_EQ(rc, PLDM_SUCCESS);
81 EXPECT_EQ(msg.request, 1);
82 EXPECT_EQ(msg.datagram, 0);
83 EXPECT_EQ(msg.instance_id, 31);
84 EXPECT_EQ(msg.type, 63);
85 EXPECT_EQ(msg.command, 255);
86
87 // Message type is PLDM_ASYNC_REQUEST_NOTIFY
88 hdr.msg_type = PLDM_ASYNC_REQUEST_NOTIFY;
89
90 rc = pack_pldm_header(&hdr, &msg);
91 EXPECT_EQ(rc, PLDM_SUCCESS);
92 EXPECT_EQ(msg.request, 1);
93 EXPECT_EQ(msg.datagram, 1);
94 EXPECT_EQ(msg.instance_id, 31);
95 EXPECT_EQ(msg.type, 63);
96 EXPECT_EQ(msg.command, 255);
97}
98
99TEST(PackPLDMMessage, ResponseMessageGoodPath)
100{
101 struct pldm_header_info hdr;
102 pldm_msg_hdr msg{};
103
104 // Message type is PLDM_RESPONSE and lower range of the field values
105 hdr.msg_type = PLDM_RESPONSE;
106 hdr.instance = 0;
107 hdr.pldm_type = 0;
108 hdr.command = 0;
109
110 auto rc = pack_pldm_header(&hdr, &msg);
111 EXPECT_EQ(rc, PLDM_SUCCESS);
112 EXPECT_EQ(msg.request, 0);
113 EXPECT_EQ(msg.datagram, 0);
114 EXPECT_EQ(msg.instance_id, 0);
115 EXPECT_EQ(msg.type, 0);
116 EXPECT_EQ(msg.command, 0);
117
118 // Message type is PLDM_RESPONSE and upper range of the field values
119 hdr.instance = 31;
120 hdr.pldm_type = 63;
121 hdr.command = 255;
122
123 rc = pack_pldm_header(&hdr, &msg);
124 EXPECT_EQ(rc, PLDM_SUCCESS);
125 EXPECT_EQ(msg.request, 0);
126 EXPECT_EQ(msg.datagram, 0);
127 EXPECT_EQ(msg.instance_id, 31);
128 EXPECT_EQ(msg.type, 63);
129 EXPECT_EQ(msg.command, 255);
130}
131
132TEST(UnpackPLDMMessage, BadPathTest)
133{
134 struct pldm_header_info hdr;
135
136 // PLDM message pointer is NULL
137 auto rc = unpack_pldm_header(nullptr, &hdr);
138 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
139}
140
141TEST(UnpackPLDMMessage, RequestMessageGoodPath)
142{
143 struct pldm_header_info hdr;
144 pldm_msg_hdr msg{};
145
146 // Unpack PLDM request message and lower range of field values
147 msg.request = 1;
148 auto rc = unpack_pldm_header(&msg, &hdr);
149 EXPECT_EQ(rc, PLDM_SUCCESS);
150 EXPECT_EQ(hdr.msg_type, PLDM_REQUEST);
151 EXPECT_EQ(hdr.instance, 0);
152 EXPECT_EQ(hdr.pldm_type, 0);
153 EXPECT_EQ(hdr.command, 0);
154
155 // Unpack PLDM async request message and lower range of field values
156 msg.datagram = 1;
157 rc = unpack_pldm_header(&msg, &hdr);
158 EXPECT_EQ(rc, PLDM_SUCCESS);
159 EXPECT_EQ(hdr.msg_type, PLDM_ASYNC_REQUEST_NOTIFY);
160
161 // Unpack PLDM request message and upper range of field values
162 msg.datagram = 0;
163 msg.instance_id = 31;
164 msg.type = 63;
165 msg.command = 255;
166 rc = unpack_pldm_header(&msg, &hdr);
167 EXPECT_EQ(rc, PLDM_SUCCESS);
168 EXPECT_EQ(hdr.msg_type, PLDM_REQUEST);
169 EXPECT_EQ(hdr.instance, 31);
170 EXPECT_EQ(hdr.pldm_type, 63);
171 EXPECT_EQ(hdr.command, 255);
172}
173
174TEST(UnpackPLDMMessage, ResponseMessageGoodPath)
175{
176 struct pldm_header_info hdr;
177 pldm_msg_hdr msg{};
178
179 // Unpack PLDM response message and lower range of field values
180 auto rc = unpack_pldm_header(&msg, &hdr);
181 EXPECT_EQ(rc, PLDM_SUCCESS);
182 EXPECT_EQ(hdr.msg_type, PLDM_RESPONSE);
183 EXPECT_EQ(hdr.instance, 0);
184 EXPECT_EQ(hdr.pldm_type, 0);
185 EXPECT_EQ(hdr.command, 0);
186
187 // Unpack PLDM response message and upper range of field values
188 msg.instance_id = 31;
189 msg.type = 63;
190 msg.command = 255;
191 rc = unpack_pldm_header(&msg, &hdr);
192 EXPECT_EQ(rc, PLDM_SUCCESS);
193 EXPECT_EQ(hdr.msg_type, PLDM_RESPONSE);
194 EXPECT_EQ(hdr.instance, 31);
195 EXPECT_EQ(hdr.pldm_type, 63);
196 EXPECT_EQ(hdr.command, 255);
197}
198
199TEST(GetPLDMCommands, testEncodeRequest)
200{
201 uint8_t pldmType = 0x05;
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600202 ver32_t version{0xff, 0xff, 0xff, 0xff};
Andrew Jeffery9c766792022-08-10 23:12:49 +0930203 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_COMMANDS_REQ_BYTES>
204 requestMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930205 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930206 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
207
208 auto rc = encode_get_commands_req(0, pldmType, version, request);
209 EXPECT_EQ(rc, PLDM_SUCCESS);
210 EXPECT_EQ(0, memcmp(request->payload, &pldmType, sizeof(pldmType)));
211 EXPECT_EQ(0, memcmp(request->payload + sizeof(pldmType), &version,
212 sizeof(version)));
213}
214
215TEST(GetPLDMCommands, testDecodeRequest)
216{
217 uint8_t pldmType = 0x05;
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600218 ver32_t version{0xff, 0xff, 0xff, 0xff};
Andrew Jeffery9c766792022-08-10 23:12:49 +0930219 uint8_t pldmTypeOut{};
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600220 ver32_t versionOut{0xff, 0xff, 0xff, 0xff};
Andrew Jeffery9c766792022-08-10 23:12:49 +0930221 std::array<uint8_t, hdrSize + PLDM_GET_COMMANDS_REQ_BYTES> requestMsg{};
222
223 memcpy(requestMsg.data() + hdrSize, &pldmType, sizeof(pldmType));
224 memcpy(requestMsg.data() + sizeof(pldmType) + hdrSize, &version,
225 sizeof(version));
226
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930227 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930228 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
229 auto rc = decode_get_commands_req(request, requestMsg.size() - hdrSize,
230 &pldmTypeOut, &versionOut);
231
232 EXPECT_EQ(rc, PLDM_SUCCESS);
233 EXPECT_EQ(pldmTypeOut, pldmType);
234 EXPECT_EQ(0, memcmp(&versionOut, &version, sizeof(version)));
235}
236
237TEST(GetPLDMCommands, testEncodeResponse)
238{
239 uint8_t completionCode = 0;
240 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_COMMANDS_RESP_BYTES>
241 responseMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930242 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930243 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
244 std::array<bitfield8_t, PLDM_MAX_CMDS_PER_TYPE / 8> commands{};
245 commands[0].byte = 1;
246 commands[1].byte = 2;
247 commands[2].byte = 3;
248
249 auto rc =
250 encode_get_commands_resp(0, PLDM_SUCCESS, commands.data(), response);
251 EXPECT_EQ(rc, PLDM_SUCCESS);
252 uint8_t* payload_ptr = response->payload;
253 EXPECT_EQ(completionCode, payload_ptr[0]);
254 EXPECT_EQ(1, payload_ptr[sizeof(completionCode)]);
255 EXPECT_EQ(2,
256 payload_ptr[sizeof(completionCode) + sizeof(commands[0].byte)]);
257 EXPECT_EQ(3, payload_ptr[sizeof(completionCode) + sizeof(commands[0].byte) +
258 sizeof(commands[1].byte)]);
259}
260
261TEST(GetPLDMTypes, testEncodeResponse)
262{
263 uint8_t completionCode = 0;
264 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_TYPES_RESP_BYTES>
265 responseMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930266 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930267 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
268 std::array<bitfield8_t, PLDM_MAX_TYPES / 8> types{};
269 types[0].byte = 1;
270 types[1].byte = 2;
271 types[2].byte = 3;
272
273 auto rc = encode_get_types_resp(0, PLDM_SUCCESS, types.data(), response);
274 EXPECT_EQ(rc, PLDM_SUCCESS);
275 uint8_t* payload_ptr = response->payload;
276 EXPECT_EQ(completionCode, payload_ptr[0]);
277 EXPECT_EQ(1, payload_ptr[sizeof(completionCode)]);
278 EXPECT_EQ(2, payload_ptr[sizeof(completionCode) + sizeof(types[0].byte)]);
279 EXPECT_EQ(3, payload_ptr[sizeof(completionCode) + sizeof(types[0].byte) +
280 sizeof(types[1].byte)]);
281}
282
283TEST(GetPLDMTypes, testGoodDecodeResponse)
284{
285 std::array<uint8_t, hdrSize + PLDM_GET_TYPES_RESP_BYTES> responseMsg{};
286 responseMsg[1 + hdrSize] = 1;
287 responseMsg[2 + hdrSize] = 2;
288 responseMsg[3 + hdrSize] = 3;
289 std::array<bitfield8_t, PLDM_MAX_TYPES / 8> outTypes{};
290
291 uint8_t completion_code;
292 responseMsg[hdrSize] = PLDM_SUCCESS;
293
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930294 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930295 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
296
297 auto rc = decode_get_types_resp(response, responseMsg.size() - hdrSize,
298 &completion_code, outTypes.data());
299
300 EXPECT_EQ(rc, PLDM_SUCCESS);
301 EXPECT_EQ(completion_code, PLDM_SUCCESS);
302 EXPECT_EQ(responseMsg[1 + hdrSize], outTypes[0].byte);
303 EXPECT_EQ(responseMsg[2 + hdrSize], outTypes[1].byte);
304 EXPECT_EQ(responseMsg[3 + hdrSize], outTypes[2].byte);
305}
306
307TEST(GetPLDMTypes, testBadDecodeResponse)
308{
309 std::array<uint8_t, hdrSize + PLDM_GET_TYPES_RESP_BYTES> responseMsg{};
310 responseMsg[1 + hdrSize] = 1;
311 responseMsg[2 + hdrSize] = 2;
312 responseMsg[3 + hdrSize] = 3;
313 std::array<bitfield8_t, PLDM_MAX_TYPES / 8> outTypes{};
314
315 uint8_t retcompletion_code = 0;
316 responseMsg[hdrSize] = PLDM_SUCCESS;
317
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930318 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930319 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
320
321 auto rc = decode_get_types_resp(response, responseMsg.size() - hdrSize - 1,
322 &retcompletion_code, outTypes.data());
323
324 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
325}
326
327TEST(GetPLDMCommands, testGoodDecodeResponse)
328{
329 std::array<uint8_t, hdrSize + PLDM_GET_COMMANDS_RESP_BYTES> responseMsg{};
330 responseMsg[1 + hdrSize] = 1;
331 responseMsg[2 + hdrSize] = 2;
332 responseMsg[3 + hdrSize] = 3;
333 std::array<bitfield8_t, PLDM_MAX_CMDS_PER_TYPE / 8> outTypes{};
334
335 uint8_t completion_code;
336 responseMsg[hdrSize] = PLDM_SUCCESS;
337
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930338 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930339 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
340
341 auto rc = decode_get_commands_resp(response, responseMsg.size() - hdrSize,
342 &completion_code, outTypes.data());
343
344 EXPECT_EQ(rc, PLDM_SUCCESS);
345 EXPECT_EQ(completion_code, PLDM_SUCCESS);
346 EXPECT_EQ(responseMsg[1 + hdrSize], outTypes[0].byte);
347 EXPECT_EQ(responseMsg[2 + hdrSize], outTypes[1].byte);
348 EXPECT_EQ(responseMsg[3 + hdrSize], outTypes[2].byte);
349}
350
351TEST(GetPLDMCommands, testBadDecodeResponse)
352{
353 std::array<uint8_t, hdrSize + PLDM_GET_COMMANDS_RESP_BYTES> responseMsg{};
354 responseMsg[1 + hdrSize] = 1;
355 responseMsg[2 + hdrSize] = 2;
356 responseMsg[3 + hdrSize] = 3;
357 std::array<bitfield8_t, PLDM_MAX_CMDS_PER_TYPE / 8> outTypes{};
358
359 uint8_t retcompletion_code = 0;
360 responseMsg[hdrSize] = PLDM_SUCCESS;
361
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930362 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930363 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
364
365 auto rc =
366 decode_get_commands_resp(response, responseMsg.size() - hdrSize - 1,
367 &retcompletion_code, outTypes.data());
368
369 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
370}
371
372TEST(GetPLDMVersion, testGoodEncodeRequest)
373{
374 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_VERSION_REQ_BYTES>
375 requestMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930376 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930377 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
378 uint8_t pldmType = 0x03;
379 uint32_t transferHandle = 0x0;
380 uint8_t opFlag = 0x01;
381
382 auto rc =
383 encode_get_version_req(0, transferHandle, opFlag, pldmType, request);
384 EXPECT_EQ(rc, PLDM_SUCCESS);
385 EXPECT_EQ(
386 0, memcmp(request->payload, &transferHandle, sizeof(transferHandle)));
387 EXPECT_EQ(0, memcmp(request->payload + sizeof(transferHandle), &opFlag,
388 sizeof(opFlag)));
389 EXPECT_EQ(0,
390 memcmp(request->payload + sizeof(transferHandle) + sizeof(opFlag),
391 &pldmType, sizeof(pldmType)));
392}
393
394TEST(GetPLDMVersion, testBadEncodeRequest)
395{
396 uint8_t pldmType = 0x03;
397 uint32_t transferHandle = 0x0;
398 uint8_t opFlag = 0x01;
399
400 auto rc =
401 encode_get_version_req(0, transferHandle, opFlag, pldmType, nullptr);
402
403 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
404}
405
406TEST(GetPLDMVersion, testEncodeResponse)
407{
408 uint8_t completionCode = 0;
409 uint32_t transferHandle = 0;
410 uint8_t flag = PLDM_START_AND_END;
411 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_VERSION_RESP_BYTES>
412 responseMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930413 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930414 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600415 ver32_t version = {0xff, 0xff, 0xff, 0xff};
Andrew Jeffery9c766792022-08-10 23:12:49 +0930416
417 auto rc = encode_get_version_resp(0, PLDM_SUCCESS, 0, PLDM_START_AND_END,
418 &version, sizeof(ver32_t), response);
419
420 EXPECT_EQ(rc, PLDM_SUCCESS);
421 EXPECT_EQ(completionCode, response->payload[0]);
422 EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]),
423 &transferHandle, sizeof(transferHandle)));
424 EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
425 sizeof(transferHandle),
426 &flag, sizeof(flag)));
427 EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
428 sizeof(transferHandle) + sizeof(flag),
429 &version, sizeof(version)));
430}
431
432TEST(GetPLDMVersion, testDecodeRequest)
433{
434 std::array<uint8_t, hdrSize + PLDM_GET_VERSION_REQ_BYTES> requestMsg{};
435 uint32_t transferHandle = 0x0;
436 uint32_t retTransferHandle = 0x0;
437 uint8_t flag = PLDM_GET_FIRSTPART;
438 uint8_t retFlag = PLDM_GET_FIRSTPART;
439 uint8_t pldmType = PLDM_BASE;
440 uint8_t retType = PLDM_BASE;
441
442 memcpy(requestMsg.data() + hdrSize, &transferHandle,
443 sizeof(transferHandle));
444 memcpy(requestMsg.data() + sizeof(transferHandle) + hdrSize, &flag,
445 sizeof(flag));
446 memcpy(requestMsg.data() + sizeof(transferHandle) + sizeof(flag) + hdrSize,
447 &pldmType, sizeof(pldmType));
448
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930449 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930450 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
451
452 auto rc = decode_get_version_req(request, requestMsg.size() - hdrSize,
453 &retTransferHandle, &retFlag, &retType);
454
455 EXPECT_EQ(rc, PLDM_SUCCESS);
456 EXPECT_EQ(transferHandle, retTransferHandle);
457 EXPECT_EQ(flag, retFlag);
458 EXPECT_EQ(pldmType, retType);
459}
460
461TEST(GetPLDMVersion, testDecodeResponse)
462{
463 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_VERSION_RESP_BYTES>
464 responseMsg{};
465 uint32_t transferHandle = 0x0;
466 uint32_t retTransferHandle = 0x0;
467 uint8_t flag = PLDM_START_AND_END;
468 uint8_t retFlag = PLDM_START_AND_END;
469 uint8_t completionCode = 0;
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600470 ver32_t version = {0xff, 0xff, 0xff, 0xff};
Andrew Jeffery9c766792022-08-10 23:12:49 +0930471 ver32_t versionOut;
472 uint8_t completion_code;
473
474 memcpy(responseMsg.data() + sizeof(completionCode) + hdrSize,
475 &transferHandle, sizeof(transferHandle));
476 memcpy(responseMsg.data() + sizeof(completionCode) +
477 sizeof(transferHandle) + hdrSize,
478 &flag, sizeof(flag));
479 memcpy(responseMsg.data() + sizeof(completionCode) +
480 sizeof(transferHandle) + sizeof(flag) + hdrSize,
481 &version, sizeof(version));
482
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930483 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930484 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
485
486 auto rc = decode_get_version_resp(response, responseMsg.size() - hdrSize,
487 &completion_code, &retTransferHandle,
488 &retFlag, &versionOut);
489 EXPECT_EQ(rc, PLDM_SUCCESS);
490 EXPECT_EQ(transferHandle, retTransferHandle);
491 EXPECT_EQ(flag, retFlag);
492
493 EXPECT_EQ(versionOut.major, version.major);
494 EXPECT_EQ(versionOut.minor, version.minor);
495 EXPECT_EQ(versionOut.update, version.update);
496 EXPECT_EQ(versionOut.alpha, version.alpha);
497}
498
499TEST(GetTID, testEncodeRequest)
500{
501 pldm_msg request{};
502
503 auto rc = encode_get_tid_req(0, &request);
504 ASSERT_EQ(rc, PLDM_SUCCESS);
505}
506
507TEST(GetTID, testEncodeResponse)
508{
509 uint8_t completionCode = 0;
510 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_TID_RESP_BYTES>
511 responseMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930512 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930513 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
514 uint8_t tid = 1;
515
516 auto rc = encode_get_tid_resp(0, PLDM_SUCCESS, tid, response);
517 EXPECT_EQ(rc, PLDM_SUCCESS);
518 uint8_t* payload = response->payload;
519 EXPECT_EQ(completionCode, payload[0]);
520 EXPECT_EQ(1, payload[sizeof(completionCode)]);
521}
522
523TEST(GetTID, testDecodeResponse)
524{
525 std::array<uint8_t, hdrSize + PLDM_GET_TID_RESP_BYTES> responseMsg{};
526 responseMsg[1 + hdrSize] = 1;
527
528 uint8_t tid;
529 uint8_t completion_code;
530 responseMsg[hdrSize] = PLDM_SUCCESS;
531
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930532 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930533 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
534
535 auto rc = decode_get_tid_resp(response, responseMsg.size() - hdrSize,
536 &completion_code, &tid);
537
538 EXPECT_EQ(rc, PLDM_SUCCESS);
539 EXPECT_EQ(completion_code, PLDM_SUCCESS);
540 EXPECT_EQ(tid, 1);
541}
542
Chau Lya93a3a02025-08-15 14:22:06 +0000543TEST(DecodeMultipartReceiveRequest, testDecodeRequestPass)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930544{
545 constexpr uint8_t kPldmType = PLDM_BASE;
546 constexpr uint8_t kFlag = PLDM_XFER_FIRST_PART;
547 constexpr uint32_t kTransferCtx = 0x01;
548 constexpr uint32_t kTransferHandle = 0x10;
549 constexpr uint32_t kSectionOffset = 0x0;
550 constexpr uint32_t kSectionLength = 0x10;
Andrew Jefferyedb88262025-08-14 05:02:21 +0000551
552 PLDM_MSG_DEFINE_P(msg, PLDM_MULTIPART_RECEIVE_REQ_BYTES);
John Chung7a8d9322025-08-27 20:56:19 -0500553 PLDM_MSGBUF_RW_DEFINE_P(buf);
Andrew Jefferyedb88262025-08-14 05:02:21 +0000554 int rc;
555
556 // Header values don't matter for this test.
557 rc = pldm_msgbuf_init_errno(buf, PLDM_MULTIPART_RECEIVE_REQ_BYTES,
558 msg->payload, PLDM_MULTIPART_RECEIVE_REQ_BYTES);
559 ASSERT_EQ(rc, 0);
560 pldm_msgbuf_insert_uint8(buf, kPldmType);
561 pldm_msgbuf_insert_uint8(buf, kFlag);
562 pldm_msgbuf_insert_uint32(buf, kTransferCtx);
563 pldm_msgbuf_insert_uint32(buf, kTransferHandle);
564 pldm_msgbuf_insert_uint32(buf, kSectionOffset);
565 pldm_msgbuf_insert_uint32(buf, kSectionLength);
566 rc = pldm_msgbuf_complete(buf);
567 ASSERT_EQ(rc, 0);
568
569 uint8_t pldm_type;
570 uint8_t flag;
Andrew Jeffery9c766792022-08-10 23:12:49 +0930571 uint32_t transfer_ctx;
572 uint32_t transfer_handle;
573 uint32_t section_offset;
574 uint32_t section_length;
Andrew Jefferyedb88262025-08-14 05:02:21 +0000575 rc = decode_multipart_receive_req(
576 msg, PLDM_MULTIPART_RECEIVE_REQ_BYTES, &pldm_type, &flag, &transfer_ctx,
Andrew Jeffery9c766792022-08-10 23:12:49 +0930577 &transfer_handle, &section_offset, &section_length);
578
Andrew Jefferyedb88262025-08-14 05:02:21 +0000579 ASSERT_EQ(rc, PLDM_SUCCESS);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930580 EXPECT_EQ(pldm_type, kPldmType);
581 EXPECT_EQ(flag, kFlag);
582 EXPECT_EQ(transfer_ctx, kTransferCtx);
583 EXPECT_EQ(transfer_handle, kTransferHandle);
584 EXPECT_EQ(section_offset, kSectionOffset);
585 EXPECT_EQ(section_length, kSectionLength);
586}
587
Chau Lya93a3a02025-08-15 14:22:06 +0000588TEST(DecodeMultipartReceiveRequest, testDecodeRequestFailNullData)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930589{
590 EXPECT_EQ(decode_multipart_receive_req(NULL, 0, NULL, NULL, NULL, NULL,
591 NULL, NULL),
592 PLDM_ERROR_INVALID_DATA);
593}
594
Chau Lya93a3a02025-08-15 14:22:06 +0000595TEST(DecodeMultipartReceiveRequest, testDecodeRequestFailBadLength)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930596{
Andrew Jefferyedb88262025-08-14 05:02:21 +0000597 PLDM_MSG_DEFINE_P(msg, PLDM_MULTIPART_RECEIVE_REQ_BYTES + 1);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930598 uint8_t pldm_type;
599 uint8_t flag;
600 uint32_t transfer_ctx;
601 uint32_t transfer_handle;
602 uint32_t section_offset;
603 uint32_t section_length;
604
Andrew Jefferyedb88262025-08-14 05:02:21 +0000605 memset(msg, 0, PLDM_MSG_SIZE(PLDM_MULTIPART_RECEIVE_REQ_BYTES + 1));
Andrew Jeffery9c766792022-08-10 23:12:49 +0930606 EXPECT_EQ(decode_multipart_receive_req(
Andrew Jefferyedb88262025-08-14 05:02:21 +0000607 msg, PLDM_MULTIPART_RECEIVE_REQ_BYTES + 1, &pldm_type, &flag,
Andrew Jeffery9c766792022-08-10 23:12:49 +0930608 &transfer_ctx, &transfer_handle, &section_offset,
609 &section_length),
Andrew Jeffery9c766792022-08-10 23:12:49 +0930610 PLDM_ERROR_INVALID_DATA);
611}
612
Chau Lya93a3a02025-08-15 14:22:06 +0000613TEST(DecodeMultipartReceiveRequest, testDecodeRequestFailBadPldmType)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930614{
Andrew Jefferyedb88262025-08-14 05:02:21 +0000615 constexpr uint8_t kPldmType = 0xff;
616 constexpr uint8_t kFlag = PLDM_XFER_FIRST_PART;
617
618 PLDM_MSG_DEFINE_P(msg, PLDM_MULTIPART_RECEIVE_REQ_BYTES);
John Chung7a8d9322025-08-27 20:56:19 -0500619 PLDM_MSGBUF_RW_DEFINE_P(buf);
Andrew Jefferyedb88262025-08-14 05:02:21 +0000620 int rc;
621
622 // Header values don't matter for this test.
623 rc = pldm_msgbuf_init_errno(buf, PLDM_MULTIPART_RECEIVE_REQ_BYTES,
624 msg->payload, PLDM_MULTIPART_RECEIVE_REQ_BYTES);
625 ASSERT_EQ(rc, 0);
626 pldm_msgbuf_insert_uint8(buf, kPldmType);
627 pldm_msgbuf_insert_uint8(buf, kFlag);
628 rc = pldm_msgbuf_complete(buf);
629 ASSERT_EQ(rc, 0);
630
Andrew Jeffery9c766792022-08-10 23:12:49 +0930631 uint8_t pldm_type;
632 uint8_t flag;
633 uint32_t transfer_ctx;
634 uint32_t transfer_handle;
635 uint32_t section_offset;
636 uint32_t section_length;
637
Andrew Jefferyedb88262025-08-14 05:02:21 +0000638 EXPECT_EQ(decode_multipart_receive_req(
639 msg, PLDM_MULTIPART_RECEIVE_REQ_BYTES, &pldm_type, &flag,
640 &transfer_ctx, &transfer_handle, &section_offset,
641 &section_length),
642 PLDM_ERROR_INVALID_PLDM_TYPE);
643}
644
Chau Lya93a3a02025-08-15 14:22:06 +0000645TEST(DecodeMultipartReceiveRequest, testDecodeRequestFailBadTransferFlag)
Andrew Jefferyedb88262025-08-14 05:02:21 +0000646{
647 constexpr uint8_t kPldmType = PLDM_BASE;
648 constexpr uint8_t kFlag = PLDM_XFER_CURRENT_PART + 0x10;
649
650 PLDM_MSG_DEFINE_P(msg, PLDM_MULTIPART_RECEIVE_REQ_BYTES);
John Chung7a8d9322025-08-27 20:56:19 -0500651 PLDM_MSGBUF_RW_DEFINE_P(buf);
Andrew Jefferyedb88262025-08-14 05:02:21 +0000652 int rc;
653
Andrew Jeffery9c766792022-08-10 23:12:49 +0930654 // Header values don't matter for this test.
Andrew Jefferyedb88262025-08-14 05:02:21 +0000655 rc = pldm_msgbuf_init_errno(buf, PLDM_MULTIPART_RECEIVE_REQ_BYTES,
656 msg->payload, PLDM_MULTIPART_RECEIVE_REQ_BYTES);
657 ASSERT_EQ(rc, 0);
658 pldm_msgbuf_insert_uint8(buf, kPldmType);
659 pldm_msgbuf_insert_uint8(buf, kFlag);
660 rc = pldm_msgbuf_complete(buf);
661 ASSERT_EQ(rc, 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +0930662
Andrew Jefferyedb88262025-08-14 05:02:21 +0000663 uint8_t pldm_type;
664 uint8_t flag;
665 uint32_t transfer_ctx;
666 uint32_t transfer_handle;
667 uint32_t section_offset;
668 uint32_t section_length;
Andrew Jeffery9c766792022-08-10 23:12:49 +0930669
Andrew Jefferyedb88262025-08-14 05:02:21 +0000670 EXPECT_EQ(decode_multipart_receive_req(
671 msg, PLDM_MULTIPART_RECEIVE_REQ_BYTES, &pldm_type, &flag,
672 &transfer_ctx, &transfer_handle, &section_offset,
673 &section_length),
674 PLDM_ERROR_UNEXPECTED_TRANSFER_FLAG_OPERATION);
675}
676
Chau Lya93a3a02025-08-15 14:22:06 +0000677TEST(DecodeMultipartReceiveRequest, testDecodeRequestFailBadHandle)
Andrew Jefferyedb88262025-08-14 05:02:21 +0000678{
679 constexpr uint8_t kPldmType = PLDM_BASE;
680 constexpr uint8_t kFlag = PLDM_XFER_NEXT_PART;
681 constexpr uint32_t kTransferCtx = 0x01;
682 constexpr uint32_t kTransferHandle = 0x0;
683 constexpr uint32_t kSectionOffset = 0x100;
684
685 PLDM_MSG_DEFINE_P(msg, PLDM_MULTIPART_RECEIVE_REQ_BYTES);
John Chung7a8d9322025-08-27 20:56:19 -0500686 PLDM_MSGBUF_RW_DEFINE_P(buf);
Andrew Jefferyedb88262025-08-14 05:02:21 +0000687 int rc;
688
689 // Header values don't matter for this test.
690 rc = pldm_msgbuf_init_errno(buf, PLDM_MULTIPART_RECEIVE_REQ_BYTES,
691 msg->payload, PLDM_MULTIPART_RECEIVE_REQ_BYTES);
692 ASSERT_EQ(rc, 0);
693 pldm_msgbuf_insert_uint8(buf, kPldmType);
694 pldm_msgbuf_insert_uint8(buf, kFlag);
695 pldm_msgbuf_insert_uint32(buf, kTransferCtx);
696 pldm_msgbuf_insert_uint32(buf, kTransferHandle);
697 pldm_msgbuf_insert_uint32(buf, kSectionOffset);
698 rc = pldm_msgbuf_complete(buf);
699 ASSERT_EQ(rc, 0);
700
701 uint8_t pldm_type;
702 uint8_t flag;
703 uint32_t transfer_ctx;
704 uint32_t transfer_handle;
705 uint32_t section_offset;
706 uint32_t section_length;
707 EXPECT_EQ(decode_multipart_receive_req(
708 msg, PLDM_MULTIPART_RECEIVE_REQ_BYTES, &pldm_type, &flag,
709 &transfer_ctx, &transfer_handle, &section_offset,
710 &section_length),
Andrew Jeffery9c766792022-08-10 23:12:49 +0930711 PLDM_ERROR_INVALID_DATA);
712}
713
Dung Cao88367842024-10-16 06:32:49 +0000714#ifdef LIBPLDM_API_TESTING
715TEST(EncodeMultipartReceiveRequest, GoodTest)
716{
717 uint8_t instance_id = 0;
718
Chau Ly41846232025-08-13 04:43:27 +0000719 const struct pldm_base_multipart_receive_req req_data = {
Dung Cao88367842024-10-16 06:32:49 +0000720 PLDM_BASE, PLDM_XFER_FIRST_PART, 0x01, 0x10, 0x00, 0x10};
721
Chau Lye98a72f2025-08-15 03:38:50 +0000722 static constexpr const size_t requestMsgLength =
723 PLDM_MULTIPART_RECEIVE_REQ_BYTES;
724
725 std::array<uint8_t, requestMsgLength> requestMsg = {
Dung Cao88367842024-10-16 06:32:49 +0000726 PLDM_BASE, PLDM_XFER_FIRST_PART,
727 0x01, 0x00,
728 0x00, 0x00,
729 0x10, 0x00,
730 0x00, 0x00,
731 0x00, 0x00,
732 0x00, 0x00,
733 0x10, 0x00,
734 0x00, 0x00};
735
Chau Lye98a72f2025-08-15 03:38:50 +0000736 PLDM_MSG_DEFINE_P(requestPtr, requestMsgLength);
737 size_t payload_length = requestMsgLength;
Chau Ly41846232025-08-13 04:43:27 +0000738 auto rc = encode_pldm_base_multipart_receive_req(
Chau Lye98a72f2025-08-15 03:38:50 +0000739 instance_id, &req_data, requestPtr, &payload_length);
Dung Cao88367842024-10-16 06:32:49 +0000740
741 ASSERT_EQ(rc, 0);
742 EXPECT_EQ(
743 0, memcmp(requestPtr->payload, requestMsg.data(), sizeof(requestMsg)));
Chau Lye98a72f2025-08-15 03:38:50 +0000744 EXPECT_EQ(payload_length, requestMsgLength);
Dung Cao88367842024-10-16 06:32:49 +0000745}
746#endif
747
748#ifdef LIBPLDM_API_TESTING
749TEST(EncodeMultipartReceiveRequest, BadTestUnAllocatedPtrParams)
750{
751 uint8_t instance_id = 0;
752 int rc;
753
Chau Ly41846232025-08-13 04:43:27 +0000754 const struct pldm_base_multipart_receive_req req_data = {
Dung Cao88367842024-10-16 06:32:49 +0000755 PLDM_BASE, PLDM_XFER_FIRST_PART, 0x01, 0x10, 0x00, 0x10};
756
Chau Lye98a72f2025-08-15 03:38:50 +0000757 static constexpr const size_t requestMsgLength =
758 PLDM_MULTIPART_RECEIVE_REQ_BYTES;
759
760 PLDM_MSG_DEFINE_P(requestPtr, requestMsgLength);
761 size_t payload_length = requestMsgLength;
762 rc = encode_pldm_base_multipart_receive_req(instance_id, nullptr,
763 requestPtr, &payload_length);
Dung Cao88367842024-10-16 06:32:49 +0000764 EXPECT_EQ(rc, -EINVAL);
765
Chau Lye98a72f2025-08-15 03:38:50 +0000766 rc = encode_pldm_base_multipart_receive_req(instance_id, &req_data, nullptr,
767 &payload_length);
Dung Cao88367842024-10-16 06:32:49 +0000768 EXPECT_EQ(rc, -EINVAL);
769}
770#endif
771
772#ifdef LIBPLDM_API_TESTING
773TEST(EncodeMultipartReceiveRequest, BadTestInvalidExpectedOutputMsgLength)
774{
775 uint8_t instance_id = 0;
776 int rc;
777
Chau Ly41846232025-08-13 04:43:27 +0000778 const struct pldm_base_multipart_receive_req req_data = {
Dung Cao88367842024-10-16 06:32:49 +0000779 PLDM_BASE, PLDM_XFER_FIRST_PART, 0x01, 0x10, 0x00, 0x10};
780
Chau Lye98a72f2025-08-15 03:38:50 +0000781 static constexpr const size_t requestMsgLength =
782 PLDM_MULTIPART_RECEIVE_REQ_BYTES;
Dung Cao88367842024-10-16 06:32:49 +0000783
Chau Lye98a72f2025-08-15 03:38:50 +0000784 PLDM_MSG_DEFINE_P(requestPtr, requestMsgLength);
785 size_t payload_length = 1;
Chau Ly41846232025-08-13 04:43:27 +0000786 rc = encode_pldm_base_multipart_receive_req(instance_id, &req_data,
Chau Lye98a72f2025-08-15 03:38:50 +0000787 requestPtr, &payload_length);
Dung Cao88367842024-10-16 06:32:49 +0000788 EXPECT_EQ(rc, -EOVERFLOW);
789}
790#endif
791
792#ifdef LIBPLDM_API_TESTING
793TEST(DecodeMultipartReceiveResponse, GoodTest)
794{
795 uint8_t completionCode = PLDM_SUCCESS;
796 uint8_t transferFlag = PLDM_BASE_MULTIPART_RECEIVE_TRANSFER_FLAG_END;
797 uint32_t nextDataTransferHandle = 0x15;
798 static constexpr const uint32_t dataLength = 9;
799 std::vector<uint8_t> data = {1, 2, 3, 4, 5, 6, 7, 8, 9};
800 uint32_t dataIntegrityChecksum = 0x3C;
801
Chau Ly41846232025-08-13 04:43:27 +0000802 struct pldm_base_multipart_receive_resp resp_data = {};
Dung Cao88367842024-10-16 06:32:49 +0000803
John Chung7a8d9322025-08-27 20:56:19 -0500804 PLDM_MSGBUF_RW_DEFINE_P(buf);
Dung Cao88367842024-10-16 06:32:49 +0000805 int rc;
806
807 static constexpr const size_t payload_length =
808 PLDM_BASE_MULTIPART_RECEIVE_RESP_MIN_BYTES + dataLength +
809 sizeof(dataIntegrityChecksum);
810 PLDM_MSG_DEFINE_P(responseMsg, payload_length);
811
812 rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
813 ASSERT_EQ(rc, 0);
814
815 pldm_msgbuf_insert_uint8(buf, completionCode);
816 pldm_msgbuf_insert_uint8(buf, transferFlag);
817 pldm_msgbuf_insert_uint32(buf, nextDataTransferHandle);
818 pldm_msgbuf_insert_uint32(buf, dataLength);
819 rc = pldm_msgbuf_insert_array_uint8(buf, dataLength, data.data(),
820 dataLength);
821 EXPECT_EQ(rc, 0);
822 pldm_msgbuf_insert_uint32(buf, dataIntegrityChecksum);
823
824 ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
825
826 uint32_t respDataIntegrityChecksum = 0;
827
Chau Ly41846232025-08-13 04:43:27 +0000828 rc = decode_pldm_base_multipart_receive_resp(
Dung Cao88367842024-10-16 06:32:49 +0000829 responseMsg, payload_length, &resp_data, &respDataIntegrityChecksum);
830
831 ASSERT_EQ(rc, 0);
832 EXPECT_EQ(resp_data.completion_code, completionCode);
833 EXPECT_EQ(resp_data.transfer_flag, transferFlag);
834 EXPECT_EQ(resp_data.next_transfer_handle, nextDataTransferHandle);
835 EXPECT_EQ(resp_data.data.length, dataLength);
836 EXPECT_EQ(0,
837 memcmp(data.data(), resp_data.data.ptr, resp_data.data.length));
838 EXPECT_EQ(respDataIntegrityChecksum, dataIntegrityChecksum);
839}
840#endif
841
842#ifdef LIBPLDM_API_TESTING
843TEST(DecodeMultipartReceiveResponse, BadTestUnAllocatedPtrParams)
844{
845 uint8_t completionCode = PLDM_SUCCESS;
846 uint8_t transferFlag = PLDM_BASE_MULTIPART_RECEIVE_TRANSFER_FLAG_END;
847 uint32_t nextDataTransferHandle = 0x15;
848 static constexpr const uint32_t dataLength = 9;
849 std::vector<uint8_t> data = {1, 2, 3, 4, 5, 6, 7, 8, 9};
850 uint32_t dataIntegrityChecksum = 0x3C;
851
Chau Ly41846232025-08-13 04:43:27 +0000852 struct pldm_base_multipart_receive_resp resp_data = {};
Dung Cao88367842024-10-16 06:32:49 +0000853
John Chung7a8d9322025-08-27 20:56:19 -0500854 PLDM_MSGBUF_RW_DEFINE_P(buf);
Dung Cao88367842024-10-16 06:32:49 +0000855 int rc;
856
857 static constexpr const size_t payload_length =
858 PLDM_BASE_MULTIPART_RECEIVE_RESP_MIN_BYTES + dataLength +
859 sizeof(dataIntegrityChecksum);
860 PLDM_MSG_DEFINE_P(responseMsg, payload_length);
861
862 rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
863 ASSERT_EQ(rc, 0);
864
865 pldm_msgbuf_insert_uint8(buf, completionCode);
866 pldm_msgbuf_insert_uint8(buf, transferFlag);
867 pldm_msgbuf_insert_uint32(buf, nextDataTransferHandle);
868 pldm_msgbuf_insert_uint32(buf, dataLength);
869 rc = pldm_msgbuf_insert_array_uint8(buf, dataLength, data.data(),
870 dataLength);
871 EXPECT_EQ(rc, 0);
872 pldm_msgbuf_insert_uint32(buf, dataIntegrityChecksum);
873
874 ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
875
876 uint32_t respDataIntegrityChecksum = 0;
877
Chau Ly41846232025-08-13 04:43:27 +0000878 rc = decode_pldm_base_multipart_receive_resp(
879 nullptr, payload_length, &resp_data, &respDataIntegrityChecksum);
Dung Cao88367842024-10-16 06:32:49 +0000880
881 EXPECT_EQ(rc, -EINVAL);
882
Chau Ly41846232025-08-13 04:43:27 +0000883 rc = decode_pldm_base_multipart_receive_resp(
Dung Cao88367842024-10-16 06:32:49 +0000884 responseMsg, payload_length, nullptr, &respDataIntegrityChecksum);
885
886 EXPECT_EQ(rc, -EINVAL);
887}
888#endif
889
890#ifdef LIBPLDM_API_TESTING
891TEST(DecodeMultipartReceiveResponse, BadTestInvalidExpectedInputMsgLength)
892{
893 uint8_t completionCode = PLDM_SUCCESS;
894 uint8_t transferFlag = PLDM_BASE_MULTIPART_RECEIVE_TRANSFER_FLAG_END;
895 uint32_t nextDataTransferHandle = 0x15;
896 static constexpr const uint32_t dataLength = 9;
897 std::vector<uint8_t> data = {1, 2, 3, 4, 5, 6, 7, 8, 9};
898 uint32_t dataIntegrityChecksum = 0x3C;
899
Chau Ly41846232025-08-13 04:43:27 +0000900 struct pldm_base_multipart_receive_resp resp_data = {};
Dung Cao88367842024-10-16 06:32:49 +0000901
John Chung7a8d9322025-08-27 20:56:19 -0500902 PLDM_MSGBUF_RW_DEFINE_P(buf);
Dung Cao88367842024-10-16 06:32:49 +0000903 int rc;
904
905 static constexpr const size_t payload_length =
906 PLDM_BASE_MULTIPART_RECEIVE_RESP_MIN_BYTES + dataLength +
907 sizeof(dataIntegrityChecksum);
908 PLDM_MSG_DEFINE_P(responseMsg, payload_length);
909
910 rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
911 ASSERT_EQ(rc, 0);
912
913 pldm_msgbuf_insert_uint8(buf, completionCode);
914 pldm_msgbuf_insert_uint8(buf, transferFlag);
915 pldm_msgbuf_insert_uint32(buf, nextDataTransferHandle);
916 pldm_msgbuf_insert_uint32(buf, dataLength);
917 rc = pldm_msgbuf_insert_array_uint8(buf, dataLength, data.data(),
918 dataLength);
919 EXPECT_EQ(rc, 0);
920 pldm_msgbuf_insert_uint32(buf, dataIntegrityChecksum);
921
922 ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
923
924 uint32_t respDataIntegrityChecksum = 0;
925
Chau Ly41846232025-08-13 04:43:27 +0000926 rc = decode_pldm_base_multipart_receive_resp(responseMsg, 0, &resp_data,
927 &respDataIntegrityChecksum);
Dung Cao88367842024-10-16 06:32:49 +0000928
929 EXPECT_EQ(rc, -EOVERFLOW);
930}
931#endif
932
John Chung21a639d2025-07-17 18:48:19 -0500933#ifdef LIBPLDM_API_TESTING
Chau Ly61217732025-08-15 14:03:43 +0000934TEST(DecodeMultipartReceiveResponse, BadTestRedundantCheckSum)
935{
936 uint8_t completionCode = PLDM_SUCCESS;
937 uint8_t transferFlag =
938 PLDM_BASE_MULTIPART_RECEIVE_TRANSFER_FLAG_ACK_COMPLETION;
939 uint32_t nextDataTransferHandle = 0x00;
940 static constexpr const uint32_t dataLength = 0;
941 uint32_t dataIntegrityChecksum = 0x2c;
942
943 struct pldm_base_multipart_receive_resp resp_data = {};
944
John Chung7a8d9322025-08-27 20:56:19 -0500945 PLDM_MSGBUF_RW_DEFINE_P(buf);
Chau Ly61217732025-08-15 14:03:43 +0000946 int rc;
947
948 /*
949 * Data field is omitted in a response with ACKNOWLEDGE_COMPLETION
950 * TransferFlag. Intentionally insert a DataIntegrityChecksum field to the
951 * response message
952 */
953
954 static constexpr const size_t payload_length =
955 PLDM_BASE_MULTIPART_RECEIVE_RESP_MIN_BYTES + dataLength +
956 sizeof(dataIntegrityChecksum);
957 PLDM_MSG_DEFINE_P(responseMsg, payload_length);
958
959 rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
960 ASSERT_EQ(rc, 0);
961
962 pldm_msgbuf_insert_uint8(buf, completionCode);
963 pldm_msgbuf_insert_uint8(buf, transferFlag);
964 pldm_msgbuf_insert_uint32(buf, nextDataTransferHandle);
965 pldm_msgbuf_insert_uint32(buf, dataLength);
966 pldm_msgbuf_insert_uint32(buf, dataIntegrityChecksum);
967
968 ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
969
970 uint32_t respDataIntegrityChecksum = 0;
971
972 rc = decode_pldm_base_multipart_receive_resp(
973 responseMsg, payload_length, &resp_data, &respDataIntegrityChecksum);
974
975 /*
976 * pldm_msgbuf_complete_consumed() returns -EBADMSG as
977 * decode_pldm_base_multipart_receive_resp() didn't consume all the input
978 * message buffer.
979 */
980 EXPECT_EQ(rc, -EBADMSG);
981}
982#endif
983
984#ifdef LIBPLDM_API_TESTING
985TEST(DecodeMultipartReceiveResponse, BadTestMissingCheckSum)
986{
987 uint8_t completionCode = PLDM_SUCCESS;
988 uint8_t transferFlag = PLDM_BASE_MULTIPART_RECEIVE_TRANSFER_FLAG_END;
989 uint32_t nextDataTransferHandle = 0x00;
990 static constexpr const uint32_t dataLength = 9;
991 std::vector<uint8_t> data = {1, 2, 3, 4, 5, 6, 7, 8, 9};
992
993 struct pldm_base_multipart_receive_resp resp_data = {};
994
John Chung7a8d9322025-08-27 20:56:19 -0500995 PLDM_MSGBUF_RW_DEFINE_P(buf);
Chau Ly61217732025-08-15 14:03:43 +0000996 int rc;
997
998 /*
999 * Intentionally do not insert DataIntegrityChecksum field to the response
1000 * message
1001 */
1002 static constexpr const size_t payload_length =
1003 PLDM_BASE_MULTIPART_RECEIVE_RESP_MIN_BYTES + dataLength;
1004 PLDM_MSG_DEFINE_P(responseMsg, payload_length);
1005
1006 rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
1007 ASSERT_EQ(rc, 0);
1008
1009 pldm_msgbuf_insert_uint8(buf, completionCode);
1010 pldm_msgbuf_insert_uint8(buf, transferFlag);
1011 pldm_msgbuf_insert_uint32(buf, nextDataTransferHandle);
1012 pldm_msgbuf_insert_uint32(buf, dataLength);
1013 rc = pldm_msgbuf_insert_array_uint8(buf, dataLength, data.data(),
1014 dataLength);
1015 EXPECT_EQ(rc, 0);
1016
1017 ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
1018
1019 uint32_t respDataIntegrityChecksum = 0;
1020
1021 rc = decode_pldm_base_multipart_receive_resp(
1022 responseMsg, payload_length, &resp_data, &respDataIntegrityChecksum);
1023
1024 /*
1025 * pldm_msgbuf_extract_p() returns -EOVERFLOW as
1026 * decode_pldm_base_multipart_receive_resp() tried to consume more than
1027 * the expected input message buffer.
1028 */
1029 EXPECT_EQ(rc, -EOVERFLOW);
1030}
1031#endif
1032
1033#ifdef LIBPLDM_API_TESTING
John Chung21a639d2025-07-17 18:48:19 -05001034TEST(EncodeMultipartReceiveResponse, GoodTestWithChecksum)
1035{
1036 uint8_t instance_id = 0;
1037 uint8_t completionCode = PLDM_SUCCESS;
1038 uint8_t transferFlag =
1039 PLDM_BASE_MULTIPART_RECEIVE_TRANSFER_FLAG_START_AND_END;
1040 uint32_t nextDataTransferHandle = 0x15;
1041 static constexpr const uint32_t dataLength = 9;
1042 std::vector<uint8_t> data = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1043 uint32_t dataIntegrityChecksum = 0x3C;
1044 static constexpr const size_t responseMsgLength =
1045 PLDM_BASE_MULTIPART_RECEIVE_RESP_MIN_BYTES + dataLength +
1046 sizeof(dataIntegrityChecksum);
1047 size_t payload_length = responseMsgLength;
1048
1049 struct variable_field payload = {data.data(), dataLength};
Chau Ly41846232025-08-13 04:43:27 +00001050 struct pldm_base_multipart_receive_resp resp_data = {
John Chung21a639d2025-07-17 18:48:19 -05001051 completionCode, transferFlag, nextDataTransferHandle, payload};
1052 std::array<uint8_t, responseMsgLength> responseMsg = {
1053 completionCode,
1054 transferFlag,
1055 0x15, // nextDataTransferHandle
1056 0x00,
1057 0x00,
1058 0x00,
1059 0x09, // dataLength
1060 0x00,
1061 0x00,
1062 0x00,
1063 0x1, // data
1064 0x2,
1065 0x3,
1066 0x4,
1067 0x5,
1068 0x6,
1069 0x7,
1070 0x8,
1071 0x9,
1072 0x3c, // dataIntegrityChecksum
1073 0x00,
1074 0x00,
1075 0x00};
1076
1077 PLDM_MSG_DEFINE_P(responsePtr, responseMsgLength);
1078 int rc;
1079
1080 rc = encode_base_multipart_receive_resp(instance_id, &resp_data,
1081 dataIntegrityChecksum, responsePtr,
1082 &payload_length);
1083
1084 ASSERT_EQ(0, rc);
1085 EXPECT_EQ(0, memcmp(responsePtr->payload, responseMsg.data(),
1086 sizeof(responseMsg)));
1087 EXPECT_EQ(payload_length, responseMsgLength);
1088}
1089#endif
1090
1091#ifdef LIBPLDM_API_TESTING
1092TEST(EncodeMultipartReceiveResponse, GoodTestWithoutChecksum)
1093{
1094 uint8_t instance_id = 0;
1095 uint8_t completionCode = PLDM_SUCCESS;
1096 uint8_t transferFlag = PLDM_BASE_MULTIPART_RECEIVE_TRANSFER_FLAG_START;
1097 uint32_t nextDataTransferHandle = 0x16;
1098 static constexpr const uint32_t dataLength = 9;
1099 std::vector<uint8_t> data = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1100 static constexpr const size_t responseMsgLength =
1101 PLDM_BASE_MULTIPART_RECEIVE_RESP_MIN_BYTES + dataLength;
1102 size_t payload_length = responseMsgLength;
1103
1104 struct variable_field payload = {data.data(), dataLength};
Chau Ly41846232025-08-13 04:43:27 +00001105 struct pldm_base_multipart_receive_resp resp_data = {
John Chung21a639d2025-07-17 18:48:19 -05001106 completionCode, transferFlag, nextDataTransferHandle, payload};
1107 std::array<uint8_t, responseMsgLength> responseMsg = {
1108 completionCode,
1109 transferFlag,
1110 0x16, // nextDataTransferHandle
1111 0x00,
1112 0x00,
1113 0x00,
1114 0x09, // dataLength
1115 0x00,
1116 0x00,
1117 0x00,
1118 0x1, // data
1119 0x2,
1120 0x3,
1121 0x4,
1122 0x5,
1123 0x6,
1124 0x7,
1125 0x8,
1126 0x9};
1127
1128 PLDM_MSG_DEFINE_P(responsePtr, responseMsgLength);
1129 int rc;
1130
1131 rc = encode_base_multipart_receive_resp(instance_id, &resp_data, 0,
1132 responsePtr, &payload_length);
1133
1134 ASSERT_EQ(0, rc);
1135 EXPECT_EQ(0, memcmp(responsePtr->payload, responseMsg.data(),
1136 sizeof(responseMsg)));
1137 EXPECT_EQ(payload_length, responseMsgLength);
1138}
1139#endif
1140
1141#ifdef LIBPLDM_API_TESTING
1142TEST(EncodeMultipartReceiveResponse, GoodTestCompletionCode)
1143{
1144 uint8_t instance_id = 0;
1145 uint8_t completionCode = PLDM_MULTIPART_RECEIVE_NEGOTIATION_INCOMPLETE;
1146 uint8_t transferFlag = PLDM_BASE_MULTIPART_RECEIVE_TRANSFER_FLAG_START;
1147 uint32_t nextDataTransferHandle = 0x16;
1148 static constexpr const uint32_t dataLength = 9;
1149 std::vector<uint8_t> data = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1150 static constexpr const size_t responseMsgLength =
1151 PLDM_BASE_MULTIPART_RECEIVE_RESP_MIN_BYTES + dataLength;
1152 size_t payload_length = responseMsgLength;
1153
1154 struct variable_field payload = {data.data(), dataLength};
Chau Ly41846232025-08-13 04:43:27 +00001155 struct pldm_base_multipart_receive_resp resp_data = {
John Chung21a639d2025-07-17 18:48:19 -05001156 completionCode, transferFlag, nextDataTransferHandle, payload};
1157 std::array<uint8_t, 1> responseMsg = {completionCode};
1158
1159 PLDM_MSG_DEFINE_P(responsePtr, responseMsgLength);
1160 int rc;
1161
1162 rc = encode_base_multipart_receive_resp(instance_id, &resp_data, 0,
1163 responsePtr, &payload_length);
1164
1165 ASSERT_EQ(0, rc);
1166 EXPECT_EQ(0, memcmp(responsePtr->payload, responseMsg.data(),
1167 sizeof(responseMsg)));
Andrew Jeffery94f7fd62025-09-16 11:28:05 +09301168 EXPECT_EQ(payload_length, 1ul);
John Chung21a639d2025-07-17 18:48:19 -05001169}
1170#endif
1171
1172#ifdef LIBPLDM_API_TESTING
1173TEST(EncodeMultipartReceiveResponse, BadTestUnAllocatedParams)
1174{
1175 uint8_t instance_id = 0;
1176 uint8_t completionCode = PLDM_SUCCESS;
1177 uint8_t transferFlag =
1178 PLDM_BASE_MULTIPART_RECEIVE_TRANSFER_FLAG_START_AND_END;
1179 uint32_t nextDataTransferHandle = 0x15;
1180 static constexpr const uint32_t dataLength = 9;
1181 std::vector<uint8_t> data = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1182 uint32_t dataIntegrityChecksum = 0x3C;
1183 static constexpr const size_t responseMsgLength =
1184 PLDM_BASE_MULTIPART_RECEIVE_RESP_MIN_BYTES + dataLength +
1185 sizeof(dataIntegrityChecksum);
1186 size_t payload_length = responseMsgLength;
1187
1188 struct variable_field payload = {data.data(), dataLength};
Chau Ly41846232025-08-13 04:43:27 +00001189 struct pldm_base_multipart_receive_resp resp_data = {
John Chung21a639d2025-07-17 18:48:19 -05001190 completionCode, transferFlag, nextDataTransferHandle, payload};
1191
1192 PLDM_MSG_DEFINE_P(responsePtr, responseMsgLength);
1193 int rc;
1194
1195 rc = encode_base_multipart_receive_resp(instance_id, nullptr,
1196 dataIntegrityChecksum, responsePtr,
1197 &payload_length);
1198 EXPECT_EQ(rc, -EINVAL);
1199
1200 rc = encode_base_multipart_receive_resp(instance_id, &resp_data,
1201 dataIntegrityChecksum, nullptr,
1202 &payload_length);
1203 EXPECT_EQ(rc, -EINVAL);
1204
1205 rc = encode_base_multipart_receive_resp(
1206 instance_id, &resp_data, dataIntegrityChecksum, responsePtr, nullptr);
1207 EXPECT_EQ(rc, -EINVAL);
1208
1209 resp_data.data.ptr = nullptr;
1210 rc = encode_base_multipart_receive_resp(instance_id, &resp_data,
1211 dataIntegrityChecksum, responsePtr,
1212 &payload_length);
1213 EXPECT_EQ(rc, -EINVAL);
1214}
1215#endif
1216
1217#ifdef LIBPLDM_API_TESTING
1218TEST(EncodeMultipartReceiveResponse, BadTestInvalidExpectedOutputMsgLength)
1219{
1220 uint8_t instance_id = 0;
1221 uint8_t completionCode = PLDM_SUCCESS;
1222 uint8_t transferFlag = PLDM_BASE_MULTIPART_RECEIVE_TRANSFER_FLAG_START;
1223 uint32_t nextDataTransferHandle = 0x16;
1224 static constexpr const uint32_t dataLength = 9;
1225 std::vector<uint8_t> data = {1, 2, 3, 4, 5, 6, 7, 8, 9};
1226 static constexpr const size_t responseMsgLength =
1227 PLDM_BASE_MULTIPART_RECEIVE_RESP_MIN_BYTES;
1228 size_t payload_length = responseMsgLength;
1229
1230 struct variable_field payload = {data.data(), dataLength};
Chau Ly41846232025-08-13 04:43:27 +00001231 struct pldm_base_multipart_receive_resp resp_data = {
John Chung21a639d2025-07-17 18:48:19 -05001232 completionCode, transferFlag, nextDataTransferHandle, payload};
1233
1234 PLDM_MSG_DEFINE_P(responsePtr, responseMsgLength);
1235 int rc;
1236
1237 rc = encode_base_multipart_receive_resp(instance_id, &resp_data, 0,
1238 responsePtr, &payload_length);
1239 EXPECT_EQ(rc, -EOVERFLOW);
1240}
1241#endif
1242
Andrew Jeffery9c766792022-08-10 23:12:49 +09301243TEST(CcOnlyResponse, testEncode)
1244{
1245 struct pldm_msg responseMsg;
1246
1247 auto rc =
1248 encode_cc_only_resp(0 /*instance id*/, 1 /*pldm type*/, 2 /*command*/,
Manojkiran Eda9e3a5d42024-06-17 16:06:42 +05301249 3 /*completion code*/, &responseMsg);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301250 EXPECT_EQ(rc, PLDM_SUCCESS);
1251
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301252 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301253 auto p = reinterpret_cast<uint8_t*>(&responseMsg);
1254 EXPECT_THAT(std::vector<uint8_t>(p, p + sizeof(responseMsg)),
1255 ElementsAreArray({0, 1, 2, 3}));
1256
1257 rc = encode_cc_only_resp(PLDM_INSTANCE_MAX + 1, 1, 2, 3, &responseMsg);
1258 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1259
1260 rc = encode_cc_only_resp(0, 1, 2, 3, nullptr);
1261 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1262}
Gilbert Chen6c9c9172022-10-18 17:07:29 +08001263
1264TEST(SetTID, testGoodEncodeRequest)
1265{
1266 uint8_t instanceId = 0;
1267 uint8_t tid = 0x01;
1268 std::array<uint8_t, sizeof(pldm_msg_hdr) + sizeof(tid)> requestMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301269 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Gilbert Chen6c9c9172022-10-18 17:07:29 +08001270 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1271
1272 auto rc = encode_set_tid_req(instanceId, tid, request);
1273 ASSERT_EQ(rc, PLDM_SUCCESS);
1274
1275 EXPECT_EQ(request->hdr.command, PLDM_SET_TID);
1276 EXPECT_EQ(request->hdr.type, PLDM_BASE);
1277 EXPECT_EQ(request->hdr.request, 1);
1278 EXPECT_EQ(request->hdr.datagram, 0);
1279 EXPECT_EQ(request->hdr.instance_id, instanceId);
1280 EXPECT_EQ(0, memcmp(request->payload, &tid, sizeof(tid)));
1281}
1282
1283TEST(SetTID, testBadEncodeRequest)
1284{
1285 uint8_t tid = 0x01;
1286 std::array<uint8_t, sizeof(pldm_msg_hdr) + sizeof(tid)> requestMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301287 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Gilbert Chen6c9c9172022-10-18 17:07:29 +08001288 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1289
1290 auto rc = encode_set_tid_req(0, tid, nullptr);
1291 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1292
1293 rc = encode_set_tid_req(0, 0, request);
1294 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1295
1296 rc = encode_set_tid_req(0, 0xff, request);
1297 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1298}
Andrew Jeffery91c06e92023-09-22 15:22:54 +09301299
1300#ifdef LIBPLDM_API_TESTING
Vishnu Santhoshec19cbc2025-05-30 16:34:28 +05301301TEST(SetTID, testGoodDecodeRequest)
1302{
1303 uint8_t tid = 0x01;
1304 uint8_t tidOut = 0x00;
1305 std::array<uint8_t, sizeof(pldm_msg_hdr) + sizeof(tid)> requestMsg{};
1306
1307 requestMsg[sizeof(pldm_msg_hdr)] = tid;
1308
1309 pldm_msg* request = new (requestMsg.data()) pldm_msg;
1310 auto rc = decode_set_tid_req(
1311 request, requestMsg.size() - sizeof(pldm_msg_hdr), &tidOut);
1312
1313 EXPECT_EQ(rc, PLDM_SUCCESS);
1314 EXPECT_EQ(tid, tidOut);
1315}
1316#endif
1317
1318#ifdef LIBPLDM_API_TESTING
1319TEST(SetTID, testBadDecodeRequestMsg)
1320{
1321 uint8_t tid = 0x01;
1322 std::array<uint8_t, hdrSize + PLDM_SET_TID_REQ_BYTES> requestMsg{};
1323
1324 auto rc = decode_set_tid_req(
1325 nullptr, requestMsg.size() - sizeof(pldm_msg_hdr), &tid);
1326
1327 EXPECT_EQ(rc, -EINVAL);
1328}
1329#endif
1330
1331#ifdef LIBPLDM_API_TESTING
1332TEST(SetTID, testBadDecodeRequestTid)
1333{
1334 std::array<uint8_t, hdrSize + PLDM_SET_TID_REQ_BYTES> requestMsg{};
1335 pldm_msg* request = new (requestMsg.data()) pldm_msg;
1336
1337 auto rc = decode_set_tid_req(
1338 request, requestMsg.size() - sizeof(pldm_msg_hdr), nullptr);
1339
1340 EXPECT_EQ(rc, -EINVAL);
1341}
1342#endif
1343
1344#ifdef LIBPLDM_API_TESTING
1345TEST(SetTID, testBadDecodeRequestMsgSize)
1346{
1347 std::array<uint8_t, hdrSize + PLDM_SET_TID_REQ_BYTES> requestMsg{};
1348 pldm_msg* request = new (requestMsg.data()) pldm_msg;
1349
1350 auto rc = decode_set_tid_req(request, -1, nullptr);
1351
1352 EXPECT_EQ(rc, -EINVAL);
1353}
1354#endif
1355
1356#ifdef LIBPLDM_API_TESTING
Andrew Jeffery91c06e92023-09-22 15:22:54 +09301357TEST(PldmMsgHdr, correlateSuccess)
1358{
1359 static const struct pldm_msg_hdr req = {
1360 .instance_id = 0,
1361 .reserved = 0,
1362 .datagram = 0,
1363 .request = 1,
1364 .type = 0,
1365 .header_ver = 1,
1366 .command = 0x01,
1367 };
1368 static const struct pldm_msg_hdr resp = {
1369 .instance_id = 0,
1370 .reserved = 0,
1371 .datagram = 0,
1372 .request = 0,
1373 .type = 0,
1374 .header_ver = 1,
1375 .command = 0x01,
1376 };
1377
1378 ASSERT_EQ(pldm_msg_hdr_correlate_response(&req, &resp), true);
1379}
1380#endif
1381
1382#ifdef LIBPLDM_API_TESTING
1383TEST(PldmMsgHdr, correlateFailInstanceID)
1384{
1385 static const struct pldm_msg_hdr req = {
1386 .instance_id = 0,
1387 .reserved = 0,
1388 .datagram = 0,
1389 .request = 1,
1390 .type = 0,
1391 .header_ver = 1,
1392 .command = 0x01,
1393 };
1394 static const struct pldm_msg_hdr resp = {
1395 .instance_id = 1,
1396 .reserved = 0,
1397 .datagram = 0,
1398 .request = 0,
1399 .type = 0,
1400 .header_ver = 1,
1401 .command = 0x01,
1402 };
1403
1404 ASSERT_EQ(pldm_msg_hdr_correlate_response(&req, &resp), false);
1405}
1406#endif
1407
1408#ifdef LIBPLDM_API_TESTING
1409TEST(PldmMsgHdr, correlateFailRequest)
1410{
1411 static const struct pldm_msg_hdr req = {
1412 .instance_id = 0,
1413 .reserved = 0,
1414 .datagram = 0,
1415 .request = 1,
1416 .type = 0,
1417 .header_ver = 1,
1418 .command = 0x01,
1419 };
1420 static const struct pldm_msg_hdr resp = {
1421 .instance_id = 0,
1422 .reserved = 0,
1423 .datagram = 0,
1424 .request = 1,
1425 .type = 0,
1426 .header_ver = 1,
1427 .command = 0x01,
1428 };
1429
1430 ASSERT_EQ(pldm_msg_hdr_correlate_response(&req, &resp), false);
1431}
1432#endif
1433
1434#ifdef LIBPLDM_API_TESTING
1435TEST(PldmMsgHdr, correlateFailType)
1436{
1437 static const struct pldm_msg_hdr req = {
1438 .instance_id = 0,
1439 .reserved = 0,
1440 .datagram = 0,
1441 .request = 1,
1442 .type = 0,
1443 .header_ver = 1,
1444 .command = 0x01,
1445 };
1446 static const struct pldm_msg_hdr resp = {
1447 .instance_id = 0,
1448 .reserved = 0,
1449 .datagram = 0,
1450 .request = 0,
1451 .type = 1,
1452 .header_ver = 1,
1453 .command = 0x01,
1454 };
1455
1456 ASSERT_EQ(pldm_msg_hdr_correlate_response(&req, &resp), false);
1457}
1458#endif
1459
1460#ifdef LIBPLDM_API_TESTING
1461TEST(PldmMsgHdr, correlateFailCommand)
1462{
1463 static const struct pldm_msg_hdr req = {
1464 .instance_id = 0,
1465 .reserved = 0,
1466 .datagram = 0,
1467 .request = 1,
1468 .type = 0,
1469 .header_ver = 1,
1470 .command = 0x01,
1471 };
1472 static const struct pldm_msg_hdr resp = {
1473 .instance_id = 0,
1474 .reserved = 0,
1475 .datagram = 0,
1476 .request = 0,
1477 .type = 0,
1478 .header_ver = 1,
1479 .command = 0x02,
1480 };
1481
1482 ASSERT_EQ(pldm_msg_hdr_correlate_response(&req, &resp), false);
1483}
1484#endif
1485
1486#ifdef LIBPLDM_API_TESTING
1487TEST(PldmMsgHdr, correlateFailRequestIsResponse)
1488{
1489 static const struct pldm_msg_hdr req = {
1490 .instance_id = 0,
1491 .reserved = 0,
1492 .datagram = 0,
1493 .request = 0,
1494 .type = 0,
1495 .header_ver = 1,
1496 .command = 0x01,
1497 };
1498 static const struct pldm_msg_hdr resp = {
1499 .instance_id = 0,
1500 .reserved = 0,
1501 .datagram = 0,
1502 .request = 0,
1503 .type = 0,
1504 .header_ver = 1,
1505 .command = 0x02,
1506 };
1507
1508 ASSERT_EQ(pldm_msg_hdr_correlate_response(&req, &resp), false);
1509}
1510#endif
Chau Ly59dce782025-04-01 08:22:07 +00001511
1512#ifdef LIBPLDM_API_TESTING
1513TEST(EncodeNegotiateTransferParamsRequest, GoodTest)
1514{
1515 uint8_t instance_id = 0;
1516
1517 const struct pldm_base_negotiate_transfer_params_req req_data = {
1518 0x0001, // BE 256
1519 {{0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x81}}};
1520
Chau Lye98a72f2025-08-15 03:38:50 +00001521 static constexpr const size_t requestMsgLength =
1522 PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES;
Chau Ly59dce782025-04-01 08:22:07 +00001523
Chau Lye98a72f2025-08-15 03:38:50 +00001524 std::array<uint8_t, requestMsgLength> requestMsg = {
1525 0x01, 0x00, // requester_part_size = 256
1526 0x00, 0x00, 0x00, 0x00,
1527 0x00, 0x00, 0x00, 0x81}; // requester_protocol_support =
1528 // PLDM_BASE & PLDM_FILE
1529
1530 PLDM_MSG_DEFINE_P(requestPtr, requestMsgLength);
1531 size_t payload_length = requestMsgLength;
Chau Ly59dce782025-04-01 08:22:07 +00001532 auto rc = encode_pldm_base_negotiate_transfer_params_req(
Chau Lye98a72f2025-08-15 03:38:50 +00001533 instance_id, &req_data, requestPtr, &payload_length);
Chau Ly59dce782025-04-01 08:22:07 +00001534
1535 ASSERT_EQ(rc, 0);
1536 EXPECT_EQ(
1537 0, memcmp(requestPtr->payload, requestMsg.data(), sizeof(requestMsg)));
Chau Lye98a72f2025-08-15 03:38:50 +00001538 EXPECT_EQ(payload_length, requestMsgLength);
Chau Ly59dce782025-04-01 08:22:07 +00001539}
1540#endif
1541
1542#ifdef LIBPLDM_API_TESTING
1543TEST(EncodeNegotiateTransferParamsRequest, BadTestUnAllocatedPtrParams)
1544{
1545 int rc;
1546 uint8_t instance_id = 0;
1547 const struct pldm_base_negotiate_transfer_params_req req_data = {
1548 0x0001, // BE 256
1549 {{0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x81}}};
1550
Chau Lye98a72f2025-08-15 03:38:50 +00001551 static constexpr const size_t requestMsgLength =
1552 PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES;
1553
1554 PLDM_MSG_DEFINE_P(requestPtr, requestMsgLength);
1555 size_t payload_length = requestMsgLength;
Chau Ly59dce782025-04-01 08:22:07 +00001556 rc = encode_pldm_base_negotiate_transfer_params_req(
Chau Lye98a72f2025-08-15 03:38:50 +00001557 instance_id, nullptr, requestPtr, &payload_length);
Chau Ly59dce782025-04-01 08:22:07 +00001558 EXPECT_EQ(rc, -EINVAL);
1559
1560 rc = encode_pldm_base_negotiate_transfer_params_req(
Chau Lye98a72f2025-08-15 03:38:50 +00001561 instance_id, &req_data, nullptr, &payload_length);
Chau Ly59dce782025-04-01 08:22:07 +00001562 EXPECT_EQ(rc, -EINVAL);
1563}
1564#endif
1565
1566#ifdef LIBPLDM_API_TESTING
1567TEST(EncodeNegotiateTransferParamsRequest,
1568 BadTestInvalidExpectedOutputMsgLength)
1569{
1570 int rc;
1571 uint8_t instance_id = 0;
1572 const struct pldm_base_negotiate_transfer_params_req req_data = {
1573 0x0001, // BE 256
1574 {{0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x81}}};
1575
1576 PLDM_MSG_DEFINE_P(requestPtr,
1577 PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES);
1578
Chau Lye98a72f2025-08-15 03:38:50 +00001579 size_t payload_length = 1;
1580 rc = encode_pldm_base_negotiate_transfer_params_req(
1581 instance_id, &req_data, requestPtr, &payload_length);
Chau Ly59dce782025-04-01 08:22:07 +00001582 EXPECT_EQ(rc, -EOVERFLOW);
1583}
1584#endif
1585
1586#ifdef LIBPLDM_API_TESTING
1587TEST(DecodeNegotiateTransferParamsResponse, GoodTest)
1588{
1589 uint8_t completionCode = PLDM_SUCCESS;
1590 uint16_t responderPartSize = 128;
1591 std::array<uint8_t, 8> responderProtocolSupport = {0x00, 0x00, 0x00, 0x00,
1592 0x00, 0x00, 0x00, 0x81};
1593
1594 struct pldm_base_negotiate_transfer_params_resp resp_data = {};
1595
John Chung7a8d9322025-08-27 20:56:19 -05001596 PLDM_MSGBUF_RW_DEFINE_P(buf);
Chau Ly59dce782025-04-01 08:22:07 +00001597 int rc;
1598
1599 static constexpr const size_t payload_length =
1600 PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_RESP_BYTES;
1601 PLDM_MSG_DEFINE_P(responseMsg, payload_length);
1602
1603 rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
1604 ASSERT_EQ(rc, 0);
1605
1606 pldm_msgbuf_insert_uint8(buf, completionCode);
1607 pldm_msgbuf_insert_uint16(buf, responderPartSize);
1608 rc = pldm_msgbuf_insert_array_uint8(
1609 buf, sizeof(resp_data.responder_protocol_support),
1610 responderProtocolSupport.data(),
1611 sizeof(resp_data.responder_protocol_support));
1612 EXPECT_EQ(rc, 0);
1613
1614 ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
1615
1616 rc = decode_pldm_base_negotiate_transfer_params_resp(
1617 responseMsg, payload_length, &resp_data);
1618
1619 ASSERT_EQ(rc, 0);
1620 EXPECT_EQ(resp_data.completion_code, completionCode);
1621 EXPECT_EQ(resp_data.responder_part_size, responderPartSize);
1622 EXPECT_EQ(0, memcmp(responderProtocolSupport.data(),
1623 resp_data.responder_protocol_support,
1624 sizeof(resp_data.responder_protocol_support)));
1625}
1626#endif
1627
1628#ifdef LIBPLDM_API_TESTING
1629TEST(DecodeNegotiateTransferParamsResponse, BadTestUnAllocatedPtrParams)
1630{
1631 uint8_t completionCode = PLDM_SUCCESS;
1632 uint16_t responderPartSize = 128;
1633 std::array<uint8_t, 8> responderProtocolSupport = {0x00, 0x00, 0x00, 0x00,
1634 0x00, 0x00, 0x00, 0x81};
1635
1636 struct pldm_base_negotiate_transfer_params_resp resp_data = {};
1637
John Chung7a8d9322025-08-27 20:56:19 -05001638 PLDM_MSGBUF_RW_DEFINE_P(buf);
Chau Ly59dce782025-04-01 08:22:07 +00001639 int rc;
1640
1641 static constexpr const size_t payload_length =
1642 PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_RESP_BYTES;
1643 PLDM_MSG_DEFINE_P(responseMsg, payload_length);
1644
1645 rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
1646 ASSERT_EQ(rc, 0);
1647
1648 pldm_msgbuf_insert_uint8(buf, completionCode);
1649 pldm_msgbuf_insert_uint16(buf, responderPartSize);
1650 rc = pldm_msgbuf_insert_array_uint8(
1651 buf, sizeof(resp_data.responder_protocol_support),
1652 responderProtocolSupport.data(),
1653 sizeof(resp_data.responder_protocol_support));
1654 EXPECT_EQ(rc, 0);
1655
1656 ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
1657
1658 rc = decode_pldm_base_negotiate_transfer_params_resp(
1659 nullptr, payload_length, &resp_data);
1660
1661 EXPECT_EQ(rc, -EINVAL);
1662
1663 rc = decode_pldm_base_negotiate_transfer_params_resp(
1664 responseMsg, payload_length, nullptr);
1665
1666 EXPECT_EQ(rc, -EINVAL);
1667}
1668#endif
1669
1670#ifdef LIBPLDM_API_TESTING
1671TEST(DecodeNegotiateTransferParamsResponse,
1672 BadTestInvalidExpectedInputMsgLength)
1673{
1674 uint8_t completionCode = PLDM_SUCCESS;
1675 uint16_t responderPartSize = 128;
1676 std::array<uint8_t, 8> responderProtocolSupport = {0x00, 0x00, 0x00, 0x00,
1677 0x00, 0x00, 0x00, 0x81};
1678
1679 struct pldm_base_negotiate_transfer_params_resp resp_data = {};
1680
John Chung7a8d9322025-08-27 20:56:19 -05001681 PLDM_MSGBUF_RW_DEFINE_P(buf);
Chau Ly59dce782025-04-01 08:22:07 +00001682 int rc;
1683
1684 static constexpr const size_t payload_length =
1685 PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_RESP_BYTES;
1686 PLDM_MSG_DEFINE_P(responseMsg, payload_length);
1687
1688 rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
1689 ASSERT_EQ(rc, 0);
1690
1691 pldm_msgbuf_insert_uint8(buf, completionCode);
1692 pldm_msgbuf_insert_uint16(buf, responderPartSize);
1693 rc = pldm_msgbuf_insert_array_uint8(
1694 buf, sizeof(resp_data.responder_protocol_support),
1695 responderProtocolSupport.data(),
1696 sizeof(resp_data.responder_protocol_support));
1697 EXPECT_EQ(rc, 0);
1698
1699 ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
1700
1701 rc = decode_pldm_base_negotiate_transfer_params_resp(responseMsg, 0,
1702 &resp_data);
1703
1704 EXPECT_EQ(rc, -EOVERFLOW);
1705}
Andrew Jefferyedb88262025-08-14 05:02:21 +00001706#endif
Kasun Athukoralacb987c52025-06-19 02:49:24 +00001707
1708#ifdef LIBPLDM_API_TESTING
1709TEST(NegotiateTransferParams, TestDecodeNegotiateTransferParamsReqPass)
1710{
1711 // Prepare a sample request message
1712 uint8_t instance_id = 0x0A;
1713 uint16_t requester_part_size = 1024; // 0x0400
1714 bitfield8_t requester_protocol_support[8];
1715 for (int i = 0; i < 8; ++i)
1716 {
1717 requester_protocol_support[i].byte = static_cast<uint8_t>(i + 1);
1718 }
1719
1720 PLDM_MSG_DEFINE_P(request,
1721 PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES);
1722
1723 // Build the request using the an appropriate API
1724 struct pldm_base_negotiate_transfer_params_req req;
1725 req.requester_part_size = requester_part_size;
1726 memcpy(req.requester_protocol_support, requester_protocol_support,
1727 sizeof(requester_protocol_support));
1728
1729 size_t req_payload_len = PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES;
1730 ASSERT_EQ(encode_pldm_base_negotiate_transfer_params_req(
1731 instance_id, &req, request, &req_payload_len),
1732 0);
1733
1734 struct pldm_base_negotiate_transfer_params_req decoded_req;
1735 size_t payload_len = PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES;
1736
1737 // Successful decode
1738 int rc = decode_pldm_base_negotiate_transfer_params_req(
1739 request, payload_len, &decoded_req);
1740 ASSERT_EQ(rc, 0);
1741 EXPECT_EQ(decoded_req.requester_part_size, requester_part_size);
1742 for (int i = 0; i < 8; ++i)
1743 {
1744 EXPECT_EQ(decoded_req.requester_protocol_support[i].byte,
1745 requester_protocol_support[i].byte);
1746 }
1747}
1748#endif
1749
1750#ifdef LIBPLDM_API_TESTING
1751TEST(NegotiateTransferParams, TestDecodeNegotiateTransferParamsReqFail)
1752{
1753 // Prepare a sample request message
1754 uint8_t instance_id = 0x0A;
1755 uint16_t requester_part_size = 1024; // 0x0400
1756 bitfield8_t requester_protocol_support[8];
1757 for (int i = 0; i < 8; ++i)
1758 {
1759 requester_protocol_support[i].byte = static_cast<uint8_t>(i + 1);
1760 }
1761
1762 PLDM_MSG_DEFINE_P(request,
1763 PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES);
1764
1765 // Build the request using the an appropriate API
1766 struct pldm_base_negotiate_transfer_params_req req;
1767 req.requester_part_size = requester_part_size;
1768 memcpy(req.requester_protocol_support, requester_protocol_support,
1769 sizeof(requester_protocol_support));
1770
1771 size_t req_payload_len = PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES;
1772 ASSERT_EQ(encode_pldm_base_negotiate_transfer_params_req(
1773 instance_id, &req, request, &req_payload_len),
1774 0);
1775
1776 struct pldm_base_negotiate_transfer_params_req decoded_req;
1777 size_t payload_len = PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_REQ_BYTES;
1778 int rc = 0;
1779
1780 // Null arguments
1781 rc = decode_pldm_base_negotiate_transfer_params_req(nullptr, payload_len,
1782 &decoded_req);
1783 EXPECT_EQ(rc, -EINVAL);
1784 rc = decode_pldm_base_negotiate_transfer_params_req(request, payload_len,
1785 nullptr);
1786 EXPECT_EQ(rc, -EINVAL);
1787
1788 // Incorrect payload length - too short
1789 rc = decode_pldm_base_negotiate_transfer_params_req(
1790 request, payload_len - 1, &decoded_req);
1791 EXPECT_EQ(rc, -EOVERFLOW);
1792
1793 // Incorrect payload length - too long
1794 rc = decode_pldm_base_negotiate_transfer_params_req(
1795 request, payload_len + 1, &decoded_req);
1796 EXPECT_EQ(rc, -EBADMSG);
1797}
1798#endif
Kasun Athukoralaae7410c2025-09-12 23:47:37 +00001799
1800#ifdef LIBPLDM_API_TESTING
1801TEST(NegotiateTransferParams, TestEncodeNegotiateTransferParamsRespPass)
1802{
1803 // Prepare encode parameters for a successful response
1804 uint8_t instance_id = 0x0B;
1805 uint8_t completion_code_success = PLDM_SUCCESS;
1806 uint16_t responder_part_size = 2048; // 0x0800
1807 bitfield8_t responder_protocol_support[8];
1808 for (int i = 0; i < 8; ++i)
1809 {
1810 responder_protocol_support[i].byte = static_cast<uint8_t>(0xA0 + i);
1811 }
1812
1813 struct pldm_base_negotiate_transfer_params_resp resp_params_success;
1814 resp_params_success.completion_code = completion_code_success;
1815 resp_params_success.responder_part_size = responder_part_size;
1816 memcpy(resp_params_success.responder_protocol_support,
1817 responder_protocol_support, sizeof(responder_protocol_support));
1818
1819 PLDM_MSG_DEFINE_P(response,
1820 PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_RESP_BYTES);
1821 size_t payload_len = PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_RESP_BYTES;
1822
1823 // Encode success case
1824 int rc = encode_pldm_base_negotiate_transfer_params_resp(
1825 instance_id, &resp_params_success, response, &payload_len);
1826 ASSERT_EQ(rc, 0);
1827 EXPECT_EQ(response->hdr.request, PLDM_RESPONSE);
1828 EXPECT_EQ(response->hdr.instance_id, instance_id);
1829 EXPECT_EQ(response->hdr.type, PLDM_BASE);
1830 EXPECT_EQ(response->hdr.command, PLDM_NEGOTIATE_TRANSFER_PARAMETERS);
1831
1832 // Verify the encoded response using the decode function
1833 struct pldm_base_negotiate_transfer_params_resp decoded_resp;
1834 payload_len = PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_RESP_BYTES;
1835 rc = decode_pldm_base_negotiate_transfer_params_resp(response, payload_len,
1836 &decoded_resp);
1837 ASSERT_EQ(rc, 0);
1838 EXPECT_EQ(decoded_resp.completion_code, completion_code_success);
1839 EXPECT_EQ(decoded_resp.responder_part_size, responder_part_size);
1840 for (int i = 0; i < 8; ++i)
1841 {
1842 EXPECT_EQ(decoded_resp.responder_protocol_support[i].byte,
1843 responder_protocol_support[i].byte);
1844 }
1845}
1846
1847TEST(NegotiateTransferParams, TestEncodeNegotiateTransferParamsRespFail)
1848{
1849 // Prepare encode parameters
1850 uint8_t instance_id = 0x0B;
1851 uint8_t completion_code_success = PLDM_SUCCESS;
1852 uint16_t responder_part_size = 2048; // 0x0800
1853 bitfield8_t responder_protocol_support[8];
1854 for (int i = 0; i < 8; ++i)
1855 {
1856 responder_protocol_support[i].byte = static_cast<uint8_t>(0xA0 + i);
1857 }
1858
1859 struct pldm_base_negotiate_transfer_params_resp resp_params_success;
1860 resp_params_success.completion_code = completion_code_success;
1861 resp_params_success.responder_part_size = responder_part_size;
1862 memcpy(resp_params_success.responder_protocol_support,
1863 responder_protocol_support, sizeof(responder_protocol_support));
1864
1865 PLDM_MSG_DEFINE_P(response,
1866 PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_RESP_BYTES);
1867 size_t payload_len = PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_RESP_BYTES;
1868 int rc = 0;
1869
1870 // Null arguments
1871 rc = encode_pldm_base_negotiate_transfer_params_resp(
1872 instance_id, nullptr, response, &payload_len);
1873 EXPECT_EQ(rc, -EINVAL);
1874
1875 payload_len = PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_RESP_BYTES;
1876 rc = encode_pldm_base_negotiate_transfer_params_resp(
1877 instance_id, &resp_params_success, nullptr, &payload_len);
1878 EXPECT_EQ(rc, -EINVAL);
1879
1880 // Incorrect payload length
1881 payload_len = PLDM_BASE_NEGOTIATE_TRANSFER_PARAMETERS_RESP_BYTES - 1;
1882 rc = encode_pldm_base_negotiate_transfer_params_resp(
1883 instance_id, &resp_params_success, response, &payload_len);
1884 EXPECT_EQ(rc, -EOVERFLOW);
1885}
1886#endif