blob: b8b25d3d87777c45d47c39e71c7df7fb157840a6 [file] [log] [blame]
Deepak Kodihalli1b24f972019-02-01 04:09:13 -06001#include <string.h>
2
3#include <array>
John Wang7f02d702019-12-03 13:38:14 +08004#include <cstring>
5#include <vector>
Deepak Kodihalli1b24f972019-02-01 04:09:13 -06006
7#include "libpldm/base.h"
8
John Wang7f02d702019-12-03 13:38:14 +08009#include <gmock/gmock.h>
Deepak Kodihalli1b24f972019-02-01 04:09:13 -060010#include <gtest/gtest.h>
11
John Wang7f02d702019-12-03 13:38:14 +080012using testing::ElementsAreArray;
13
Zahed Hossain223a73d2019-07-04 12:46:18 -050014constexpr auto hdrSize = sizeof(pldm_msg_hdr);
15
Tom Joseph41251042019-02-07 16:17:07 +053016TEST(PackPLDMMessage, BadPathTest)
17{
18 struct pldm_header_info hdr;
19 struct pldm_header_info* hdr_ptr = NULL;
20 pldm_msg_hdr msg{};
21
22 // PLDM header information pointer is NULL
23 auto rc = pack_pldm_header(hdr_ptr, &msg);
George Liu684a7162019-12-06 15:10:52 +080024 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Tom Joseph41251042019-02-07 16:17:07 +053025
26 // PLDM message pointer is NULL
27 rc = pack_pldm_header(&hdr, nullptr);
George Liu684a7162019-12-06 15:10:52 +080028 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Tom Joseph41251042019-02-07 16:17:07 +053029
30 // PLDM header information pointer and PLDM message pointer is NULL
31 rc = pack_pldm_header(hdr_ptr, nullptr);
George Liu684a7162019-12-06 15:10:52 +080032 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Tom Joseph41251042019-02-07 16:17:07 +053033
34 // RESERVED message type
35 hdr.msg_type = PLDM_RESERVED;
36 rc = pack_pldm_header(&hdr, &msg);
George Liu684a7162019-12-06 15:10:52 +080037 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Tom Joseph41251042019-02-07 16:17:07 +053038
39 // Instance ID out of range
40 hdr.msg_type = PLDM_REQUEST;
41 hdr.instance = 32;
42 rc = pack_pldm_header(&hdr, &msg);
George Liu684a7162019-12-06 15:10:52 +080043 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Tom Joseph41251042019-02-07 16:17:07 +053044
45 // PLDM type out of range
46 hdr.msg_type = PLDM_REQUEST;
47 hdr.instance = 31;
48 hdr.pldm_type = 64;
49 rc = pack_pldm_header(&hdr, &msg);
George Liu684a7162019-12-06 15:10:52 +080050 EXPECT_EQ(rc, PLDM_ERROR_INVALID_PLDM_TYPE);
Tom Joseph41251042019-02-07 16:17:07 +053051}
52
53TEST(PackPLDMMessage, RequestMessageGoodPath)
54{
55 struct pldm_header_info hdr;
56 pldm_msg_hdr msg{};
57
58 // Message type is REQUEST and lower range of the field values
59 hdr.msg_type = PLDM_REQUEST;
60 hdr.instance = 0;
61 hdr.pldm_type = 0;
62 hdr.command = 0;
63
64 auto rc = pack_pldm_header(&hdr, &msg);
George Liu684a7162019-12-06 15:10:52 +080065 EXPECT_EQ(rc, PLDM_SUCCESS);
66 EXPECT_EQ(msg.request, 1);
67 EXPECT_EQ(msg.datagram, 0);
68 EXPECT_EQ(msg.instance_id, 0);
69 EXPECT_EQ(msg.type, 0);
70 EXPECT_EQ(msg.command, 0);
Tom Joseph41251042019-02-07 16:17:07 +053071
72 // Message type is REQUEST and upper range of the field values
73 hdr.instance = 31;
74 hdr.pldm_type = 63;
75 hdr.command = 255;
76
77 rc = pack_pldm_header(&hdr, &msg);
George Liu684a7162019-12-06 15:10:52 +080078 EXPECT_EQ(rc, PLDM_SUCCESS);
79 EXPECT_EQ(msg.request, 1);
80 EXPECT_EQ(msg.datagram, 0);
81 EXPECT_EQ(msg.instance_id, 31);
82 EXPECT_EQ(msg.type, 63);
83 EXPECT_EQ(msg.command, 255);
Tom Joseph41251042019-02-07 16:17:07 +053084
85 // Message type is PLDM_ASYNC_REQUEST_NOTIFY
86 hdr.msg_type = PLDM_ASYNC_REQUEST_NOTIFY;
87
88 rc = pack_pldm_header(&hdr, &msg);
George Liu684a7162019-12-06 15:10:52 +080089 EXPECT_EQ(rc, PLDM_SUCCESS);
90 EXPECT_EQ(msg.request, 1);
91 EXPECT_EQ(msg.datagram, 1);
92 EXPECT_EQ(msg.instance_id, 31);
93 EXPECT_EQ(msg.type, 63);
94 EXPECT_EQ(msg.command, 255);
Tom Joseph41251042019-02-07 16:17:07 +053095}
96
97TEST(PackPLDMMessage, ResponseMessageGoodPath)
98{
99 struct pldm_header_info hdr;
100 pldm_msg_hdr msg{};
101
102 // Message type is PLDM_RESPONSE and lower range of the field values
103 hdr.msg_type = PLDM_RESPONSE;
104 hdr.instance = 0;
105 hdr.pldm_type = 0;
106 hdr.command = 0;
107
108 auto rc = pack_pldm_header(&hdr, &msg);
George Liu684a7162019-12-06 15:10:52 +0800109 EXPECT_EQ(rc, PLDM_SUCCESS);
110 EXPECT_EQ(msg.request, 0);
111 EXPECT_EQ(msg.datagram, 0);
112 EXPECT_EQ(msg.instance_id, 0);
113 EXPECT_EQ(msg.type, 0);
114 EXPECT_EQ(msg.command, 0);
Tom Joseph41251042019-02-07 16:17:07 +0530115
116 // Message type is PLDM_RESPONSE and upper range of the field values
117 hdr.instance = 31;
118 hdr.pldm_type = 63;
119 hdr.command = 255;
120
121 rc = pack_pldm_header(&hdr, &msg);
George Liu684a7162019-12-06 15:10:52 +0800122 EXPECT_EQ(rc, PLDM_SUCCESS);
123 EXPECT_EQ(msg.request, 0);
124 EXPECT_EQ(msg.datagram, 0);
125 EXPECT_EQ(msg.instance_id, 31);
126 EXPECT_EQ(msg.type, 63);
127 EXPECT_EQ(msg.command, 255);
Tom Joseph41251042019-02-07 16:17:07 +0530128}
129
130TEST(UnpackPLDMMessage, BadPathTest)
131{
132 struct pldm_header_info hdr;
133
134 // PLDM message pointer is NULL
135 auto rc = unpack_pldm_header(nullptr, &hdr);
George Liu684a7162019-12-06 15:10:52 +0800136 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Tom Joseph41251042019-02-07 16:17:07 +0530137}
138
139TEST(UnpackPLDMMessage, RequestMessageGoodPath)
140{
141 struct pldm_header_info hdr;
142 pldm_msg_hdr msg{};
143
144 // Unpack PLDM request message and lower range of field values
145 msg.request = 1;
146 auto rc = unpack_pldm_header(&msg, &hdr);
George Liu684a7162019-12-06 15:10:52 +0800147 EXPECT_EQ(rc, PLDM_SUCCESS);
148 EXPECT_EQ(hdr.msg_type, PLDM_REQUEST);
149 EXPECT_EQ(hdr.instance, 0);
150 EXPECT_EQ(hdr.pldm_type, 0);
151 EXPECT_EQ(hdr.command, 0);
Tom Joseph41251042019-02-07 16:17:07 +0530152
153 // Unpack PLDM async request message and lower range of field values
154 msg.datagram = 1;
155 rc = unpack_pldm_header(&msg, &hdr);
George Liu684a7162019-12-06 15:10:52 +0800156 EXPECT_EQ(rc, PLDM_SUCCESS);
157 EXPECT_EQ(hdr.msg_type, PLDM_ASYNC_REQUEST_NOTIFY);
Tom Joseph41251042019-02-07 16:17:07 +0530158
159 // Unpack PLDM request message and upper range of field values
160 msg.datagram = 0;
161 msg.instance_id = 31;
162 msg.type = 63;
163 msg.command = 255;
164 rc = unpack_pldm_header(&msg, &hdr);
George Liu684a7162019-12-06 15:10:52 +0800165 EXPECT_EQ(rc, PLDM_SUCCESS);
166 EXPECT_EQ(hdr.msg_type, PLDM_REQUEST);
167 EXPECT_EQ(hdr.instance, 31);
168 EXPECT_EQ(hdr.pldm_type, 63);
169 EXPECT_EQ(hdr.command, 255);
Tom Joseph41251042019-02-07 16:17:07 +0530170}
171
172TEST(UnpackPLDMMessage, ResponseMessageGoodPath)
173{
174 struct pldm_header_info hdr;
175 pldm_msg_hdr msg{};
176
177 // Unpack PLDM response message and lower range of field values
178 auto rc = unpack_pldm_header(&msg, &hdr);
George Liu684a7162019-12-06 15:10:52 +0800179 EXPECT_EQ(rc, PLDM_SUCCESS);
180 EXPECT_EQ(hdr.msg_type, PLDM_RESPONSE);
181 EXPECT_EQ(hdr.instance, 0);
182 EXPECT_EQ(hdr.pldm_type, 0);
183 EXPECT_EQ(hdr.command, 0);
Tom Joseph41251042019-02-07 16:17:07 +0530184
185 // Unpack PLDM response message and upper range of field values
186 msg.instance_id = 31;
187 msg.type = 63;
188 msg.command = 255;
189 rc = unpack_pldm_header(&msg, &hdr);
George Liu684a7162019-12-06 15:10:52 +0800190 EXPECT_EQ(rc, PLDM_SUCCESS);
191 EXPECT_EQ(hdr.msg_type, PLDM_RESPONSE);
192 EXPECT_EQ(hdr.instance, 31);
193 EXPECT_EQ(hdr.pldm_type, 63);
194 EXPECT_EQ(hdr.command, 255);
Tom Joseph41251042019-02-07 16:17:07 +0530195}
196
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600197TEST(GetPLDMCommands, testEncodeRequest)
198{
199 uint8_t pldmType = 0x05;
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600200 ver32_t version{0xFF, 0xFF, 0xFF, 0xFF};
vkaverapa6575b82019-04-03 05:33:52 -0500201 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_COMMANDS_REQ_BYTES>
202 requestMsg{};
203 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600204
vkaverapa6575b82019-04-03 05:33:52 -0500205 auto rc = encode_get_commands_req(0, pldmType, version, request);
George Liu684a7162019-12-06 15:10:52 +0800206 EXPECT_EQ(rc, PLDM_SUCCESS);
207 EXPECT_EQ(0, memcmp(request->payload, &pldmType, sizeof(pldmType)));
208 EXPECT_EQ(0, memcmp(request->payload + sizeof(pldmType), &version,
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600209 sizeof(version)));
210}
211
212TEST(GetPLDMCommands, testDecodeRequest)
213{
214 uint8_t pldmType = 0x05;
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600215 ver32_t version{0xFF, 0xFF, 0xFF, 0xFF};
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600216 uint8_t pldmTypeOut{};
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600217 ver32_t versionOut{0xFF, 0xFF, 0xFF, 0xFF};
Zahed Hossain223a73d2019-07-04 12:46:18 -0500218 std::array<uint8_t, hdrSize + PLDM_GET_COMMANDS_REQ_BYTES> requestMsg{};
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600219
Zahed Hossain223a73d2019-07-04 12:46:18 -0500220 memcpy(requestMsg.data() + hdrSize, &pldmType, sizeof(pldmType));
221 memcpy(requestMsg.data() + sizeof(pldmType) + hdrSize, &version,
222 sizeof(version));
223
224 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
225 auto rc = decode_get_commands_req(request, requestMsg.size() - hdrSize,
vkaverapa6575b82019-04-03 05:33:52 -0500226 &pldmTypeOut, &versionOut);
Zahed Hossain223a73d2019-07-04 12:46:18 -0500227
George Liu684a7162019-12-06 15:10:52 +0800228 EXPECT_EQ(rc, PLDM_SUCCESS);
229 EXPECT_EQ(pldmTypeOut, pldmType);
230 EXPECT_EQ(0, memcmp(&versionOut, &version, sizeof(version)));
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600231}
232
233TEST(GetPLDMCommands, testEncodeResponse)
234{
235 uint8_t completionCode = 0;
vkaverapa6575b82019-04-03 05:33:52 -0500236 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_COMMANDS_RESP_BYTES>
237 responseMsg{};
238 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600239 std::array<bitfield8_t, PLDM_MAX_CMDS_PER_TYPE / 8> commands{};
240 commands[0].byte = 1;
241 commands[1].byte = 2;
242 commands[2].byte = 3;
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600243
244 auto rc =
vkaverapa6575b82019-04-03 05:33:52 -0500245 encode_get_commands_resp(0, PLDM_SUCCESS, commands.data(), response);
George Liu684a7162019-12-06 15:10:52 +0800246 EXPECT_EQ(rc, PLDM_SUCCESS);
vkaverapa6575b82019-04-03 05:33:52 -0500247 uint8_t* payload_ptr = response->payload;
George Liu684a7162019-12-06 15:10:52 +0800248 EXPECT_EQ(completionCode, payload_ptr[0]);
249 EXPECT_EQ(1, payload_ptr[sizeof(completionCode)]);
250 EXPECT_EQ(2,
vkaverapa6575b82019-04-03 05:33:52 -0500251 payload_ptr[sizeof(completionCode) + sizeof(commands[0].byte)]);
George Liu684a7162019-12-06 15:10:52 +0800252 EXPECT_EQ(3, payload_ptr[sizeof(completionCode) + sizeof(commands[0].byte) +
vkaverapa6575b82019-04-03 05:33:52 -0500253 sizeof(commands[1].byte)]);
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600254}
255
256TEST(GetPLDMTypes, testEncodeResponse)
257{
258 uint8_t completionCode = 0;
vkaverapa6575b82019-04-03 05:33:52 -0500259 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_TYPES_RESP_BYTES>
260 responseMsg{};
261 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600262 std::array<bitfield8_t, PLDM_MAX_TYPES / 8> types{};
263 types[0].byte = 1;
264 types[1].byte = 2;
265 types[2].byte = 3;
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600266
vkaverapa6575b82019-04-03 05:33:52 -0500267 auto rc = encode_get_types_resp(0, PLDM_SUCCESS, types.data(), response);
George Liu684a7162019-12-06 15:10:52 +0800268 EXPECT_EQ(rc, PLDM_SUCCESS);
vkaverapa6575b82019-04-03 05:33:52 -0500269 uint8_t* payload_ptr = response->payload;
George Liu684a7162019-12-06 15:10:52 +0800270 EXPECT_EQ(completionCode, payload_ptr[0]);
271 EXPECT_EQ(1, payload_ptr[sizeof(completionCode)]);
272 EXPECT_EQ(2, payload_ptr[sizeof(completionCode) + sizeof(types[0].byte)]);
273 EXPECT_EQ(3, payload_ptr[sizeof(completionCode) + sizeof(types[0].byte) +
vkaverapa6575b82019-04-03 05:33:52 -0500274 sizeof(types[1].byte)]);
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600275}
276
George Liu684a7162019-12-06 15:10:52 +0800277TEST(GetPLDMTypes, testGoodDecodeResponse)
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600278{
Zahed Hossain223a73d2019-07-04 12:46:18 -0500279 std::array<uint8_t, hdrSize + PLDM_GET_TYPES_RESP_BYTES> responseMsg{};
280 responseMsg[1 + hdrSize] = 1;
281 responseMsg[2 + hdrSize] = 2;
282 responseMsg[3 + hdrSize] = 3;
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600283 std::array<bitfield8_t, PLDM_MAX_TYPES / 8> outTypes{};
George Liu684a7162019-12-06 15:10:52 +0800284
Deepak Kodihalli8c643462019-02-21 10:43:36 -0600285 uint8_t completion_code;
George Liu684a7162019-12-06 15:10:52 +0800286 responseMsg[hdrSize] = PLDM_SUCCESS;
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600287
Zahed Hossain223a73d2019-07-04 12:46:18 -0500288 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
289
290 auto rc = decode_get_types_resp(response, responseMsg.size() - hdrSize,
vkaverapa6575b82019-04-03 05:33:52 -0500291 &completion_code, outTypes.data());
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600292
George Liu684a7162019-12-06 15:10:52 +0800293 EXPECT_EQ(rc, PLDM_SUCCESS);
294 EXPECT_EQ(completion_code, PLDM_SUCCESS);
295 EXPECT_EQ(responseMsg[1 + hdrSize], outTypes[0].byte);
296 EXPECT_EQ(responseMsg[2 + hdrSize], outTypes[1].byte);
297 EXPECT_EQ(responseMsg[3 + hdrSize], outTypes[2].byte);
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600298}
299
George Liu684a7162019-12-06 15:10:52 +0800300TEST(GetPLDMTypes, testBadDecodeResponse)
301{
302 std::array<uint8_t, hdrSize + PLDM_GET_TYPES_RESP_BYTES> responseMsg{};
303 responseMsg[1 + hdrSize] = 1;
304 responseMsg[2 + hdrSize] = 2;
305 responseMsg[3 + hdrSize] = 3;
306 std::array<bitfield8_t, PLDM_MAX_TYPES / 8> outTypes{};
307
308 uint8_t retcompletion_code = 0;
309 responseMsg[hdrSize] = PLDM_SUCCESS;
310
311 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
312
313 auto rc = decode_get_types_resp(response, responseMsg.size() - hdrSize - 1,
314 &retcompletion_code, outTypes.data());
315
316 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
317}
318
319TEST(GetPLDMCommands, testGoodDecodeResponse)
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600320{
Zahed Hossain223a73d2019-07-04 12:46:18 -0500321 std::array<uint8_t, hdrSize + PLDM_GET_COMMANDS_RESP_BYTES> responseMsg{};
322 responseMsg[1 + hdrSize] = 1;
323 responseMsg[2 + hdrSize] = 2;
324 responseMsg[3 + hdrSize] = 3;
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600325 std::array<bitfield8_t, PLDM_MAX_CMDS_PER_TYPE / 8> outTypes{};
George Liu684a7162019-12-06 15:10:52 +0800326
Deepak Kodihalli8c643462019-02-21 10:43:36 -0600327 uint8_t completion_code;
George Liu684a7162019-12-06 15:10:52 +0800328 responseMsg[hdrSize] = PLDM_SUCCESS;
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600329
Zahed Hossain223a73d2019-07-04 12:46:18 -0500330 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
331
332 auto rc = decode_get_commands_resp(response, responseMsg.size() - hdrSize,
vkaverapa6575b82019-04-03 05:33:52 -0500333 &completion_code, outTypes.data());
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600334
George Liu684a7162019-12-06 15:10:52 +0800335 EXPECT_EQ(rc, PLDM_SUCCESS);
336 EXPECT_EQ(completion_code, PLDM_SUCCESS);
337 EXPECT_EQ(responseMsg[1 + hdrSize], outTypes[0].byte);
338 EXPECT_EQ(responseMsg[2 + hdrSize], outTypes[1].byte);
339 EXPECT_EQ(responseMsg[3 + hdrSize], outTypes[2].byte);
340}
341
342TEST(GetPLDMCommands, testBadDecodeResponse)
343{
344 std::array<uint8_t, hdrSize + PLDM_GET_COMMANDS_RESP_BYTES> responseMsg{};
345 responseMsg[1 + hdrSize] = 1;
346 responseMsg[2 + hdrSize] = 2;
347 responseMsg[3 + hdrSize] = 3;
348 std::array<bitfield8_t, PLDM_MAX_CMDS_PER_TYPE / 8> outTypes{};
349
350 uint8_t retcompletion_code = 0;
351 responseMsg[hdrSize] = PLDM_SUCCESS;
352
353 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
354
355 auto rc =
356 decode_get_commands_resp(response, responseMsg.size() - hdrSize - 1,
357 &retcompletion_code, outTypes.data());
358
359 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
Deepak Kodihalli1b24f972019-02-01 04:09:13 -0600360}
Sampa Misra432e1872019-02-13 03:49:43 -0600361
Sampa Misra94d704b2019-02-22 03:36:02 -0600362TEST(GetPLDMVersion, testGoodEncodeRequest)
Sampa Misra432e1872019-02-13 03:49:43 -0600363{
vkaverapa6575b82019-04-03 05:33:52 -0500364 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_VERSION_REQ_BYTES>
365 requestMsg{};
366 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
Sampa Misra432e1872019-02-13 03:49:43 -0600367 uint8_t pldmType = 0x03;
368 uint32_t transferHandle = 0x0;
369 uint8_t opFlag = 0x01;
370
371 auto rc =
vkaverapa6575b82019-04-03 05:33:52 -0500372 encode_get_version_req(0, transferHandle, opFlag, pldmType, request);
George Liu684a7162019-12-06 15:10:52 +0800373 EXPECT_EQ(rc, PLDM_SUCCESS);
374 EXPECT_EQ(
vkaverapa6575b82019-04-03 05:33:52 -0500375 0, memcmp(request->payload, &transferHandle, sizeof(transferHandle)));
George Liu684a7162019-12-06 15:10:52 +0800376 EXPECT_EQ(0, memcmp(request->payload + sizeof(transferHandle), &opFlag,
Sampa Misra432e1872019-02-13 03:49:43 -0600377 sizeof(opFlag)));
George Liu684a7162019-12-06 15:10:52 +0800378 EXPECT_EQ(0,
vkaverapa6575b82019-04-03 05:33:52 -0500379 memcmp(request->payload + sizeof(transferHandle) + sizeof(opFlag),
380 &pldmType, sizeof(pldmType)));
Sampa Misra432e1872019-02-13 03:49:43 -0600381}
382
Sampa Misra94d704b2019-02-22 03:36:02 -0600383TEST(GetPLDMVersion, testBadEncodeRequest)
384{
385 uint8_t pldmType = 0x03;
386 uint32_t transferHandle = 0x0;
387 uint8_t opFlag = 0x01;
388
389 auto rc =
390 encode_get_version_req(0, transferHandle, opFlag, pldmType, nullptr);
391
George Liu684a7162019-12-06 15:10:52 +0800392 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Sampa Misra94d704b2019-02-22 03:36:02 -0600393}
394
Sampa Misra432e1872019-02-13 03:49:43 -0600395TEST(GetPLDMVersion, testEncodeResponse)
396{
Sampa Misra432e1872019-02-13 03:49:43 -0600397 uint8_t completionCode = 0;
398 uint32_t transferHandle = 0;
399 uint8_t flag = PLDM_START_AND_END;
vkaverapa6575b82019-04-03 05:33:52 -0500400 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_VERSION_RESP_BYTES>
401 responseMsg{};
402 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600403 ver32_t version = {0xFF, 0xFF, 0xFF, 0xFF};
Sampa Misra432e1872019-02-13 03:49:43 -0600404
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600405 auto rc = encode_get_version_resp(0, PLDM_SUCCESS, 0, PLDM_START_AND_END,
vkaverapa6575b82019-04-03 05:33:52 -0500406 &version, sizeof(ver32_t), response);
Sampa Misra432e1872019-02-13 03:49:43 -0600407
George Liu684a7162019-12-06 15:10:52 +0800408 EXPECT_EQ(rc, PLDM_SUCCESS);
409 EXPECT_EQ(completionCode, response->payload[0]);
410 EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]),
vkaverapa6575b82019-04-03 05:33:52 -0500411 &transferHandle, sizeof(transferHandle)));
George Liu684a7162019-12-06 15:10:52 +0800412 EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
vkaverapa6575b82019-04-03 05:33:52 -0500413 sizeof(transferHandle),
414 &flag, sizeof(flag)));
George Liu684a7162019-12-06 15:10:52 +0800415 EXPECT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
vkaverapa6575b82019-04-03 05:33:52 -0500416 sizeof(transferHandle) + sizeof(flag),
417 &version, sizeof(version)));
Sampa Misra432e1872019-02-13 03:49:43 -0600418}
419
420TEST(GetPLDMVersion, testDecodeRequest)
421{
Zahed Hossain223a73d2019-07-04 12:46:18 -0500422 std::array<uint8_t, hdrSize + PLDM_GET_VERSION_REQ_BYTES> requestMsg{};
Sampa Misra432e1872019-02-13 03:49:43 -0600423 uint32_t transferHandle = 0x0;
424 uint32_t retTransferHandle = 0x0;
425 uint8_t flag = PLDM_GET_FIRSTPART;
426 uint8_t retFlag = PLDM_GET_FIRSTPART;
427 uint8_t pldmType = PLDM_BASE;
428 uint8_t retType = PLDM_BASE;
429
Zahed Hossain223a73d2019-07-04 12:46:18 -0500430 memcpy(requestMsg.data() + hdrSize, &transferHandle,
431 sizeof(transferHandle));
432 memcpy(requestMsg.data() + sizeof(transferHandle) + hdrSize, &flag,
433 sizeof(flag));
434 memcpy(requestMsg.data() + sizeof(transferHandle) + sizeof(flag) + hdrSize,
435 &pldmType, sizeof(pldmType));
Sampa Misra432e1872019-02-13 03:49:43 -0600436
Zahed Hossain223a73d2019-07-04 12:46:18 -0500437 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
438
439 auto rc = decode_get_version_req(request, requestMsg.size() - hdrSize,
vkaverapa6575b82019-04-03 05:33:52 -0500440 &retTransferHandle, &retFlag, &retType);
Sampa Misra432e1872019-02-13 03:49:43 -0600441
George Liu684a7162019-12-06 15:10:52 +0800442 EXPECT_EQ(rc, PLDM_SUCCESS);
443 EXPECT_EQ(transferHandle, retTransferHandle);
444 EXPECT_EQ(flag, retFlag);
445 EXPECT_EQ(pldmType, retType);
Sampa Misra432e1872019-02-13 03:49:43 -0600446}
447
448TEST(GetPLDMVersion, testDecodeResponse)
449{
Zahed Hossain223a73d2019-07-04 12:46:18 -0500450 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_VERSION_RESP_BYTES>
451 responseMsg{};
Sampa Misra432e1872019-02-13 03:49:43 -0600452 uint32_t transferHandle = 0x0;
453 uint32_t retTransferHandle = 0x0;
454 uint8_t flag = PLDM_START_AND_END;
455 uint8_t retFlag = PLDM_START_AND_END;
456 uint8_t completionCode = 0;
Deepak Kodihalli97e0bd52019-02-21 03:54:22 -0600457 ver32_t version = {0xFF, 0xFF, 0xFF, 0xFF};
458 ver32_t versionOut;
Deepak Kodihalli8c643462019-02-21 10:43:36 -0600459 uint8_t completion_code;
Sampa Misra432e1872019-02-13 03:49:43 -0600460
Zahed Hossain223a73d2019-07-04 12:46:18 -0500461 memcpy(responseMsg.data() + sizeof(completionCode) + hdrSize,
462 &transferHandle, sizeof(transferHandle));
463 memcpy(responseMsg.data() + sizeof(completionCode) +
464 sizeof(transferHandle) + hdrSize,
Sampa Misra432e1872019-02-13 03:49:43 -0600465 &flag, sizeof(flag));
vkaverapa6575b82019-04-03 05:33:52 -0500466 memcpy(responseMsg.data() + sizeof(completionCode) +
Zahed Hossain223a73d2019-07-04 12:46:18 -0500467 sizeof(transferHandle) + sizeof(flag) + hdrSize,
Sampa Misra432e1872019-02-13 03:49:43 -0600468 &version, sizeof(version));
469
Zahed Hossain223a73d2019-07-04 12:46:18 -0500470 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
471
472 auto rc = decode_get_version_resp(response, responseMsg.size() - hdrSize,
vkaverapa6575b82019-04-03 05:33:52 -0500473 &completion_code, &retTransferHandle,
474 &retFlag, &versionOut);
George Liu684a7162019-12-06 15:10:52 +0800475 EXPECT_EQ(rc, PLDM_SUCCESS);
476 EXPECT_EQ(transferHandle, retTransferHandle);
477 EXPECT_EQ(flag, retFlag);
Sampa Misra432e1872019-02-13 03:49:43 -0600478
George Liu684a7162019-12-06 15:10:52 +0800479 EXPECT_EQ(versionOut.major, version.major);
480 EXPECT_EQ(versionOut.minor, version.minor);
481 EXPECT_EQ(versionOut.update, version.update);
482 EXPECT_EQ(versionOut.alpha, version.alpha);
Sampa Misra432e1872019-02-13 03:49:43 -0600483}
John Wang5c4f80d2019-07-29 11:12:18 +0800484
Sridevi Rameshbc6ff262019-12-12 04:58:35 -0600485TEST(GetTID, testEncodeRequest)
486{
487 pldm_msg request{};
488
489 auto rc = encode_get_tid_req(0, &request);
490 ASSERT_EQ(rc, PLDM_SUCCESS);
491}
492
John Wang5c4f80d2019-07-29 11:12:18 +0800493TEST(GetTID, testEncodeResponse)
494{
495 uint8_t completionCode = 0;
496 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_TID_RESP_BYTES>
497 responseMsg{};
498 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
499 uint8_t tid = 1;
500
501 auto rc = encode_get_tid_resp(0, PLDM_SUCCESS, tid, response);
George Liu684a7162019-12-06 15:10:52 +0800502 EXPECT_EQ(rc, PLDM_SUCCESS);
John Wang5c4f80d2019-07-29 11:12:18 +0800503 uint8_t* payload = response->payload;
George Liu684a7162019-12-06 15:10:52 +0800504 EXPECT_EQ(completionCode, payload[0]);
505 EXPECT_EQ(1, payload[sizeof(completionCode)]);
John Wang5c4f80d2019-07-29 11:12:18 +0800506}
507
508TEST(GetTID, testDecodeResponse)
509{
510 std::array<uint8_t, hdrSize + PLDM_GET_TID_RESP_BYTES> responseMsg{};
511 responseMsg[1 + hdrSize] = 1;
512
513 uint8_t tid;
514 uint8_t completion_code;
George Liu684a7162019-12-06 15:10:52 +0800515 responseMsg[hdrSize] = PLDM_SUCCESS;
John Wang5c4f80d2019-07-29 11:12:18 +0800516
517 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
518
519 auto rc = decode_get_tid_resp(response, responseMsg.size() - hdrSize,
520 &completion_code, &tid);
521
George Liu684a7162019-12-06 15:10:52 +0800522 EXPECT_EQ(rc, PLDM_SUCCESS);
523 EXPECT_EQ(completion_code, PLDM_SUCCESS);
524 EXPECT_EQ(tid, 1);
John Wang5c4f80d2019-07-29 11:12:18 +0800525}
John Wang7f02d702019-12-03 13:38:14 +0800526
527TEST(CcOnlyResponse, testEncode)
528{
529 struct pldm_msg responseMsg;
530
531 auto rc =
532 encode_cc_only_resp(0 /*instance id*/, 1 /*pldm type*/, 2 /*command*/,
533 3 /*complection code*/, &responseMsg);
534 EXPECT_EQ(rc, PLDM_SUCCESS);
535
536 auto p = reinterpret_cast<uint8_t*>(&responseMsg);
537 EXPECT_THAT(std::vector<uint8_t>(p, p + sizeof(responseMsg)),
538 ElementsAreArray({0, 1, 2, 3}));
539
540 rc = encode_cc_only_resp(PLDM_INSTANCE_MAX + 1, 1, 2, 3, &responseMsg);
541 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
542
543 rc = encode_cc_only_resp(0, 1, 2, 3, nullptr);
544 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
545}