blob: 085d10591fccb0d2e9120cd58aa31370c4811214 [file] [log] [blame]
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +05301#include <string.h>
2
3#include <array>
4
5#include "libpldm/base.h"
6#include "libpldm/file_io.h"
7
8#include <gtest/gtest.h>
9
10TEST(ReadWriteFileMemory, testGoodDecodeRequest)
11{
12 std::array<uint8_t, PLDM_RW_FILE_MEM_REQ_BYTES> requestMsg{};
13
14 // Random value for fileHandle, offset, length, address
15 uint32_t fileHandle = 0x12345678;
16 uint32_t offset = 0x87654321;
17 uint32_t length = 0x13245768;
18 uint64_t address = 0x124356879ACBDE0F;
19
20 memcpy(requestMsg.data(), &fileHandle, sizeof(fileHandle));
21 memcpy(requestMsg.data() + sizeof(fileHandle), &offset, sizeof(offset));
22 memcpy(requestMsg.data() + sizeof(fileHandle) + sizeof(offset), &length,
23 sizeof(length));
24 memcpy(requestMsg.data() + sizeof(fileHandle) + sizeof(offset) +
25 sizeof(length),
26 &address, sizeof(address));
27
28 uint32_t retFileHandle = 0;
29 uint32_t retOffset = 0;
30 uint32_t retLength = 0;
31 uint64_t retAddress = 0;
32
33 // Invoke decode the read file memory request
34 auto rc = decode_rw_file_memory_req(requestMsg.data(), requestMsg.size(),
35 &retFileHandle, &retOffset, &retLength,
36 &retAddress);
37
38 ASSERT_EQ(rc, PLDM_SUCCESS);
39 ASSERT_EQ(fileHandle, retFileHandle);
40 ASSERT_EQ(offset, retOffset);
41 ASSERT_EQ(length, retLength);
42 ASSERT_EQ(address, retAddress);
43}
44
45TEST(ReadWriteFileMemory, testBadDecodeRequest)
46{
47 uint32_t fileHandle = 0;
48 uint32_t offset = 0;
49 uint32_t length = 0;
50 uint64_t address = 0;
51
52 // Request payload message is missing
53 auto rc = decode_rw_file_memory_req(NULL, 0, &fileHandle, &offset, &length,
54 &address);
55 ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
56
57 std::array<uint8_t, PLDM_RW_FILE_MEM_REQ_BYTES> requestMsg{};
58
59 // Address is NULL
60 rc = decode_rw_file_memory_req(requestMsg.data(), requestMsg.size(),
61 &fileHandle, &offset, &length, NULL);
62 ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
63
64 // Payload length is invalid
65 rc = decode_rw_file_memory_req(requestMsg.data(), 0, &fileHandle, &offset,
66 &length, &address);
67 ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
68}
69
70TEST(ReadWriteFileMemory, testGoodEncodeResponse)
71{
72 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_RESP_BYTES>
73 responseMsg{};
74 uint32_t length = 0xFF00EE11;
75 pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
76
77 // ReadFileIntoMemory
78 auto rc = encode_rw_file_memory_resp(0, PLDM_READ_FILE_INTO_MEMORY,
79 PLDM_SUCCESS, length, response);
80
81 ASSERT_EQ(rc, PLDM_SUCCESS);
82 ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
83 ASSERT_EQ(response->hdr.instance_id, 0);
Jinu Joy Thomasf666db12019-05-29 05:22:31 -050084 ASSERT_EQ(response->hdr.type, PLDM_OEM);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +053085 ASSERT_EQ(response->hdr.command, PLDM_READ_FILE_INTO_MEMORY);
86 ASSERT_EQ(response->payload[0], PLDM_SUCCESS);
87 ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]),
88 &length, sizeof(length)));
89
90 // WriteFileFromMemory
91 rc = encode_rw_file_memory_resp(0, PLDM_WRITE_FILE_FROM_MEMORY,
92 PLDM_SUCCESS, length, response);
93
94 ASSERT_EQ(rc, PLDM_SUCCESS);
95 ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
96 ASSERT_EQ(response->hdr.instance_id, 0);
Jinu Joy Thomasf666db12019-05-29 05:22:31 -050097 ASSERT_EQ(response->hdr.type, PLDM_OEM);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +053098 ASSERT_EQ(response->hdr.command, PLDM_WRITE_FILE_FROM_MEMORY);
99 ASSERT_EQ(response->payload[0], PLDM_SUCCESS);
100 ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]),
101 &length, sizeof(length)));
102}
103
104TEST(ReadWriteFileMemory, testBadEncodeResponse)
105{
106 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_RESP_BYTES>
107 responseMsg{};
108 uint32_t length = 0;
109 pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
110
111 // ReadFileIntoMemory
112 auto rc = encode_rw_file_memory_resp(0, PLDM_READ_FILE_INTO_MEMORY,
113 PLDM_ERROR, length, response);
114
115 ASSERT_EQ(rc, PLDM_SUCCESS);
116 ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
117 ASSERT_EQ(response->hdr.instance_id, 0);
Jinu Joy Thomasf666db12019-05-29 05:22:31 -0500118 ASSERT_EQ(response->hdr.type, PLDM_OEM);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530119 ASSERT_EQ(response->hdr.command, PLDM_READ_FILE_INTO_MEMORY);
120 ASSERT_EQ(response->payload[0], PLDM_ERROR);
121
122 // WriteFileFromMemory
123 rc = encode_rw_file_memory_resp(0, PLDM_WRITE_FILE_FROM_MEMORY, PLDM_ERROR,
124 length, response);
125
126 ASSERT_EQ(rc, PLDM_SUCCESS);
127 ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
128 ASSERT_EQ(response->hdr.instance_id, 0);
Jinu Joy Thomasf666db12019-05-29 05:22:31 -0500129 ASSERT_EQ(response->hdr.type, PLDM_OEM);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530130 ASSERT_EQ(response->hdr.command, PLDM_WRITE_FILE_FROM_MEMORY);
131 ASSERT_EQ(response->payload[0], PLDM_ERROR);
132}
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530133
Priyanga8b976652019-06-27 11:30:33 -0500134TEST(ReadWriteFileIntoMemory, testGoodDecodeResponse)
135{
136 std::array<uint8_t, PLDM_RW_FILE_MEM_RESP_BYTES> responseMsg{};
137 // Random value for length
138 uint32_t length = 0xFF00EE12;
139 uint8_t completionCode = 0;
140
141 memcpy(responseMsg.data(), &completionCode, sizeof(completionCode));
142 memcpy(responseMsg.data() + sizeof(completionCode), &length,
143 sizeof(length));
144
145 uint8_t retCompletionCode = 0;
146 uint32_t retLength = 0;
147
148 // Invoke decode the read file memory response
149 auto rc = decode_rw_file_memory_resp(responseMsg.data(), responseMsg.size(),
150 &retCompletionCode, &retLength);
151 ASSERT_EQ(rc, PLDM_SUCCESS);
152 ASSERT_EQ(completionCode, retCompletionCode);
153 ASSERT_EQ(length, retLength);
154}
155
156TEST(ReadWriteFileIntoMemory, testBadDecodeResponse)
157{
158 uint32_t length = 0;
159 uint8_t completionCode = 0;
160
161 // Request payload message is missing
162 auto rc = decode_rw_file_memory_resp(NULL, 0, &completionCode, &length);
163 ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
164
165 std::array<uint8_t, PLDM_RW_FILE_MEM_RESP_BYTES> responseMsg{};
166
167 // Payload length is invalid
168 rc = decode_rw_file_memory_resp(responseMsg.data(), 0, &completionCode,
169 &length);
170 ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
171}
172
173TEST(ReadWriteFileIntoMemory, testGoodEncodeRequest)
174{
175 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
176 requestMsg{};
177
178 uint32_t fileHandle = 0x12345678;
179 uint32_t offset = 0x87654321;
180 uint32_t length = 0x13245768;
181 uint64_t address = 0x124356879ACBDE0F;
182
183 pldm_msg* request = reinterpret_cast<pldm_msg*>(requestMsg.data());
184
185 auto rc =
186 encode_rw_file_memory_req(0, PLDM_READ_FILE_INTO_MEMORY, fileHandle,
187 offset, length, address, request);
188
189 ASSERT_EQ(rc, PLDM_SUCCESS);
190 ASSERT_EQ(request->hdr.request, PLDM_REQUEST);
191 ASSERT_EQ(request->hdr.instance_id, 0);
192 ASSERT_EQ(request->hdr.type, PLDM_OEM);
193 ASSERT_EQ(request->hdr.command, PLDM_READ_FILE_INTO_MEMORY);
194
195 ASSERT_EQ(0, memcmp(request->payload, &fileHandle, sizeof(fileHandle)));
196
197 ASSERT_EQ(0, memcmp(request->payload + sizeof(fileHandle), &offset,
198 sizeof(offset)));
199 ASSERT_EQ(0, memcmp(request->payload + sizeof(fileHandle) + sizeof(offset),
200 &length, sizeof(length)));
201 ASSERT_EQ(0, memcmp(request->payload + sizeof(fileHandle) + sizeof(offset) +
202 sizeof(length),
203 &address, sizeof(address)));
204}
205
206TEST(ReadWriteFileIntoMemory, testBadEncodeRequest)
207{
208 uint32_t fileHandle = 0;
209 uint32_t offset = 0;
210 uint32_t length = 0;
211 uint64_t address = 0;
212
213 auto rc =
214 encode_rw_file_memory_req(0, PLDM_READ_FILE_INTO_MEMORY, fileHandle,
215 offset, length, address, NULL);
216
217 ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
218}
219
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530220TEST(GetFileTable, GoodDecodeRequest)
221{
222 std::array<uint8_t, PLDM_GET_FILE_TABLE_REQ_BYTES> requestMsg{};
223
224 // Random value for DataTransferHandle, TransferOperationFlag, TableType
225 uint32_t transferHandle = 0x12345678;
226 uint8_t transferOpFlag = 1;
227 uint8_t tableType = 1;
228
229 memcpy(requestMsg.data(), &transferHandle, sizeof(transferHandle));
230 memcpy(requestMsg.data() + sizeof(transferHandle), &transferOpFlag,
231 sizeof(transferOpFlag));
232 memcpy(requestMsg.data() + sizeof(transferHandle) + sizeof(transferOpFlag),
233 &tableType, sizeof(tableType));
234
235 uint32_t retTransferHandle = 0;
236 uint8_t retTransferOpFlag = 0;
237 uint8_t retTableType = 0;
238
239 // Invoke decode get file table request
240 auto rc = decode_get_file_table_req(requestMsg.data(), requestMsg.size(),
241 &retTransferHandle, &retTransferOpFlag,
242 &retTableType);
243
244 ASSERT_EQ(rc, PLDM_SUCCESS);
245 ASSERT_EQ(transferHandle, retTransferHandle);
246 ASSERT_EQ(transferOpFlag, retTransferOpFlag);
247 ASSERT_EQ(tableType, retTableType);
248}
249
250TEST(GetFileTable, BadDecodeRequest)
251{
252 uint32_t transferHandle = 0;
253 uint8_t transferOpFlag = 0;
254 uint8_t tableType = 0;
255
256 // Request payload message is missing
257 auto rc = decode_get_file_table_req(nullptr, 0, &transferHandle,
258 &transferOpFlag, &tableType);
259 ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
260
261 std::array<uint8_t, PLDM_GET_FILE_TABLE_REQ_BYTES> requestMsg{};
262
263 // TableType is NULL
264 rc = decode_get_file_table_req(requestMsg.data(), requestMsg.size(),
265 &transferHandle, &transferOpFlag, nullptr);
266 ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
267
268 // Payload length is invalid
269 rc = decode_get_file_table_req(requestMsg.data(), 0, &transferHandle,
270 &transferOpFlag, &tableType);
271 ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
272}
273
274TEST(GetFileTable, GoodEncodeResponse)
275{
276 // Random value for NextDataTransferHandle and TransferFlag
277 uint8_t completionCode = 0;
278 uint32_t nextTransferHandle = 0x87654321;
279 uint8_t transferFlag = 5;
280 // Mock file table contents of size 5
281 std::array<uint8_t, 5> fileTable = {1, 2, 3, 4, 5};
282 constexpr size_t responseSize = sizeof(completionCode) +
283 sizeof(nextTransferHandle) +
284 sizeof(transferFlag) + fileTable.size();
285
286 std::array<uint8_t, sizeof(pldm_msg_hdr) + responseSize> responseMsg{};
287 pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
288
289 // GetFileTable
290 auto rc = encode_get_file_table_resp(0, PLDM_SUCCESS, nextTransferHandle,
291 transferFlag, fileTable.data(),
292 fileTable.size(), response);
293
294 ASSERT_EQ(rc, PLDM_SUCCESS);
295 ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
296 ASSERT_EQ(response->hdr.instance_id, 0);
297 ASSERT_EQ(response->hdr.type, PLDM_OEM);
298 ASSERT_EQ(response->hdr.command, PLDM_GET_FILE_TABLE);
299 ASSERT_EQ(response->payload[0], PLDM_SUCCESS);
300 ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]),
301 &nextTransferHandle, sizeof(nextTransferHandle)));
302 ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
303 sizeof(nextTransferHandle),
304 &transferFlag, sizeof(transferFlag)));
305 ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
306 sizeof(nextTransferHandle),
307 &transferFlag, sizeof(transferFlag)));
308 ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
309 sizeof(nextTransferHandle) + sizeof(transferFlag),
310 fileTable.data(), fileTable.size()));
311}
312
313TEST(GetFileTable, BadEncodeResponse)
314{
315 uint8_t completionCode = 0;
316 uint32_t nextTransferHandle = 0;
317 uint8_t transferFlag = 0;
318 constexpr size_t responseSize = sizeof(completionCode) +
319 sizeof(nextTransferHandle) +
320 sizeof(transferFlag);
321
322 std::array<uint8_t, sizeof(pldm_msg_hdr) + responseSize> responseMsg{};
323 pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
324
325 // GetFileTable
326 auto rc = encode_get_file_table_resp(0, PLDM_ERROR, nextTransferHandle,
327 transferFlag, nullptr, 0, response);
328
329 ASSERT_EQ(rc, PLDM_SUCCESS);
330 ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
331 ASSERT_EQ(response->hdr.instance_id, 0);
332 ASSERT_EQ(response->hdr.type, PLDM_OEM);
333 ASSERT_EQ(response->hdr.command, PLDM_GET_FILE_TABLE);
334 ASSERT_EQ(response->payload[0], PLDM_ERROR);
335}