blob: 86df25e20a30d32f4870310d61a3443de03ff304 [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"
Deepak Kodihalli75e02f82019-11-20 02:51:05 -06003#include "libpldmresponder/file_io_type_lid.hpp"
Sampa Misra854e61f2019-08-22 04:36:47 -05004#include "libpldmresponder/file_io_type_pel.hpp"
Tom Joseph0c6d22c2019-06-26 09:58:41 +05305#include "libpldmresponder/file_table.hpp"
Sampa Misra854e61f2019-08-22 04:36:47 -05006#include "xyz/openbmc_project/Common/error.hpp"
Tom Joseph0c6d22c2019-06-26 09:58:41 +05307
8#include <filesystem>
9#include <fstream>
10#include <nlohmann/json.hpp>
Sampa Misra854e61f2019-08-22 04:36:47 -050011#include <phosphor-logging/elog-errors.hpp>
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +053012
13#include "libpldm/base.h"
14#include "libpldm/file_io.h"
15
16#include <gmock/gmock-matchers.h>
17#include <gmock/gmock.h>
18#include <gtest/gtest.h>
Tom Joseph0c6d22c2019-06-26 09:58:41 +053019
Tom Joseph0c6d22c2019-06-26 09:58:41 +053020namespace fs = std::filesystem;
21using Json = nlohmann::json;
22using namespace pldm::filetable;
Deepak Kodihallibc669f12019-11-28 08:52:07 -060023using namespace pldm::responder;
Tom Joseph0c6d22c2019-06-26 09:58:41 +053024
25class TestFileTable : public testing::Test
26{
27 public:
28 void SetUp() override
29 {
30 // Create a temporary directory to hold the config file and files to
31 // populate the file table.
32 char tmppldm[] = "/tmp/pldm_fileio_table.XXXXXX";
33 dir = fs::path(mkdtemp(tmppldm));
34
35 // Copy the sample image files to the directory
36 fs::copy("./files", dir);
37
38 imageFile = dir / "NVRAM-IMAGE";
39 auto jsonObjects = Json::array();
40 auto obj = Json::object();
41 obj["path"] = imageFile.c_str();
42 obj["file_traits"] = 1;
43
44 jsonObjects.push_back(obj);
45 obj.clear();
46 cksumFile = dir / "NVRAM-IMAGE-CKSUM";
47 obj["path"] = cksumFile.c_str();
48 obj["file_traits"] = 4;
49 jsonObjects.push_back(obj);
50
51 fileTableConfig = dir / "configFile.json";
52 std::ofstream file(fileTableConfig.c_str());
53 file << std::setw(4) << jsonObjects << std::endl;
54 }
55
56 void TearDown() override
57 {
58 fs::remove_all(dir);
59 }
60
61 fs::path dir;
62 fs::path imageFile;
63 fs::path cksumFile;
64 fs::path fileTableConfig;
65
66 // <4 bytes - File handle - 0 (0x00 0x00 0x00 0x00)>,
67 // <2 bytes - Filename length - 11 (0x0b 0x00>
68 // <11 bytes - Filename - ASCII for NVRAM-IMAGE>
69 // <4 bytes - File size - 1024 (0x00 0x04 0x00 0x00)>
70 // <4 bytes - File traits - 1 (0x01 0x00 0x00 0x00)>
71 // <4 bytes - File handle - 1 (0x01 0x00 0x00 0x00)>,
72 // <2 bytes - Filename length - 17 (0x11 0x00>
73 // <17 bytes - Filename - ASCII for NVRAM-IMAGE-CKSUM>
74 // <4 bytes - File size - 16 (0x0f 0x00 0x00 0x00)>
75 // <4 bytes - File traits - 4 (0x04 0x00 0x00 0x00)>
76 // No pad bytes added since the length for both the file entries in the
77 // table is 56, which is a multiple of 4.
78 // <4 bytes - Checksum - 2088303182(0x4e 0xfa 0x78 0x7c)>
79 Table attrTable = {
80 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x4e, 0x56, 0x52, 0x41, 0x4d, 0x2d,
81 0x49, 0x4d, 0x41, 0x47, 0x45, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00,
82 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x4e, 0x56, 0x52, 0x41, 0x4d,
83 0x2d, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x2d, 0x43, 0x4b, 0x53, 0x55, 0x4d,
84 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x4e, 0xfa, 0x78, 0x7c};
85};
86
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +053087namespace pldm
88{
89
90namespace responder
91{
92
93namespace dma
94{
95
96class MockDMA
97{
98 public:
Deepak Kodihalli15211b42019-12-14 02:24:49 -060099 MOCK_METHOD5(transferDataHost, int(int fd, uint32_t offset, uint32_t length,
100 uint64_t address, bool upstream));
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530101};
102
103} // namespace dma
104} // namespace responder
105} // namespace pldm
106using namespace pldm::responder;
107using ::testing::_;
108using ::testing::Return;
109
110TEST(TransferDataHost, GoodPath)
111{
112 using namespace pldm::responder::dma;
113
114 MockDMA dmaObj;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600115 char tmpfile[] = "/tmp/pldm_fileio_table.XXXXXX";
116 int fd = mkstemp(tmpfile);
117 close(fd);
118 fs::path path(tmpfile);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530119
120 // Minimum length of 16 and expect transferDataHost to be called once
121 // returns the default value of 0 (the return type of transferDataHost is
122 // int, the default value for int is 0)
123 uint32_t length = minSize;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600124 EXPECT_CALL(dmaObj, transferDataHost(_, 0, length, 0, true)).Times(1);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530125 auto response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530126 path, 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530127 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
128 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
129 ASSERT_EQ(0, memcmp(responsePtr->payload + sizeof(responsePtr->payload[0]),
130 &length, sizeof(length)));
131
132 // maxsize of DMA
133 length = maxSize;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600134 EXPECT_CALL(dmaObj, transferDataHost(_, 0, length, 0, true)).Times(1);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530135 response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY, path,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530136 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530137 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
138 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
139 ASSERT_EQ(0, memcmp(responsePtr->payload + sizeof(responsePtr->payload[0]),
140 &length, sizeof(length)));
141
142 // length greater than maxsize of DMA
143 length = maxSize + minSize;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600144 EXPECT_CALL(dmaObj, transferDataHost(_, 0, maxSize, 0, true)).Times(1);
145 EXPECT_CALL(dmaObj, transferDataHost(_, maxSize, minSize, maxSize, true))
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530146 .Times(1);
147 response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY, path,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530148 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530149 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
150 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
151 ASSERT_EQ(0, memcmp(responsePtr->payload + sizeof(responsePtr->payload[0]),
152 &length, sizeof(length)));
153
154 // length greater than 2*maxsize of DMA
155 length = 3 * maxSize;
156 EXPECT_CALL(dmaObj, transferDataHost(_, _, _, _, true)).Times(3);
157 response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY, path,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530158 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530159 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
160 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
161 ASSERT_EQ(0, memcmp(responsePtr->payload + sizeof(responsePtr->payload[0]),
162 &length, sizeof(length)));
163
164 // check for downstream(copy data from host to BMC) parameter
165 length = minSize;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600166 EXPECT_CALL(dmaObj, transferDataHost(_, 0, length, 0, false)).Times(1);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530167 response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY, path,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530168 0, length, 0, false, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530169 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
170 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
171 ASSERT_EQ(0, memcmp(responsePtr->payload + sizeof(responsePtr->payload[0]),
172 &length, sizeof(length)));
173}
174
175TEST(TransferDataHost, BadPath)
176{
177 using namespace pldm::responder::dma;
178
179 MockDMA dmaObj;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600180 char tmpfile[] = "/tmp/pldm_fileio_table.XXXXXX";
181 int fd = mkstemp(tmpfile);
182 close(fd);
183 fs::path path(tmpfile);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530184
185 // Minimum length of 16 and transferDataHost returning a negative errno
186 uint32_t length = minSize;
187 EXPECT_CALL(dmaObj, transferDataHost(_, _, _, _, _)).WillOnce(Return(-1));
188 auto response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530189 path, 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530190 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
191 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR);
192
193 // length greater than maxsize of DMA and transferDataHost returning a
194 // negative errno
195 length = maxSize + minSize;
196 EXPECT_CALL(dmaObj, transferDataHost(_, _, _, _, _)).WillOnce(Return(-1));
197 response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY, path,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530198 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530199 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
200 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR);
201}
202
203TEST(ReadFileIntoMemory, BadPath)
204{
205 uint32_t fileHandle = 0;
206 uint32_t offset = 0;
207 uint32_t length = 10;
208 uint64_t address = 0;
209
Jinu Joy Thomasf666db12019-05-29 05:22:31 -0500210 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
211 requestMsg{};
212 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
213 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
214 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
215 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530216 sizeof(length));
Jinu Joy Thomasf666db12019-05-29 05:22:31 -0500217 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530218 sizeof(length),
219 &address, sizeof(address));
220
221 // Pass invalid payload length
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600222 oem_ibm::Handler handler;
223 auto response = handler.readFileIntoMemory(request, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530224 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
225 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
226}
227
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530228TEST_F(TestFileTable, ReadFileInvalidFileHandle)
229{
230 // Invalid file handle in the file table
231 uint32_t fileHandle = 2;
232 uint32_t offset = 0;
233 uint32_t length = 0;
234 uint64_t address = 0;
235
236 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
237 requestMsg{};
238 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
239 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
240 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
241 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
242 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
243 sizeof(length));
244 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
245 sizeof(length),
246 &address, sizeof(address));
247
248 using namespace pldm::filetable;
249 // Initialise the file table with 2 valid file handles 0 & 1.
250 auto& table = buildFileTable(fileTableConfig.c_str());
251
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600252 oem_ibm::Handler handler;
253 auto response = handler.readFileIntoMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530254 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
255 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
256 // Clear the file table contents.
257 table.clear();
258}
259
260TEST_F(TestFileTable, ReadFileInvalidOffset)
261{
262 uint32_t fileHandle = 0;
263 // The file size is 1024, so the offset is invalid
264 uint32_t offset = 1024;
265 uint32_t length = 0;
266 uint64_t address = 0;
267
268 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
269 requestMsg{};
270 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
271 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
272 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
273 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
274 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
275 sizeof(length));
276 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
277 sizeof(length),
278 &address, sizeof(address));
279
280 using namespace pldm::filetable;
281 auto& table = buildFileTable(fileTableConfig.c_str());
282
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600283 oem_ibm::Handler handler;
284 auto response = handler.readFileIntoMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530285 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
286 ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
287 // Clear the file table contents.
288 table.clear();
289}
290
291TEST_F(TestFileTable, ReadFileInvalidLength)
292{
293 uint32_t fileHandle = 0;
294 uint32_t offset = 100;
295 // Length should be a multiple of dma min size(16)
296 uint32_t length = 10;
297 uint64_t address = 0;
298
299 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
300 requestMsg{};
301 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
302 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
303 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
304 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
305 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
306 sizeof(length));
307 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
308 sizeof(length),
309 &address, sizeof(address));
310
311 using namespace pldm::filetable;
312 auto& table = buildFileTable(fileTableConfig.c_str());
313
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600314 oem_ibm::Handler handler;
315 auto response = handler.readFileIntoMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530316 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
317 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_READ_LENGTH);
318 // Clear the file table contents.
319 table.clear();
320}
321
322TEST_F(TestFileTable, ReadFileInvalidEffectiveLength)
323{
324 uint32_t fileHandle = 0;
325 // valid offset
326 uint32_t offset = 100;
327 // length + offset exceeds the size, so effective length is
328 // filesize(1024) - offset(100). The effective length is not a multiple of
329 // DMA min size(16)
330 uint32_t length = 1024;
331 uint64_t address = 0;
332
333 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
334 requestMsg{};
335 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
336 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
337 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
338 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
339 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
340 sizeof(length));
341 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
342 sizeof(length),
343 &address, sizeof(address));
344
345 using namespace pldm::filetable;
346 auto& table = buildFileTable(fileTableConfig.c_str());
347
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600348 oem_ibm::Handler handler;
349 auto response = handler.readFileIntoMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530350 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
351 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_READ_LENGTH);
352 // Clear the file table contents.
353 table.clear();
354}
355
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530356TEST(WriteFileFromMemory, BadPath)
357{
358 uint32_t fileHandle = 0;
359 uint32_t offset = 0;
360 uint32_t length = 10;
361 uint64_t address = 0;
362
Jinu Joy Thomasf666db12019-05-29 05:22:31 -0500363 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
364 requestMsg{};
365 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
366 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
367 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
368 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
369 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530370 sizeof(length));
Jinu Joy Thomasf666db12019-05-29 05:22:31 -0500371 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530372 sizeof(length),
373 &address, sizeof(address));
374
375 // Pass invalid payload length
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600376 oem_ibm::Handler handler;
377 auto response = handler.writeFileFromMemory(request, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530378 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
379 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
380
381 // The length field is not a multiple of DMA minsize
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600382 response = handler.writeFileFromMemory(request, requestPayloadLength);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530383 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
384 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_WRITE_LENGTH);
385}
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530386
387TEST_F(TestFileTable, WriteFileInvalidFileHandle)
388{
389 // Invalid file handle in the file table
390 uint32_t fileHandle = 2;
391 uint32_t offset = 0;
392 uint32_t length = 16;
393 uint64_t address = 0;
394
395 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
396 requestMsg{};
397 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
398 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
399 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
400 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
401 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
402 sizeof(length));
403 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
404 sizeof(length),
405 &address, sizeof(address));
406
407 using namespace pldm::filetable;
408 // Initialise the file table with 2 valid file handles 0 & 1.
409 auto& table = buildFileTable(fileTableConfig.c_str());
410
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600411 oem_ibm::Handler handler;
412 auto response = handler.writeFileFromMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530413 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
414 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
415 // Clear the file table contents.
416 table.clear();
417}
418
419TEST_F(TestFileTable, WriteFileInvalidOffset)
420{
421 uint32_t fileHandle = 0;
422 // The file size is 1024, so the offset is invalid
423 uint32_t offset = 1024;
424 uint32_t length = 16;
425 uint64_t address = 0;
426
427 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
428 requestMsg{};
429 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
430 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
431 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
432 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
433 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
434 sizeof(length));
435 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
436 sizeof(length),
437 &address, sizeof(address));
438
439 using namespace pldm::filetable;
440 // Initialise the file table with 2 valid file handles 0 & 1.
441 auto& table = buildFileTable(TestFileTable::fileTableConfig.c_str());
442
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600443 oem_ibm::Handler handler;
444 auto response = handler.writeFileFromMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530445 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
446 ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
447 // Clear the file table contents.
448 table.clear();
449}
450
451TEST(FileTable, ConfigNotExist)
452{
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530453 FileTable tableObj("");
John Wang881cde12019-10-24 15:08:48 +0800454 EXPECT_EQ(tableObj.isEmpty(), true);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530455}
456
457TEST_F(TestFileTable, ValidateFileEntry)
458{
459 FileTable tableObj(fileTableConfig.c_str());
460
461 // Test file handle 0, the file size is 1K bytes.
462 auto value = tableObj.at(0);
463 ASSERT_EQ(value.handle, 0);
464 ASSERT_EQ(strcmp(value.fsPath.c_str(), imageFile.c_str()), 0);
465 ASSERT_EQ(static_cast<uint32_t>(fs::file_size(value.fsPath)), 1024);
466 ASSERT_EQ(value.traits.value, 1);
467 ASSERT_EQ(true, fs::exists(value.fsPath));
468
469 // Test file handle 1, the file size is 16 bytes
470 auto value1 = tableObj.at(1);
471 ASSERT_EQ(value1.handle, 1);
472 ASSERT_EQ(strcmp(value1.fsPath.c_str(), cksumFile.c_str()), 0);
473 ASSERT_EQ(static_cast<uint32_t>(fs::file_size(value1.fsPath)), 16);
474 ASSERT_EQ(value1.traits.value, 4);
475 ASSERT_EQ(true, fs::exists(value1.fsPath));
476
477 // Test invalid file handle
478 ASSERT_THROW(tableObj.at(2), std::out_of_range);
479}
480
481TEST_F(TestFileTable, ValidateFileTable)
482{
483 FileTable tableObj(fileTableConfig.c_str());
484
485 // Validate file attribute table
486 auto table = tableObj();
487 ASSERT_EQ(true,
488 std::equal(attrTable.begin(), attrTable.end(), table.begin()));
489}
490
491TEST_F(TestFileTable, GetFileTableCommand)
492{
493 // Initialise the file table with a valid handle of 0 & 1
494 auto& table = buildFileTable(fileTableConfig.c_str());
495
496 uint32_t transferHandle = 0;
497 uint8_t opFlag = 0;
498 uint8_t type = PLDM_FILE_ATTRIBUTE_TABLE;
499 uint32_t nextTransferHandle = 0;
500 uint8_t transferFlag = PLDM_START_AND_END;
501
502 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_FILE_TABLE_REQ_BYTES>
503 requestMsg{};
504 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
505 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
506 auto request = reinterpret_cast<pldm_get_file_table_req*>(
507 requestMsg.data() + sizeof(pldm_msg_hdr));
508 request->transfer_handle = transferHandle;
509 request->operation_flag = opFlag;
510 request->table_type = type;
511
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600512 oem_ibm::Handler handler;
513 auto response = handler.getFileTable(requestMsgPtr, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530514 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
515 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
516 size_t offsetSize = sizeof(responsePtr->payload[0]);
517 ASSERT_EQ(0, memcmp(responsePtr->payload + offsetSize, &nextTransferHandle,
518 sizeof(nextTransferHandle)));
519 offsetSize += sizeof(nextTransferHandle);
520 ASSERT_EQ(0, memcmp(responsePtr->payload + offsetSize, &transferFlag,
521 sizeof(transferFlag)));
522 offsetSize += sizeof(transferFlag);
523 ASSERT_EQ(0, memcmp(responsePtr->payload + offsetSize, attrTable.data(),
524 attrTable.size()));
525 table.clear();
526}
527
528TEST_F(TestFileTable, GetFileTableCommandReqLengthMismatch)
529{
530 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_FILE_TABLE_REQ_BYTES>
531 requestMsg{};
532 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
533
534 // Pass invalid command payload length
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600535 oem_ibm::Handler handler;
536 auto response = handler.getFileTable(request, 0);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530537 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
538 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
539}
540
541TEST_F(TestFileTable, GetFileTableCommandOEMAttrTable)
542{
543 uint32_t transferHandle = 0;
544 uint8_t opFlag = 0;
545 uint8_t type = PLDM_OEM_FILE_ATTRIBUTE_TABLE;
546
547 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_FILE_TABLE_REQ_BYTES>
548 requestMsg{};
549 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
550 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
551 auto request = reinterpret_cast<pldm_get_file_table_req*>(
552 requestMsg.data() + sizeof(pldm_msg_hdr));
553 request->transfer_handle = transferHandle;
554 request->operation_flag = opFlag;
555 request->table_type = type;
556
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600557 oem_ibm::Handler handler;
558 auto response = handler.getFileTable(requestMsgPtr, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530559 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
560 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_TABLE_TYPE);
561}
vkaverap5b914c32019-06-30 22:23:54 -0500562
563TEST_F(TestFileTable, ReadFileBadPath)
564{
565 uint32_t fileHandle = 1;
566 uint32_t offset = 0;
567 uint32_t length = 0x4;
568
569 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_READ_FILE_REQ_BYTES>
570 requestMsg{};
571 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
572 auto payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
573 auto request = reinterpret_cast<pldm_read_file_req*>(requestMsg.data() +
574 sizeof(pldm_msg_hdr));
575
576 request->file_handle = fileHandle;
577 request->offset = offset;
578 request->length = length;
579
580 using namespace pldm::filetable;
581 // Initialise the file table with 2 valid file handles 0 & 1.
582 auto& table = buildFileTable(fileTableConfig.c_str());
583
584 // Invalid payload length
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600585 oem_ibm::Handler handler;
586 auto response = handler.readFile(requestMsgPtr, 0);
vkaverap5b914c32019-06-30 22:23:54 -0500587 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
588 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
589
590 // Data out of range. File size is 1024, offset = 1024 is invalid.
591 request->offset = 1024;
592
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600593 response = handler.readFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500594 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
595 ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
596
597 // Invalid file handle
598 request->file_handle = 2;
599
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600600 response = handler.readFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500601 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
602 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
603
604 table.clear();
605}
606
607TEST_F(TestFileTable, ReadFileGoodPath)
608{
609 uint32_t fileHandle = 0;
610 uint32_t offset = 0;
611 uint32_t length = 0x4;
612
613 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_READ_FILE_REQ_BYTES>
614 requestMsg{};
615 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
616 auto payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
617 auto request = reinterpret_cast<pldm_read_file_req*>(requestMsg.data() +
618 sizeof(pldm_msg_hdr));
619
620 request->file_handle = fileHandle;
621 request->offset = offset;
622 request->length = length;
623
624 using namespace pldm::filetable;
625 // Initialise the file table with 2 valid file handles 0 & 1.
626 auto& table = buildFileTable(fileTableConfig.c_str());
627 FileEntry value{};
628 value = table.at(fileHandle);
629
630 std::ifstream stream(value.fsPath, std::ios::in | std::ios::binary);
631 stream.seekg(offset);
632 std::vector<char> buffer(length);
633 stream.read(buffer.data(), length);
634
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600635 oem_ibm::Handler handler;
636 auto responseMsg = handler.readFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500637 auto response = reinterpret_cast<pldm_read_file_resp*>(
638 responseMsg.data() + sizeof(pldm_msg_hdr));
639 ASSERT_EQ(response->completion_code, PLDM_SUCCESS);
640 ASSERT_EQ(response->length, length);
641 ASSERT_EQ(0, memcmp(response->file_data, buffer.data(), length));
642
643 // Test condition offset + length > fileSize;
644 size_t fileSize = 1024;
645 request->offset = 1023;
646 request->length = 10;
647
648 stream.seekg(request->offset);
649 buffer.resize(fileSize - request->offset);
650 stream.read(buffer.data(), (fileSize - request->offset));
651
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600652 responseMsg = handler.readFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500653 response = reinterpret_cast<pldm_read_file_resp*>(responseMsg.data() +
654 sizeof(pldm_msg_hdr));
655 ASSERT_EQ(response->completion_code, PLDM_SUCCESS);
656 ASSERT_EQ(response->length, (fileSize - request->offset));
657 ASSERT_EQ(0, memcmp(response->file_data, buffer.data(),
658 (fileSize - request->offset)));
659
660 table.clear();
661}
662
663TEST_F(TestFileTable, WriteFileBadPath)
664{
665 uint32_t fileHandle = 0;
666 uint32_t offset = 0;
667 uint32_t length = 0x10;
668
669 std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
670 PLDM_WRITE_FILE_REQ_BYTES + length);
671 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
672 auto payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
673 auto request = reinterpret_cast<pldm_write_file_req*>(requestMsg.data() +
674 sizeof(pldm_msg_hdr));
675
676 using namespace pldm::filetable;
677 // Initialise the file table with 2 valid file handles 0 & 1.
678 auto& table = buildFileTable(fileTableConfig.c_str());
679
680 request->file_handle = fileHandle;
681 request->offset = offset;
682 request->length = length;
683
684 // Invalid payload length
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600685 oem_ibm::Handler handler;
686 auto response = handler.writeFile(requestMsgPtr, 0);
vkaverap5b914c32019-06-30 22:23:54 -0500687 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
688 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
689
690 // Data out of range. File size is 1024, offset = 1024 is invalid.
691 request->offset = 1024;
692
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600693 response = handler.writeFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500694 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
695 ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
696
697 // Invalid file handle
698 request->file_handle = 2;
699
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600700 response = handler.writeFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500701 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
702 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
703
704 table.clear();
705}
706
707TEST_F(TestFileTable, WriteFileGoodPath)
708{
709 uint32_t fileHandle = 1;
710 uint32_t offset = 0;
711 std::array<uint8_t, 4> fileData = {0x41, 0x42, 0x43, 0x44};
712 uint32_t length = fileData.size();
713
714 std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
715 PLDM_WRITE_FILE_REQ_BYTES + length);
716 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
717 auto payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
718 auto request = reinterpret_cast<pldm_write_file_req*>(requestMsg.data() +
719 sizeof(pldm_msg_hdr));
720
721 using namespace pldm::filetable;
722 // Initialise the file table with 2 valid file handles 0 & 1.
723 auto& table = buildFileTable(fileTableConfig.c_str());
724 FileEntry value{};
725 value = table.at(fileHandle);
726
727 request->file_handle = fileHandle;
728 request->offset = offset;
729 request->length = length;
730 memcpy(request->file_data, fileData.data(), fileData.size());
731
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600732 oem_ibm::Handler handler;
733 auto responseMsg = handler.writeFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500734 auto response = reinterpret_cast<pldm_read_file_resp*>(
735 responseMsg.data() + sizeof(pldm_msg_hdr));
736
737 std::ifstream stream(value.fsPath, std::ios::in | std::ios::binary);
738 stream.seekg(offset);
739 std::vector<char> buffer(length);
740 stream.read(buffer.data(), length);
741
742 ASSERT_EQ(response->completion_code, PLDM_SUCCESS);
743 ASSERT_EQ(response->length, length);
744 ASSERT_EQ(0, memcmp(fileData.data(), buffer.data(), length));
745
746 table.clear();
747}
Sampa Misra854e61f2019-08-22 04:36:47 -0500748
749TEST(writeFileByTypeFromMemory, testBadPath)
750{
751 const auto hdr_size = sizeof(pldm_msg_hdr);
752 std::array<uint8_t, hdr_size + PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES>
753 requestMsg{};
754 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
755 size_t requestPayloadLength = requestMsg.size() - hdr_size;
756 struct pldm_read_write_file_by_type_memory_req* request =
757 reinterpret_cast<struct pldm_read_write_file_by_type_memory_req*>(
758 req->payload);
759 request->file_type = PLDM_FILE_TYPE_PEL;
760 request->file_handle = 0xFFFFFFFF;
761 request->offset = 0;
762 request->length = 17;
763 request->address = 0;
764
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600765 oem_ibm::Handler handler;
766 auto response = handler.writeFileByTypeFromMemory(req, 0);
Sampa Misra854e61f2019-08-22 04:36:47 -0500767 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
768
769 struct pldm_read_write_file_by_type_memory_resp* resp =
770 reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
771 responsePtr->payload);
772 ASSERT_EQ(PLDM_ERROR_INVALID_LENGTH, resp->completion_code);
773
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600774 response = handler.writeFileByTypeFromMemory(req, requestPayloadLength);
Sampa Misra854e61f2019-08-22 04:36:47 -0500775 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
776
777 resp = reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
778 responsePtr->payload);
779 ASSERT_EQ(PLDM_INVALID_WRITE_LENGTH, resp->completion_code);
780}
781
782TEST(getHandlerByType, allPaths)
783{
784 uint32_t fileHandle{};
785 auto handler = getHandlerByType(PLDM_FILE_TYPE_PEL, fileHandle);
786 auto pelType = dynamic_cast<PelHandler*>(handler.get());
787 ASSERT_TRUE(pelType != nullptr);
788
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600789 handler = getHandlerByType(PLDM_FILE_TYPE_LID_PERM, fileHandle);
790 auto lidType = dynamic_cast<LidHandler*>(handler.get());
791 ASSERT_TRUE(lidType != nullptr);
792 pelType = dynamic_cast<PelHandler*>(handler.get());
793 ASSERT_TRUE(pelType == nullptr);
794 handler = getHandlerByType(PLDM_FILE_TYPE_LID_TEMP, fileHandle);
795 lidType = dynamic_cast<LidHandler*>(handler.get());
796 ASSERT_TRUE(lidType != nullptr);
797
Sampa Misra854e61f2019-08-22 04:36:47 -0500798 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
799 ASSERT_THROW(getHandlerByType(0xFFFF, fileHandle), InternalFailure);
800}
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600801
802TEST(readFileByTypeIntoMemory, testBadPath)
803{
804 const auto hdr_size = sizeof(pldm_msg_hdr);
805 std::array<uint8_t, hdr_size + PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES>
806 requestMsg{};
807 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
808 struct pldm_read_write_file_by_type_memory_req* request =
809 reinterpret_cast<struct pldm_read_write_file_by_type_memory_req*>(
810 req->payload);
811 request->file_type = 0xFFFF;
812 request->file_handle = 0;
813 request->offset = 0;
814 request->length = 17;
815 request->address = 0;
816
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600817 oem_ibm::Handler handler;
818 auto response = handler.readFileByTypeIntoMemory(req, 0);
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600819 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
820 struct pldm_read_write_file_by_type_memory_resp* resp =
821 reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
822 responsePtr->payload);
823 ASSERT_EQ(PLDM_ERROR_INVALID_LENGTH, resp->completion_code);
824
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600825 response = handler.readFileByTypeIntoMemory(
826 req, PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES);
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600827 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
828 resp = reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
829 responsePtr->payload);
830 ASSERT_EQ(PLDM_INVALID_WRITE_LENGTH, resp->completion_code);
831
832 request->length = 16;
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600833 response = handler.readFileByTypeIntoMemory(
834 req, PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES);
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600835 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
836 resp = reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
837 responsePtr->payload);
838 ASSERT_EQ(PLDM_INVALID_FILE_TYPE, resp->completion_code);
839}
840
841TEST(readFileByType, testBadPath)
842{
843 const auto hdr_size = sizeof(pldm_msg_hdr);
844 std::array<uint8_t, hdr_size + PLDM_RW_FILE_BY_TYPE_REQ_BYTES> requestMsg{};
845 auto payloadLength = requestMsg.size() - hdr_size;
846 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
847 struct pldm_read_write_file_by_type_req* request =
848 reinterpret_cast<struct pldm_read_write_file_by_type_req*>(
849 req->payload);
850 request->file_type = 0xFFFF;
851 request->file_handle = 0;
852 request->offset = 0;
853 request->length = 13;
854
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600855 oem_ibm::Handler handler;
856 auto response = handler.readFileByType(req, 0);
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600857 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
858 struct pldm_read_write_file_by_type_resp* resp =
859 reinterpret_cast<struct pldm_read_write_file_by_type_resp*>(
860 responsePtr->payload);
861 ASSERT_EQ(PLDM_ERROR_INVALID_LENGTH, resp->completion_code);
862
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600863 response = handler.readFileByType(req, payloadLength);
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600864 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
865 resp = reinterpret_cast<struct pldm_read_write_file_by_type_resp*>(
866 responsePtr->payload);
867 ASSERT_EQ(PLDM_INVALID_FILE_TYPE, resp->completion_code);
868}
869
870TEST(readFileByType, testReadFile)
871{
872 LidHandler handler(0, true);
873 Response response;
874 uint32_t length{};
875
876 auto rc = handler.readFile({}, 0, length, response);
877 ASSERT_EQ(PLDM_INVALID_FILE_HANDLE, rc);
878
879 char tmplt[] = "/tmp/lid.XXXXXX";
880 auto fd = mkstemp(tmplt);
881 std::vector<uint8_t> in = {100, 10, 56, 78, 34, 56, 79, 235, 111};
882 write(fd, in.data(), in.size());
883 close(fd);
884 length = in.size() + 1000;
885 rc = handler.readFile(tmplt, 0, length, response);
886 ASSERT_EQ(rc, PLDM_SUCCESS);
887 ASSERT_EQ(length, in.size());
888 ASSERT_EQ(response.size(), in.size());
889 ASSERT_EQ(std::equal(in.begin(), in.end(), response.begin()), true);
890}