blob: a8d0722f1d5e83a74c668d0eddcec32b37f6bf19 [file] [log] [blame]
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +05301#include "libpldmresponder/file_io.hpp"
Sampa Misra854e61f2019-08-22 04:36:47 -05002#include "libpldmresponder/file_io_by_type.hpp"
Sampa Misra18967162020-01-14 02:31:41 -06003#include "libpldmresponder/file_io_type_dump.hpp"
Deepak Kodihalli75e02f82019-11-20 02:51:05 -06004#include "libpldmresponder/file_io_type_lid.hpp"
Sampa Misra854e61f2019-08-22 04:36:47 -05005#include "libpldmresponder/file_io_type_pel.hpp"
Tom Joseph0c6d22c2019-06-26 09:58:41 +05306#include "libpldmresponder/file_table.hpp"
Sampa Misra854e61f2019-08-22 04:36:47 -05007#include "xyz/openbmc_project/Common/error.hpp"
Tom Joseph0c6d22c2019-06-26 09:58:41 +05308
9#include <filesystem>
10#include <fstream>
11#include <nlohmann/json.hpp>
Sampa Misra854e61f2019-08-22 04:36:47 -050012#include <phosphor-logging/elog-errors.hpp>
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +053013
14#include "libpldm/base.h"
15#include "libpldm/file_io.h"
16
17#include <gmock/gmock-matchers.h>
18#include <gmock/gmock.h>
19#include <gtest/gtest.h>
Tom Joseph0c6d22c2019-06-26 09:58:41 +053020
Tom Joseph0c6d22c2019-06-26 09:58:41 +053021namespace fs = std::filesystem;
22using Json = nlohmann::json;
23using namespace pldm::filetable;
Deepak Kodihallibc669f12019-11-28 08:52:07 -060024using namespace pldm::responder;
Tom Joseph0c6d22c2019-06-26 09:58:41 +053025
26class TestFileTable : public testing::Test
27{
28 public:
29 void SetUp() override
30 {
31 // Create a temporary directory to hold the config file and files to
32 // populate the file table.
33 char tmppldm[] = "/tmp/pldm_fileio_table.XXXXXX";
34 dir = fs::path(mkdtemp(tmppldm));
35
36 // Copy the sample image files to the directory
37 fs::copy("./files", dir);
38
39 imageFile = dir / "NVRAM-IMAGE";
40 auto jsonObjects = Json::array();
41 auto obj = Json::object();
42 obj["path"] = imageFile.c_str();
43 obj["file_traits"] = 1;
44
45 jsonObjects.push_back(obj);
46 obj.clear();
47 cksumFile = dir / "NVRAM-IMAGE-CKSUM";
48 obj["path"] = cksumFile.c_str();
49 obj["file_traits"] = 4;
50 jsonObjects.push_back(obj);
51
52 fileTableConfig = dir / "configFile.json";
53 std::ofstream file(fileTableConfig.c_str());
54 file << std::setw(4) << jsonObjects << std::endl;
55 }
56
57 void TearDown() override
58 {
59 fs::remove_all(dir);
60 }
61
62 fs::path dir;
63 fs::path imageFile;
64 fs::path cksumFile;
65 fs::path fileTableConfig;
66
67 // <4 bytes - File handle - 0 (0x00 0x00 0x00 0x00)>,
68 // <2 bytes - Filename length - 11 (0x0b 0x00>
69 // <11 bytes - Filename - ASCII for NVRAM-IMAGE>
70 // <4 bytes - File size - 1024 (0x00 0x04 0x00 0x00)>
71 // <4 bytes - File traits - 1 (0x01 0x00 0x00 0x00)>
72 // <4 bytes - File handle - 1 (0x01 0x00 0x00 0x00)>,
73 // <2 bytes - Filename length - 17 (0x11 0x00>
74 // <17 bytes - Filename - ASCII for NVRAM-IMAGE-CKSUM>
75 // <4 bytes - File size - 16 (0x0f 0x00 0x00 0x00)>
76 // <4 bytes - File traits - 4 (0x04 0x00 0x00 0x00)>
77 // No pad bytes added since the length for both the file entries in the
78 // table is 56, which is a multiple of 4.
79 // <4 bytes - Checksum - 2088303182(0x4e 0xfa 0x78 0x7c)>
80 Table attrTable = {
81 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x4e, 0x56, 0x52, 0x41, 0x4d, 0x2d,
82 0x49, 0x4d, 0x41, 0x47, 0x45, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00,
83 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x4e, 0x56, 0x52, 0x41, 0x4d,
84 0x2d, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x2d, 0x43, 0x4b, 0x53, 0x55, 0x4d,
85 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x4e, 0xfa, 0x78, 0x7c};
86};
87
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +053088namespace pldm
89{
90
91namespace responder
92{
93
94namespace dma
95{
96
97class MockDMA
98{
99 public:
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600100 MOCK_METHOD5(transferDataHost, int(int fd, uint32_t offset, uint32_t length,
101 uint64_t address, bool upstream));
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530102};
103
104} // namespace dma
105} // namespace responder
106} // namespace pldm
107using namespace pldm::responder;
108using ::testing::_;
109using ::testing::Return;
110
111TEST(TransferDataHost, GoodPath)
112{
113 using namespace pldm::responder::dma;
114
115 MockDMA dmaObj;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600116 char tmpfile[] = "/tmp/pldm_fileio_table.XXXXXX";
117 int fd = mkstemp(tmpfile);
118 close(fd);
119 fs::path path(tmpfile);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530120
121 // Minimum length of 16 and expect transferDataHost to be called once
122 // returns the default value of 0 (the return type of transferDataHost is
123 // int, the default value for int is 0)
124 uint32_t length = minSize;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600125 EXPECT_CALL(dmaObj, transferDataHost(_, 0, length, 0, true)).Times(1);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530126 auto response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530127 path, 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530128 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
129 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
130 ASSERT_EQ(0, memcmp(responsePtr->payload + sizeof(responsePtr->payload[0]),
131 &length, sizeof(length)));
132
133 // maxsize of DMA
134 length = maxSize;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600135 EXPECT_CALL(dmaObj, transferDataHost(_, 0, length, 0, true)).Times(1);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530136 response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY, path,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530137 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530138 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
139 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
140 ASSERT_EQ(0, memcmp(responsePtr->payload + sizeof(responsePtr->payload[0]),
141 &length, sizeof(length)));
142
143 // length greater than maxsize of DMA
144 length = maxSize + minSize;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600145 EXPECT_CALL(dmaObj, transferDataHost(_, 0, maxSize, 0, true)).Times(1);
146 EXPECT_CALL(dmaObj, transferDataHost(_, maxSize, minSize, maxSize, true))
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530147 .Times(1);
148 response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY, path,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530149 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530150 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
151 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
152 ASSERT_EQ(0, memcmp(responsePtr->payload + sizeof(responsePtr->payload[0]),
153 &length, sizeof(length)));
154
155 // length greater than 2*maxsize of DMA
156 length = 3 * maxSize;
157 EXPECT_CALL(dmaObj, transferDataHost(_, _, _, _, true)).Times(3);
158 response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY, path,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530159 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530160 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
161 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
162 ASSERT_EQ(0, memcmp(responsePtr->payload + sizeof(responsePtr->payload[0]),
163 &length, sizeof(length)));
164
165 // check for downstream(copy data from host to BMC) parameter
166 length = minSize;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600167 EXPECT_CALL(dmaObj, transferDataHost(_, 0, length, 0, false)).Times(1);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530168 response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY, path,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530169 0, length, 0, false, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530170 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
171 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
172 ASSERT_EQ(0, memcmp(responsePtr->payload + sizeof(responsePtr->payload[0]),
173 &length, sizeof(length)));
174}
175
176TEST(TransferDataHost, BadPath)
177{
178 using namespace pldm::responder::dma;
179
180 MockDMA dmaObj;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600181 char tmpfile[] = "/tmp/pldm_fileio_table.XXXXXX";
182 int fd = mkstemp(tmpfile);
183 close(fd);
184 fs::path path(tmpfile);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530185
186 // Minimum length of 16 and transferDataHost returning a negative errno
187 uint32_t length = minSize;
188 EXPECT_CALL(dmaObj, transferDataHost(_, _, _, _, _)).WillOnce(Return(-1));
189 auto response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530190 path, 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530191 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
192 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR);
193
194 // length greater than maxsize of DMA and transferDataHost returning a
195 // negative errno
196 length = maxSize + minSize;
197 EXPECT_CALL(dmaObj, transferDataHost(_, _, _, _, _)).WillOnce(Return(-1));
198 response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY, path,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530199 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530200 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
201 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR);
202}
203
204TEST(ReadFileIntoMemory, BadPath)
205{
206 uint32_t fileHandle = 0;
207 uint32_t offset = 0;
208 uint32_t length = 10;
209 uint64_t address = 0;
210
Jinu Joy Thomasf666db12019-05-29 05:22:31 -0500211 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
212 requestMsg{};
213 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
214 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
215 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
216 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530217 sizeof(length));
Jinu Joy Thomasf666db12019-05-29 05:22:31 -0500218 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530219 sizeof(length),
220 &address, sizeof(address));
221
222 // Pass invalid payload length
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600223 oem_ibm::Handler handler;
224 auto response = handler.readFileIntoMemory(request, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530225 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
226 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
227}
228
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530229TEST_F(TestFileTable, ReadFileInvalidFileHandle)
230{
231 // Invalid file handle in the file table
232 uint32_t fileHandle = 2;
233 uint32_t offset = 0;
234 uint32_t length = 0;
235 uint64_t address = 0;
236
237 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
238 requestMsg{};
239 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
240 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
241 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
242 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
243 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
244 sizeof(length));
245 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
246 sizeof(length),
247 &address, sizeof(address));
248
249 using namespace pldm::filetable;
250 // Initialise the file table with 2 valid file handles 0 & 1.
251 auto& table = buildFileTable(fileTableConfig.c_str());
252
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600253 oem_ibm::Handler handler;
254 auto response = handler.readFileIntoMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530255 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
256 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
257 // Clear the file table contents.
258 table.clear();
259}
260
261TEST_F(TestFileTable, ReadFileInvalidOffset)
262{
263 uint32_t fileHandle = 0;
264 // The file size is 1024, so the offset is invalid
265 uint32_t offset = 1024;
266 uint32_t length = 0;
267 uint64_t address = 0;
268
269 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
270 requestMsg{};
271 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
272 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
273 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
274 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
275 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
276 sizeof(length));
277 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
278 sizeof(length),
279 &address, sizeof(address));
280
281 using namespace pldm::filetable;
282 auto& table = buildFileTable(fileTableConfig.c_str());
283
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600284 oem_ibm::Handler handler;
285 auto response = handler.readFileIntoMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530286 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
287 ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
288 // Clear the file table contents.
289 table.clear();
290}
291
292TEST_F(TestFileTable, ReadFileInvalidLength)
293{
294 uint32_t fileHandle = 0;
295 uint32_t offset = 100;
296 // Length should be a multiple of dma min size(16)
297 uint32_t length = 10;
298 uint64_t address = 0;
299
300 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
301 requestMsg{};
302 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
303 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
304 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
305 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
306 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
307 sizeof(length));
308 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
309 sizeof(length),
310 &address, sizeof(address));
311
312 using namespace pldm::filetable;
313 auto& table = buildFileTable(fileTableConfig.c_str());
314
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600315 oem_ibm::Handler handler;
316 auto response = handler.readFileIntoMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530317 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
318 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_READ_LENGTH);
319 // Clear the file table contents.
320 table.clear();
321}
322
323TEST_F(TestFileTable, ReadFileInvalidEffectiveLength)
324{
325 uint32_t fileHandle = 0;
326 // valid offset
327 uint32_t offset = 100;
328 // length + offset exceeds the size, so effective length is
329 // filesize(1024) - offset(100). The effective length is not a multiple of
330 // DMA min size(16)
331 uint32_t length = 1024;
332 uint64_t address = 0;
333
334 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
335 requestMsg{};
336 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
337 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
338 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
339 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
340 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
341 sizeof(length));
342 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
343 sizeof(length),
344 &address, sizeof(address));
345
346 using namespace pldm::filetable;
347 auto& table = buildFileTable(fileTableConfig.c_str());
348
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600349 oem_ibm::Handler handler;
350 auto response = handler.readFileIntoMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530351 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
352 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_READ_LENGTH);
353 // Clear the file table contents.
354 table.clear();
355}
356
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530357TEST(WriteFileFromMemory, BadPath)
358{
359 uint32_t fileHandle = 0;
360 uint32_t offset = 0;
361 uint32_t length = 10;
362 uint64_t address = 0;
363
Jinu Joy Thomasf666db12019-05-29 05:22:31 -0500364 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
365 requestMsg{};
366 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
367 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
368 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
369 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
370 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530371 sizeof(length));
Jinu Joy Thomasf666db12019-05-29 05:22:31 -0500372 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530373 sizeof(length),
374 &address, sizeof(address));
375
376 // Pass invalid payload length
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600377 oem_ibm::Handler handler;
378 auto response = handler.writeFileFromMemory(request, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530379 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
380 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
381
382 // The length field is not a multiple of DMA minsize
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600383 response = handler.writeFileFromMemory(request, requestPayloadLength);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530384 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
385 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_WRITE_LENGTH);
386}
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530387
388TEST_F(TestFileTable, WriteFileInvalidFileHandle)
389{
390 // Invalid file handle in the file table
391 uint32_t fileHandle = 2;
392 uint32_t offset = 0;
393 uint32_t length = 16;
394 uint64_t address = 0;
395
396 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
397 requestMsg{};
398 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
399 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
400 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
401 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
402 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
403 sizeof(length));
404 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
405 sizeof(length),
406 &address, sizeof(address));
407
408 using namespace pldm::filetable;
409 // Initialise the file table with 2 valid file handles 0 & 1.
410 auto& table = buildFileTable(fileTableConfig.c_str());
411
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600412 oem_ibm::Handler handler;
413 auto response = handler.writeFileFromMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530414 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
415 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
416 // Clear the file table contents.
417 table.clear();
418}
419
420TEST_F(TestFileTable, WriteFileInvalidOffset)
421{
422 uint32_t fileHandle = 0;
423 // The file size is 1024, so the offset is invalid
424 uint32_t offset = 1024;
425 uint32_t length = 16;
426 uint64_t address = 0;
427
428 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
429 requestMsg{};
430 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
431 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
432 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
433 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
434 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
435 sizeof(length));
436 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
437 sizeof(length),
438 &address, sizeof(address));
439
440 using namespace pldm::filetable;
441 // Initialise the file table with 2 valid file handles 0 & 1.
442 auto& table = buildFileTable(TestFileTable::fileTableConfig.c_str());
443
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600444 oem_ibm::Handler handler;
445 auto response = handler.writeFileFromMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530446 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
447 ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
448 // Clear the file table contents.
449 table.clear();
450}
451
452TEST(FileTable, ConfigNotExist)
453{
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530454 FileTable tableObj("");
John Wang881cde12019-10-24 15:08:48 +0800455 EXPECT_EQ(tableObj.isEmpty(), true);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530456}
457
458TEST_F(TestFileTable, ValidateFileEntry)
459{
460 FileTable tableObj(fileTableConfig.c_str());
461
462 // Test file handle 0, the file size is 1K bytes.
463 auto value = tableObj.at(0);
464 ASSERT_EQ(value.handle, 0);
465 ASSERT_EQ(strcmp(value.fsPath.c_str(), imageFile.c_str()), 0);
466 ASSERT_EQ(static_cast<uint32_t>(fs::file_size(value.fsPath)), 1024);
467 ASSERT_EQ(value.traits.value, 1);
468 ASSERT_EQ(true, fs::exists(value.fsPath));
469
470 // Test file handle 1, the file size is 16 bytes
471 auto value1 = tableObj.at(1);
472 ASSERT_EQ(value1.handle, 1);
473 ASSERT_EQ(strcmp(value1.fsPath.c_str(), cksumFile.c_str()), 0);
474 ASSERT_EQ(static_cast<uint32_t>(fs::file_size(value1.fsPath)), 16);
475 ASSERT_EQ(value1.traits.value, 4);
476 ASSERT_EQ(true, fs::exists(value1.fsPath));
477
478 // Test invalid file handle
479 ASSERT_THROW(tableObj.at(2), std::out_of_range);
480}
481
482TEST_F(TestFileTable, ValidateFileTable)
483{
484 FileTable tableObj(fileTableConfig.c_str());
485
486 // Validate file attribute table
487 auto table = tableObj();
488 ASSERT_EQ(true,
489 std::equal(attrTable.begin(), attrTable.end(), table.begin()));
490}
491
492TEST_F(TestFileTable, GetFileTableCommand)
493{
494 // Initialise the file table with a valid handle of 0 & 1
495 auto& table = buildFileTable(fileTableConfig.c_str());
496
497 uint32_t transferHandle = 0;
498 uint8_t opFlag = 0;
499 uint8_t type = PLDM_FILE_ATTRIBUTE_TABLE;
500 uint32_t nextTransferHandle = 0;
501 uint8_t transferFlag = PLDM_START_AND_END;
502
503 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_FILE_TABLE_REQ_BYTES>
504 requestMsg{};
505 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
506 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
507 auto request = reinterpret_cast<pldm_get_file_table_req*>(
508 requestMsg.data() + sizeof(pldm_msg_hdr));
509 request->transfer_handle = transferHandle;
510 request->operation_flag = opFlag;
511 request->table_type = type;
512
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600513 oem_ibm::Handler handler;
514 auto response = handler.getFileTable(requestMsgPtr, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530515 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
516 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
517 size_t offsetSize = sizeof(responsePtr->payload[0]);
518 ASSERT_EQ(0, memcmp(responsePtr->payload + offsetSize, &nextTransferHandle,
519 sizeof(nextTransferHandle)));
520 offsetSize += sizeof(nextTransferHandle);
521 ASSERT_EQ(0, memcmp(responsePtr->payload + offsetSize, &transferFlag,
522 sizeof(transferFlag)));
523 offsetSize += sizeof(transferFlag);
524 ASSERT_EQ(0, memcmp(responsePtr->payload + offsetSize, attrTable.data(),
525 attrTable.size()));
526 table.clear();
527}
528
529TEST_F(TestFileTable, GetFileTableCommandReqLengthMismatch)
530{
531 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_FILE_TABLE_REQ_BYTES>
532 requestMsg{};
533 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
534
535 // Pass invalid command payload length
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600536 oem_ibm::Handler handler;
537 auto response = handler.getFileTable(request, 0);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530538 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
539 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
540}
541
542TEST_F(TestFileTable, GetFileTableCommandOEMAttrTable)
543{
544 uint32_t transferHandle = 0;
545 uint8_t opFlag = 0;
546 uint8_t type = PLDM_OEM_FILE_ATTRIBUTE_TABLE;
547
548 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_FILE_TABLE_REQ_BYTES>
549 requestMsg{};
550 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
551 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
552 auto request = reinterpret_cast<pldm_get_file_table_req*>(
553 requestMsg.data() + sizeof(pldm_msg_hdr));
554 request->transfer_handle = transferHandle;
555 request->operation_flag = opFlag;
556 request->table_type = type;
557
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600558 oem_ibm::Handler handler;
559 auto response = handler.getFileTable(requestMsgPtr, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530560 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
561 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_TABLE_TYPE);
562}
vkaverap5b914c32019-06-30 22:23:54 -0500563
564TEST_F(TestFileTable, ReadFileBadPath)
565{
566 uint32_t fileHandle = 1;
567 uint32_t offset = 0;
568 uint32_t length = 0x4;
569
570 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_READ_FILE_REQ_BYTES>
571 requestMsg{};
572 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
573 auto payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
574 auto request = reinterpret_cast<pldm_read_file_req*>(requestMsg.data() +
575 sizeof(pldm_msg_hdr));
576
577 request->file_handle = fileHandle;
578 request->offset = offset;
579 request->length = length;
580
581 using namespace pldm::filetable;
582 // Initialise the file table with 2 valid file handles 0 & 1.
583 auto& table = buildFileTable(fileTableConfig.c_str());
584
585 // Invalid payload length
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600586 oem_ibm::Handler handler;
587 auto response = handler.readFile(requestMsgPtr, 0);
vkaverap5b914c32019-06-30 22:23:54 -0500588 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
589 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
590
591 // Data out of range. File size is 1024, offset = 1024 is invalid.
592 request->offset = 1024;
593
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600594 response = handler.readFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500595 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
596 ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
597
598 // Invalid file handle
599 request->file_handle = 2;
600
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600601 response = handler.readFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500602 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
603 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
604
605 table.clear();
606}
607
608TEST_F(TestFileTable, ReadFileGoodPath)
609{
610 uint32_t fileHandle = 0;
611 uint32_t offset = 0;
612 uint32_t length = 0x4;
613
614 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_READ_FILE_REQ_BYTES>
615 requestMsg{};
616 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
617 auto payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
618 auto request = reinterpret_cast<pldm_read_file_req*>(requestMsg.data() +
619 sizeof(pldm_msg_hdr));
620
621 request->file_handle = fileHandle;
622 request->offset = offset;
623 request->length = length;
624
625 using namespace pldm::filetable;
626 // Initialise the file table with 2 valid file handles 0 & 1.
627 auto& table = buildFileTable(fileTableConfig.c_str());
628 FileEntry value{};
629 value = table.at(fileHandle);
630
631 std::ifstream stream(value.fsPath, std::ios::in | std::ios::binary);
632 stream.seekg(offset);
633 std::vector<char> buffer(length);
634 stream.read(buffer.data(), length);
635
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600636 oem_ibm::Handler handler;
637 auto responseMsg = handler.readFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500638 auto response = reinterpret_cast<pldm_read_file_resp*>(
639 responseMsg.data() + sizeof(pldm_msg_hdr));
640 ASSERT_EQ(response->completion_code, PLDM_SUCCESS);
641 ASSERT_EQ(response->length, length);
642 ASSERT_EQ(0, memcmp(response->file_data, buffer.data(), length));
643
644 // Test condition offset + length > fileSize;
645 size_t fileSize = 1024;
646 request->offset = 1023;
647 request->length = 10;
648
649 stream.seekg(request->offset);
650 buffer.resize(fileSize - request->offset);
651 stream.read(buffer.data(), (fileSize - request->offset));
652
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600653 responseMsg = handler.readFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500654 response = reinterpret_cast<pldm_read_file_resp*>(responseMsg.data() +
655 sizeof(pldm_msg_hdr));
656 ASSERT_EQ(response->completion_code, PLDM_SUCCESS);
657 ASSERT_EQ(response->length, (fileSize - request->offset));
658 ASSERT_EQ(0, memcmp(response->file_data, buffer.data(),
659 (fileSize - request->offset)));
660
661 table.clear();
662}
663
664TEST_F(TestFileTable, WriteFileBadPath)
665{
666 uint32_t fileHandle = 0;
667 uint32_t offset = 0;
668 uint32_t length = 0x10;
669
670 std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
671 PLDM_WRITE_FILE_REQ_BYTES + length);
672 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
673 auto payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
674 auto request = reinterpret_cast<pldm_write_file_req*>(requestMsg.data() +
675 sizeof(pldm_msg_hdr));
676
677 using namespace pldm::filetable;
678 // Initialise the file table with 2 valid file handles 0 & 1.
679 auto& table = buildFileTable(fileTableConfig.c_str());
680
681 request->file_handle = fileHandle;
682 request->offset = offset;
683 request->length = length;
684
685 // Invalid payload length
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600686 oem_ibm::Handler handler;
687 auto response = handler.writeFile(requestMsgPtr, 0);
vkaverap5b914c32019-06-30 22:23:54 -0500688 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
689 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
690
691 // Data out of range. File size is 1024, offset = 1024 is invalid.
692 request->offset = 1024;
693
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600694 response = handler.writeFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500695 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
696 ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
697
698 // Invalid file handle
699 request->file_handle = 2;
700
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600701 response = handler.writeFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500702 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
703 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
704
705 table.clear();
706}
707
708TEST_F(TestFileTable, WriteFileGoodPath)
709{
710 uint32_t fileHandle = 1;
711 uint32_t offset = 0;
712 std::array<uint8_t, 4> fileData = {0x41, 0x42, 0x43, 0x44};
713 uint32_t length = fileData.size();
714
715 std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
716 PLDM_WRITE_FILE_REQ_BYTES + length);
717 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
718 auto payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
719 auto request = reinterpret_cast<pldm_write_file_req*>(requestMsg.data() +
720 sizeof(pldm_msg_hdr));
721
722 using namespace pldm::filetable;
723 // Initialise the file table with 2 valid file handles 0 & 1.
724 auto& table = buildFileTable(fileTableConfig.c_str());
725 FileEntry value{};
726 value = table.at(fileHandle);
727
728 request->file_handle = fileHandle;
729 request->offset = offset;
730 request->length = length;
731 memcpy(request->file_data, fileData.data(), fileData.size());
732
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600733 oem_ibm::Handler handler;
734 auto responseMsg = handler.writeFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500735 auto response = reinterpret_cast<pldm_read_file_resp*>(
736 responseMsg.data() + sizeof(pldm_msg_hdr));
737
738 std::ifstream stream(value.fsPath, std::ios::in | std::ios::binary);
739 stream.seekg(offset);
740 std::vector<char> buffer(length);
741 stream.read(buffer.data(), length);
742
743 ASSERT_EQ(response->completion_code, PLDM_SUCCESS);
744 ASSERT_EQ(response->length, length);
745 ASSERT_EQ(0, memcmp(fileData.data(), buffer.data(), length));
746
747 table.clear();
748}
Sampa Misra854e61f2019-08-22 04:36:47 -0500749
750TEST(writeFileByTypeFromMemory, testBadPath)
751{
752 const auto hdr_size = sizeof(pldm_msg_hdr);
753 std::array<uint8_t, hdr_size + PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES>
754 requestMsg{};
755 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
756 size_t requestPayloadLength = requestMsg.size() - hdr_size;
757 struct pldm_read_write_file_by_type_memory_req* request =
758 reinterpret_cast<struct pldm_read_write_file_by_type_memory_req*>(
759 req->payload);
760 request->file_type = PLDM_FILE_TYPE_PEL;
761 request->file_handle = 0xFFFFFFFF;
762 request->offset = 0;
763 request->length = 17;
764 request->address = 0;
765
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600766 oem_ibm::Handler handler;
767 auto response = handler.writeFileByTypeFromMemory(req, 0);
Sampa Misra854e61f2019-08-22 04:36:47 -0500768 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
769
770 struct pldm_read_write_file_by_type_memory_resp* resp =
771 reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
772 responsePtr->payload);
773 ASSERT_EQ(PLDM_ERROR_INVALID_LENGTH, resp->completion_code);
774
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600775 response = handler.writeFileByTypeFromMemory(req, requestPayloadLength);
Sampa Misra854e61f2019-08-22 04:36:47 -0500776 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
777
778 resp = reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
779 responsePtr->payload);
780 ASSERT_EQ(PLDM_INVALID_WRITE_LENGTH, resp->completion_code);
781}
782
783TEST(getHandlerByType, allPaths)
784{
785 uint32_t fileHandle{};
786 auto handler = getHandlerByType(PLDM_FILE_TYPE_PEL, fileHandle);
787 auto pelType = dynamic_cast<PelHandler*>(handler.get());
788 ASSERT_TRUE(pelType != nullptr);
789
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600790 handler = getHandlerByType(PLDM_FILE_TYPE_LID_PERM, fileHandle);
791 auto lidType = dynamic_cast<LidHandler*>(handler.get());
792 ASSERT_TRUE(lidType != nullptr);
793 pelType = dynamic_cast<PelHandler*>(handler.get());
794 ASSERT_TRUE(pelType == nullptr);
795 handler = getHandlerByType(PLDM_FILE_TYPE_LID_TEMP, fileHandle);
796 lidType = dynamic_cast<LidHandler*>(handler.get());
797 ASSERT_TRUE(lidType != nullptr);
798
Sampa Misra18967162020-01-14 02:31:41 -0600799 handler = getHandlerByType(PLDM_FILE_TYPE_DUMP, fileHandle);
800 auto dumpType = dynamic_cast<DumpHandler*>(handler.get());
801 ASSERT_TRUE(dumpType != nullptr);
802
Sampa Misra854e61f2019-08-22 04:36:47 -0500803 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
804 ASSERT_THROW(getHandlerByType(0xFFFF, fileHandle), InternalFailure);
805}
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600806
807TEST(readFileByTypeIntoMemory, testBadPath)
808{
809 const auto hdr_size = sizeof(pldm_msg_hdr);
810 std::array<uint8_t, hdr_size + PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES>
811 requestMsg{};
812 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
813 struct pldm_read_write_file_by_type_memory_req* request =
814 reinterpret_cast<struct pldm_read_write_file_by_type_memory_req*>(
815 req->payload);
816 request->file_type = 0xFFFF;
817 request->file_handle = 0;
818 request->offset = 0;
819 request->length = 17;
820 request->address = 0;
821
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600822 oem_ibm::Handler handler;
823 auto response = handler.readFileByTypeIntoMemory(req, 0);
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600824 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
825 struct pldm_read_write_file_by_type_memory_resp* resp =
826 reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
827 responsePtr->payload);
828 ASSERT_EQ(PLDM_ERROR_INVALID_LENGTH, resp->completion_code);
829
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600830 response = handler.readFileByTypeIntoMemory(
831 req, PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES);
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600832 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
833 resp = reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
834 responsePtr->payload);
835 ASSERT_EQ(PLDM_INVALID_WRITE_LENGTH, resp->completion_code);
836
837 request->length = 16;
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600838 response = handler.readFileByTypeIntoMemory(
839 req, PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES);
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600840 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
841 resp = reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
842 responsePtr->payload);
843 ASSERT_EQ(PLDM_INVALID_FILE_TYPE, resp->completion_code);
844}
845
846TEST(readFileByType, testBadPath)
847{
848 const auto hdr_size = sizeof(pldm_msg_hdr);
849 std::array<uint8_t, hdr_size + PLDM_RW_FILE_BY_TYPE_REQ_BYTES> requestMsg{};
850 auto payloadLength = requestMsg.size() - hdr_size;
851 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
852 struct pldm_read_write_file_by_type_req* request =
853 reinterpret_cast<struct pldm_read_write_file_by_type_req*>(
854 req->payload);
855 request->file_type = 0xFFFF;
856 request->file_handle = 0;
857 request->offset = 0;
858 request->length = 13;
859
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600860 oem_ibm::Handler handler;
861 auto response = handler.readFileByType(req, 0);
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600862 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
863 struct pldm_read_write_file_by_type_resp* resp =
864 reinterpret_cast<struct pldm_read_write_file_by_type_resp*>(
865 responsePtr->payload);
866 ASSERT_EQ(PLDM_ERROR_INVALID_LENGTH, resp->completion_code);
867
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600868 response = handler.readFileByType(req, payloadLength);
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600869 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
870 resp = reinterpret_cast<struct pldm_read_write_file_by_type_resp*>(
871 responsePtr->payload);
872 ASSERT_EQ(PLDM_INVALID_FILE_TYPE, resp->completion_code);
873}
874
875TEST(readFileByType, testReadFile)
876{
877 LidHandler handler(0, true);
878 Response response;
879 uint32_t length{};
880
881 auto rc = handler.readFile({}, 0, length, response);
882 ASSERT_EQ(PLDM_INVALID_FILE_HANDLE, rc);
883
884 char tmplt[] = "/tmp/lid.XXXXXX";
885 auto fd = mkstemp(tmplt);
886 std::vector<uint8_t> in = {100, 10, 56, 78, 34, 56, 79, 235, 111};
887 write(fd, in.data(), in.size());
888 close(fd);
889 length = in.size() + 1000;
890 rc = handler.readFile(tmplt, 0, length, response);
891 ASSERT_EQ(rc, PLDM_SUCCESS);
892 ASSERT_EQ(length, in.size());
893 ASSERT_EQ(response.size(), in.size());
894 ASSERT_EQ(std::equal(in.begin(), in.end(), response.begin()), true);
895}