blob: 65998a73a02383a8bd86b1653388b7decd1d554d [file] [log] [blame]
George Liu6492f522020-06-16 10:34:05 +08001#include "libpldm/base.h"
2#include "libpldm/file_io.h"
3
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +05304#include "libpldmresponder/file_io.hpp"
Sampa Misra854e61f2019-08-22 04:36:47 -05005#include "libpldmresponder/file_io_by_type.hpp"
Sampa Misrad823cc02020-03-24 04:53:20 -05006#include "libpldmresponder/file_io_type_cert.hpp"
Sampa Misra18967162020-01-14 02:31:41 -06007#include "libpldmresponder/file_io_type_dump.hpp"
Deepak Kodihalli75e02f82019-11-20 02:51:05 -06008#include "libpldmresponder/file_io_type_lid.hpp"
Sampa Misra854e61f2019-08-22 04:36:47 -05009#include "libpldmresponder/file_io_type_pel.hpp"
Tom Joseph0c6d22c2019-06-26 09:58:41 +053010#include "libpldmresponder/file_table.hpp"
Sampa Misra854e61f2019-08-22 04:36:47 -050011#include "xyz/openbmc_project/Common/error.hpp"
Tom Joseph0c6d22c2019-06-26 09:58:41 +053012
Tom Joseph0c6d22c2019-06-26 09:58:41 +053013#include <nlohmann/json.hpp>
Sampa Misra854e61f2019-08-22 04:36:47 -050014#include <phosphor-logging/elog-errors.hpp>
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +053015
George Liu6492f522020-06-16 10:34:05 +080016#include <filesystem>
17#include <fstream>
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +053018
19#include <gmock/gmock-matchers.h>
20#include <gmock/gmock.h>
21#include <gtest/gtest.h>
Tom Joseph0c6d22c2019-06-26 09:58:41 +053022
Tom Joseph0c6d22c2019-06-26 09:58:41 +053023namespace fs = std::filesystem;
24using Json = nlohmann::json;
25using namespace pldm::filetable;
Deepak Kodihallibc669f12019-11-28 08:52:07 -060026using namespace pldm::responder;
Tom Joseph0c6d22c2019-06-26 09:58:41 +053027
28class TestFileTable : public testing::Test
29{
30 public:
31 void SetUp() override
32 {
33 // Create a temporary directory to hold the config file and files to
34 // populate the file table.
35 char tmppldm[] = "/tmp/pldm_fileio_table.XXXXXX";
36 dir = fs::path(mkdtemp(tmppldm));
37
38 // Copy the sample image files to the directory
39 fs::copy("./files", dir);
40
41 imageFile = dir / "NVRAM-IMAGE";
42 auto jsonObjects = Json::array();
43 auto obj = Json::object();
44 obj["path"] = imageFile.c_str();
45 obj["file_traits"] = 1;
46
47 jsonObjects.push_back(obj);
48 obj.clear();
49 cksumFile = dir / "NVRAM-IMAGE-CKSUM";
50 obj["path"] = cksumFile.c_str();
51 obj["file_traits"] = 4;
52 jsonObjects.push_back(obj);
53
54 fileTableConfig = dir / "configFile.json";
55 std::ofstream file(fileTableConfig.c_str());
56 file << std::setw(4) << jsonObjects << std::endl;
57 }
58
59 void TearDown() override
60 {
61 fs::remove_all(dir);
62 }
63
64 fs::path dir;
65 fs::path imageFile;
66 fs::path cksumFile;
67 fs::path fileTableConfig;
68
69 // <4 bytes - File handle - 0 (0x00 0x00 0x00 0x00)>,
70 // <2 bytes - Filename length - 11 (0x0b 0x00>
71 // <11 bytes - Filename - ASCII for NVRAM-IMAGE>
72 // <4 bytes - File size - 1024 (0x00 0x04 0x00 0x00)>
73 // <4 bytes - File traits - 1 (0x01 0x00 0x00 0x00)>
74 // <4 bytes - File handle - 1 (0x01 0x00 0x00 0x00)>,
75 // <2 bytes - Filename length - 17 (0x11 0x00>
76 // <17 bytes - Filename - ASCII for NVRAM-IMAGE-CKSUM>
77 // <4 bytes - File size - 16 (0x0f 0x00 0x00 0x00)>
78 // <4 bytes - File traits - 4 (0x04 0x00 0x00 0x00)>
79 // No pad bytes added since the length for both the file entries in the
80 // table is 56, which is a multiple of 4.
81 // <4 bytes - Checksum - 2088303182(0x4e 0xfa 0x78 0x7c)>
82 Table attrTable = {
83 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x4e, 0x56, 0x52, 0x41, 0x4d, 0x2d,
84 0x49, 0x4d, 0x41, 0x47, 0x45, 0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00,
85 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x4e, 0x56, 0x52, 0x41, 0x4d,
86 0x2d, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x2d, 0x43, 0x4b, 0x53, 0x55, 0x4d,
87 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x4e, 0xfa, 0x78, 0x7c};
88};
89
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +053090namespace pldm
91{
92
93namespace responder
94{
95
96namespace dma
97{
98
99class MockDMA
100{
101 public:
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600102 MOCK_METHOD5(transferDataHost, int(int fd, uint32_t offset, uint32_t length,
103 uint64_t address, bool upstream));
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530104};
105
106} // namespace dma
107} // namespace responder
108} // namespace pldm
109using namespace pldm::responder;
110using ::testing::_;
111using ::testing::Return;
112
113TEST(TransferDataHost, GoodPath)
114{
115 using namespace pldm::responder::dma;
116
117 MockDMA dmaObj;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600118 char tmpfile[] = "/tmp/pldm_fileio_table.XXXXXX";
119 int fd = mkstemp(tmpfile);
120 close(fd);
121 fs::path path(tmpfile);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530122
123 // Minimum length of 16 and expect transferDataHost to be called once
124 // returns the default value of 0 (the return type of transferDataHost is
125 // int, the default value for int is 0)
126 uint32_t length = minSize;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600127 EXPECT_CALL(dmaObj, transferDataHost(_, 0, length, 0, true)).Times(1);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530128 auto response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530129 path, 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530130 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
131 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
132 ASSERT_EQ(0, memcmp(responsePtr->payload + sizeof(responsePtr->payload[0]),
133 &length, sizeof(length)));
134
135 // maxsize of DMA
136 length = maxSize;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600137 EXPECT_CALL(dmaObj, transferDataHost(_, 0, length, 0, true)).Times(1);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530138 response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY, path,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530139 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530140 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
141 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
142 ASSERT_EQ(0, memcmp(responsePtr->payload + sizeof(responsePtr->payload[0]),
143 &length, sizeof(length)));
144
145 // length greater than maxsize of DMA
146 length = maxSize + minSize;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600147 EXPECT_CALL(dmaObj, transferDataHost(_, 0, maxSize, 0, true)).Times(1);
148 EXPECT_CALL(dmaObj, transferDataHost(_, maxSize, minSize, maxSize, true))
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530149 .Times(1);
150 response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY, path,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530151 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530152 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
153 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
154 ASSERT_EQ(0, memcmp(responsePtr->payload + sizeof(responsePtr->payload[0]),
155 &length, sizeof(length)));
156
157 // length greater than 2*maxsize of DMA
158 length = 3 * maxSize;
159 EXPECT_CALL(dmaObj, transferDataHost(_, _, _, _, true)).Times(3);
160 response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY, path,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530161 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530162 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
163 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
164 ASSERT_EQ(0, memcmp(responsePtr->payload + sizeof(responsePtr->payload[0]),
165 &length, sizeof(length)));
166
167 // check for downstream(copy data from host to BMC) parameter
168 length = minSize;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600169 EXPECT_CALL(dmaObj, transferDataHost(_, 0, length, 0, false)).Times(1);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530170 response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY, path,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530171 0, length, 0, false, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530172 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
173 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
174 ASSERT_EQ(0, memcmp(responsePtr->payload + sizeof(responsePtr->payload[0]),
175 &length, sizeof(length)));
176}
177
178TEST(TransferDataHost, BadPath)
179{
180 using namespace pldm::responder::dma;
181
182 MockDMA dmaObj;
Deepak Kodihalli15211b42019-12-14 02:24:49 -0600183 char tmpfile[] = "/tmp/pldm_fileio_table.XXXXXX";
184 int fd = mkstemp(tmpfile);
185 close(fd);
186 fs::path path(tmpfile);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530187
188 // Minimum length of 16 and transferDataHost returning a negative errno
189 uint32_t length = minSize;
190 EXPECT_CALL(dmaObj, transferDataHost(_, _, _, _, _)).WillOnce(Return(-1));
191 auto response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530192 path, 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530193 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
194 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR);
195
196 // length greater than maxsize of DMA and transferDataHost returning a
197 // negative errno
198 length = maxSize + minSize;
199 EXPECT_CALL(dmaObj, transferDataHost(_, _, _, _, _)).WillOnce(Return(-1));
200 response = transferAll<MockDMA>(&dmaObj, PLDM_READ_FILE_INTO_MEMORY, path,
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530201 0, length, 0, true, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530202 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
203 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR);
204}
205
206TEST(ReadFileIntoMemory, BadPath)
207{
208 uint32_t fileHandle = 0;
209 uint32_t offset = 0;
210 uint32_t length = 10;
211 uint64_t address = 0;
212
Jinu Joy Thomasf666db12019-05-29 05:22:31 -0500213 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
214 requestMsg{};
215 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
216 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
217 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
218 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530219 sizeof(length));
Jinu Joy Thomasf666db12019-05-29 05:22:31 -0500220 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530221 sizeof(length),
222 &address, sizeof(address));
223
224 // Pass invalid payload length
Sampa Misraaea5dde2020-08-31 08:33:47 -0500225 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
226 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600227 auto response = handler.readFileIntoMemory(request, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530228 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
229 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
230}
231
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530232TEST_F(TestFileTable, ReadFileInvalidFileHandle)
233{
234 // Invalid file handle in the file table
235 uint32_t fileHandle = 2;
236 uint32_t offset = 0;
237 uint32_t length = 0;
238 uint64_t address = 0;
239
240 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
241 requestMsg{};
242 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
243 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
244 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
245 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
246 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
247 sizeof(length));
248 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
249 sizeof(length),
250 &address, sizeof(address));
251
252 using namespace pldm::filetable;
253 // Initialise the file table with 2 valid file handles 0 & 1.
254 auto& table = buildFileTable(fileTableConfig.c_str());
255
Sampa Misraaea5dde2020-08-31 08:33:47 -0500256 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
257 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600258 auto response = handler.readFileIntoMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530259 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
260 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
261 // Clear the file table contents.
262 table.clear();
263}
264
265TEST_F(TestFileTable, ReadFileInvalidOffset)
266{
267 uint32_t fileHandle = 0;
268 // The file size is 1024, so the offset is invalid
269 uint32_t offset = 1024;
270 uint32_t length = 0;
271 uint64_t address = 0;
272
273 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
274 requestMsg{};
275 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
276 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
277 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
278 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
279 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
280 sizeof(length));
281 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
282 sizeof(length),
283 &address, sizeof(address));
284
285 using namespace pldm::filetable;
286 auto& table = buildFileTable(fileTableConfig.c_str());
287
Sampa Misraaea5dde2020-08-31 08:33:47 -0500288 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
289 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600290 auto response = handler.readFileIntoMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530291 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
292 ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
293 // Clear the file table contents.
294 table.clear();
295}
296
297TEST_F(TestFileTable, ReadFileInvalidLength)
298{
299 uint32_t fileHandle = 0;
300 uint32_t offset = 100;
301 // Length should be a multiple of dma min size(16)
302 uint32_t length = 10;
303 uint64_t address = 0;
304
305 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
306 requestMsg{};
307 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
308 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
309 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
310 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
311 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
312 sizeof(length));
313 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
314 sizeof(length),
315 &address, sizeof(address));
316
317 using namespace pldm::filetable;
318 auto& table = buildFileTable(fileTableConfig.c_str());
319
Sampa Misraaea5dde2020-08-31 08:33:47 -0500320 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
321 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600322 auto response = handler.readFileIntoMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530323 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
Deepak Kodihalli3bf5c552020-04-20 06:16:01 -0500324 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530325 // Clear the file table contents.
326 table.clear();
327}
328
329TEST_F(TestFileTable, ReadFileInvalidEffectiveLength)
330{
331 uint32_t fileHandle = 0;
332 // valid offset
333 uint32_t offset = 100;
334 // length + offset exceeds the size, so effective length is
335 // filesize(1024) - offset(100). The effective length is not a multiple of
336 // DMA min size(16)
337 uint32_t length = 1024;
338 uint64_t address = 0;
339
340 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
341 requestMsg{};
342 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
343 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
344 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
345 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
346 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
347 sizeof(length));
348 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
349 sizeof(length),
350 &address, sizeof(address));
351
352 using namespace pldm::filetable;
353 auto& table = buildFileTable(fileTableConfig.c_str());
354
Sampa Misraaea5dde2020-08-31 08:33:47 -0500355 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
356 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600357 auto response = handler.readFileIntoMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530358 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
Deepak Kodihalli3bf5c552020-04-20 06:16:01 -0500359 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530360 // Clear the file table contents.
361 table.clear();
362}
363
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530364TEST(WriteFileFromMemory, BadPath)
365{
366 uint32_t fileHandle = 0;
367 uint32_t offset = 0;
368 uint32_t length = 10;
369 uint64_t address = 0;
370
Jinu Joy Thomasf666db12019-05-29 05:22:31 -0500371 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
372 requestMsg{};
373 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
374 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
375 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
376 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
377 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530378 sizeof(length));
Jinu Joy Thomasf666db12019-05-29 05:22:31 -0500379 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530380 sizeof(length),
381 &address, sizeof(address));
382
383 // Pass invalid payload length
Sampa Misraaea5dde2020-08-31 08:33:47 -0500384 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
385 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600386 auto response = handler.writeFileFromMemory(request, 0);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530387 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
388 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
389
390 // The length field is not a multiple of DMA minsize
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600391 response = handler.writeFileFromMemory(request, requestPayloadLength);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530392 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
Deepak Kodihalli3bf5c552020-04-20 06:16:01 -0500393 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
Jinu Joy Thomas7f57f442019-06-13 20:38:49 +0530394}
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530395
396TEST_F(TestFileTable, WriteFileInvalidFileHandle)
397{
398 // Invalid file handle in the file table
399 uint32_t fileHandle = 2;
400 uint32_t offset = 0;
401 uint32_t length = 16;
402 uint64_t address = 0;
403
404 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
405 requestMsg{};
406 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
407 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
408 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
409 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
410 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
411 sizeof(length));
412 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
413 sizeof(length),
414 &address, sizeof(address));
415
416 using namespace pldm::filetable;
417 // Initialise the file table with 2 valid file handles 0 & 1.
418 auto& table = buildFileTable(fileTableConfig.c_str());
419
Sampa Misraaea5dde2020-08-31 08:33:47 -0500420 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
421 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600422 auto response = handler.writeFileFromMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530423 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
424 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
425 // Clear the file table contents.
426 table.clear();
427}
428
429TEST_F(TestFileTable, WriteFileInvalidOffset)
430{
431 uint32_t fileHandle = 0;
432 // The file size is 1024, so the offset is invalid
433 uint32_t offset = 1024;
434 uint32_t length = 16;
435 uint64_t address = 0;
436
437 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
438 requestMsg{};
439 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
440 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
441 memcpy(request->payload, &fileHandle, sizeof(fileHandle));
442 memcpy(request->payload + sizeof(fileHandle), &offset, sizeof(offset));
443 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset), &length,
444 sizeof(length));
445 memcpy(request->payload + sizeof(fileHandle) + sizeof(offset) +
446 sizeof(length),
447 &address, sizeof(address));
448
449 using namespace pldm::filetable;
450 // Initialise the file table with 2 valid file handles 0 & 1.
451 auto& table = buildFileTable(TestFileTable::fileTableConfig.c_str());
452
Sampa Misraaea5dde2020-08-31 08:33:47 -0500453 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
454 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600455 auto response = handler.writeFileFromMemory(request, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530456 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
457 ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
458 // Clear the file table contents.
459 table.clear();
460}
461
462TEST(FileTable, ConfigNotExist)
463{
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530464 FileTable tableObj("");
John Wang881cde12019-10-24 15:08:48 +0800465 EXPECT_EQ(tableObj.isEmpty(), true);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530466}
467
468TEST_F(TestFileTable, ValidateFileEntry)
469{
470 FileTable tableObj(fileTableConfig.c_str());
471
472 // Test file handle 0, the file size is 1K bytes.
473 auto value = tableObj.at(0);
474 ASSERT_EQ(value.handle, 0);
475 ASSERT_EQ(strcmp(value.fsPath.c_str(), imageFile.c_str()), 0);
476 ASSERT_EQ(static_cast<uint32_t>(fs::file_size(value.fsPath)), 1024);
477 ASSERT_EQ(value.traits.value, 1);
478 ASSERT_EQ(true, fs::exists(value.fsPath));
479
480 // Test file handle 1, the file size is 16 bytes
481 auto value1 = tableObj.at(1);
482 ASSERT_EQ(value1.handle, 1);
483 ASSERT_EQ(strcmp(value1.fsPath.c_str(), cksumFile.c_str()), 0);
484 ASSERT_EQ(static_cast<uint32_t>(fs::file_size(value1.fsPath)), 16);
485 ASSERT_EQ(value1.traits.value, 4);
486 ASSERT_EQ(true, fs::exists(value1.fsPath));
487
488 // Test invalid file handle
489 ASSERT_THROW(tableObj.at(2), std::out_of_range);
490}
491
492TEST_F(TestFileTable, ValidateFileTable)
493{
494 FileTable tableObj(fileTableConfig.c_str());
495
496 // Validate file attribute table
497 auto table = tableObj();
498 ASSERT_EQ(true,
499 std::equal(attrTable.begin(), attrTable.end(), table.begin()));
500}
501
502TEST_F(TestFileTable, GetFileTableCommand)
503{
504 // Initialise the file table with a valid handle of 0 & 1
505 auto& table = buildFileTable(fileTableConfig.c_str());
506
507 uint32_t transferHandle = 0;
508 uint8_t opFlag = 0;
509 uint8_t type = PLDM_FILE_ATTRIBUTE_TABLE;
510 uint32_t nextTransferHandle = 0;
511 uint8_t transferFlag = PLDM_START_AND_END;
512
513 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_FILE_TABLE_REQ_BYTES>
514 requestMsg{};
515 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
516 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
517 auto request = reinterpret_cast<pldm_get_file_table_req*>(
518 requestMsg.data() + sizeof(pldm_msg_hdr));
519 request->transfer_handle = transferHandle;
520 request->operation_flag = opFlag;
521 request->table_type = type;
522
Sampa Misraaea5dde2020-08-31 08:33:47 -0500523 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
524 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600525 auto response = handler.getFileTable(requestMsgPtr, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530526 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
527 ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
528 size_t offsetSize = sizeof(responsePtr->payload[0]);
529 ASSERT_EQ(0, memcmp(responsePtr->payload + offsetSize, &nextTransferHandle,
530 sizeof(nextTransferHandle)));
531 offsetSize += sizeof(nextTransferHandle);
532 ASSERT_EQ(0, memcmp(responsePtr->payload + offsetSize, &transferFlag,
533 sizeof(transferFlag)));
534 offsetSize += sizeof(transferFlag);
535 ASSERT_EQ(0, memcmp(responsePtr->payload + offsetSize, attrTable.data(),
536 attrTable.size()));
537 table.clear();
538}
539
540TEST_F(TestFileTable, GetFileTableCommandReqLengthMismatch)
541{
542 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_FILE_TABLE_REQ_BYTES>
543 requestMsg{};
544 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
545
546 // Pass invalid command payload length
Sampa Misraaea5dde2020-08-31 08:33:47 -0500547 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
548 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600549 auto response = handler.getFileTable(request, 0);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530550 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
551 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
552}
553
554TEST_F(TestFileTable, GetFileTableCommandOEMAttrTable)
555{
556 uint32_t transferHandle = 0;
557 uint8_t opFlag = 0;
558 uint8_t type = PLDM_OEM_FILE_ATTRIBUTE_TABLE;
559
560 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_FILE_TABLE_REQ_BYTES>
561 requestMsg{};
562 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
563 size_t requestPayloadLength = requestMsg.size() - sizeof(pldm_msg_hdr);
564 auto request = reinterpret_cast<pldm_get_file_table_req*>(
565 requestMsg.data() + sizeof(pldm_msg_hdr));
566 request->transfer_handle = transferHandle;
567 request->operation_flag = opFlag;
568 request->table_type = type;
569
Sampa Misraaea5dde2020-08-31 08:33:47 -0500570 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
571 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600572 auto response = handler.getFileTable(requestMsgPtr, requestPayloadLength);
Tom Joseph0c6d22c2019-06-26 09:58:41 +0530573 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
574 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_TABLE_TYPE);
575}
vkaverap5b914c32019-06-30 22:23:54 -0500576
577TEST_F(TestFileTable, ReadFileBadPath)
578{
579 uint32_t fileHandle = 1;
580 uint32_t offset = 0;
581 uint32_t length = 0x4;
582
583 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_READ_FILE_REQ_BYTES>
584 requestMsg{};
585 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
586 auto payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
587 auto request = reinterpret_cast<pldm_read_file_req*>(requestMsg.data() +
588 sizeof(pldm_msg_hdr));
589
590 request->file_handle = fileHandle;
591 request->offset = offset;
592 request->length = length;
593
594 using namespace pldm::filetable;
595 // Initialise the file table with 2 valid file handles 0 & 1.
596 auto& table = buildFileTable(fileTableConfig.c_str());
597
598 // Invalid payload length
Sampa Misraaea5dde2020-08-31 08:33:47 -0500599 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
600 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600601 auto response = handler.readFile(requestMsgPtr, 0);
vkaverap5b914c32019-06-30 22:23:54 -0500602 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
603 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
604
605 // Data out of range. File size is 1024, offset = 1024 is invalid.
606 request->offset = 1024;
607
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600608 response = handler.readFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500609 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
610 ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
611
612 // Invalid file handle
613 request->file_handle = 2;
614
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600615 response = handler.readFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500616 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
617 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
618
619 table.clear();
620}
621
622TEST_F(TestFileTable, ReadFileGoodPath)
623{
624 uint32_t fileHandle = 0;
625 uint32_t offset = 0;
626 uint32_t length = 0x4;
627
628 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_READ_FILE_REQ_BYTES>
629 requestMsg{};
630 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
631 auto payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
632 auto request = reinterpret_cast<pldm_read_file_req*>(requestMsg.data() +
633 sizeof(pldm_msg_hdr));
634
635 request->file_handle = fileHandle;
636 request->offset = offset;
637 request->length = length;
638
639 using namespace pldm::filetable;
640 // Initialise the file table with 2 valid file handles 0 & 1.
641 auto& table = buildFileTable(fileTableConfig.c_str());
642 FileEntry value{};
643 value = table.at(fileHandle);
644
645 std::ifstream stream(value.fsPath, std::ios::in | std::ios::binary);
646 stream.seekg(offset);
647 std::vector<char> buffer(length);
648 stream.read(buffer.data(), length);
649
Sampa Misraaea5dde2020-08-31 08:33:47 -0500650 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
651 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600652 auto responseMsg = handler.readFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500653 auto response = reinterpret_cast<pldm_read_file_resp*>(
654 responseMsg.data() + sizeof(pldm_msg_hdr));
655 ASSERT_EQ(response->completion_code, PLDM_SUCCESS);
656 ASSERT_EQ(response->length, length);
657 ASSERT_EQ(0, memcmp(response->file_data, buffer.data(), length));
658
659 // Test condition offset + length > fileSize;
660 size_t fileSize = 1024;
661 request->offset = 1023;
662 request->length = 10;
663
664 stream.seekg(request->offset);
665 buffer.resize(fileSize - request->offset);
666 stream.read(buffer.data(), (fileSize - request->offset));
667
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600668 responseMsg = handler.readFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500669 response = reinterpret_cast<pldm_read_file_resp*>(responseMsg.data() +
670 sizeof(pldm_msg_hdr));
671 ASSERT_EQ(response->completion_code, PLDM_SUCCESS);
672 ASSERT_EQ(response->length, (fileSize - request->offset));
673 ASSERT_EQ(0, memcmp(response->file_data, buffer.data(),
674 (fileSize - request->offset)));
675
676 table.clear();
677}
678
679TEST_F(TestFileTable, WriteFileBadPath)
680{
681 uint32_t fileHandle = 0;
682 uint32_t offset = 0;
683 uint32_t length = 0x10;
684
685 std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
686 PLDM_WRITE_FILE_REQ_BYTES + length);
687 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
688 auto payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
689 auto request = reinterpret_cast<pldm_write_file_req*>(requestMsg.data() +
690 sizeof(pldm_msg_hdr));
691
692 using namespace pldm::filetable;
693 // Initialise the file table with 2 valid file handles 0 & 1.
694 auto& table = buildFileTable(fileTableConfig.c_str());
695
696 request->file_handle = fileHandle;
697 request->offset = offset;
698 request->length = length;
699
700 // Invalid payload length
Sampa Misraaea5dde2020-08-31 08:33:47 -0500701 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
702 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600703 auto response = handler.writeFile(requestMsgPtr, 0);
vkaverap5b914c32019-06-30 22:23:54 -0500704 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
705 ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
706
707 // Data out of range. File size is 1024, offset = 1024 is invalid.
708 request->offset = 1024;
709
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600710 response = handler.writeFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500711 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
712 ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
713
714 // Invalid file handle
715 request->file_handle = 2;
716
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600717 response = handler.writeFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500718 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
719 ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
720
721 table.clear();
722}
723
724TEST_F(TestFileTable, WriteFileGoodPath)
725{
726 uint32_t fileHandle = 1;
727 uint32_t offset = 0;
728 std::array<uint8_t, 4> fileData = {0x41, 0x42, 0x43, 0x44};
729 uint32_t length = fileData.size();
730
731 std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) +
732 PLDM_WRITE_FILE_REQ_BYTES + length);
733 auto requestMsgPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
734 auto payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
735 auto request = reinterpret_cast<pldm_write_file_req*>(requestMsg.data() +
736 sizeof(pldm_msg_hdr));
737
738 using namespace pldm::filetable;
739 // Initialise the file table with 2 valid file handles 0 & 1.
740 auto& table = buildFileTable(fileTableConfig.c_str());
741 FileEntry value{};
742 value = table.at(fileHandle);
743
744 request->file_handle = fileHandle;
745 request->offset = offset;
746 request->length = length;
747 memcpy(request->file_data, fileData.data(), fileData.size());
748
Sampa Misraaea5dde2020-08-31 08:33:47 -0500749 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
750 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600751 auto responseMsg = handler.writeFile(requestMsgPtr, payload_length);
vkaverap5b914c32019-06-30 22:23:54 -0500752 auto response = reinterpret_cast<pldm_read_file_resp*>(
753 responseMsg.data() + sizeof(pldm_msg_hdr));
754
755 std::ifstream stream(value.fsPath, std::ios::in | std::ios::binary);
756 stream.seekg(offset);
757 std::vector<char> buffer(length);
758 stream.read(buffer.data(), length);
759
760 ASSERT_EQ(response->completion_code, PLDM_SUCCESS);
761 ASSERT_EQ(response->length, length);
762 ASSERT_EQ(0, memcmp(fileData.data(), buffer.data(), length));
763
764 table.clear();
765}
Sampa Misra854e61f2019-08-22 04:36:47 -0500766
767TEST(writeFileByTypeFromMemory, testBadPath)
768{
769 const auto hdr_size = sizeof(pldm_msg_hdr);
770 std::array<uint8_t, hdr_size + PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES>
771 requestMsg{};
772 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
773 size_t requestPayloadLength = requestMsg.size() - hdr_size;
774 struct pldm_read_write_file_by_type_memory_req* request =
775 reinterpret_cast<struct pldm_read_write_file_by_type_memory_req*>(
776 req->payload);
777 request->file_type = PLDM_FILE_TYPE_PEL;
778 request->file_handle = 0xFFFFFFFF;
779 request->offset = 0;
780 request->length = 17;
781 request->address = 0;
782
Sampa Misraaea5dde2020-08-31 08:33:47 -0500783 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
784 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600785 auto response = handler.writeFileByTypeFromMemory(req, 0);
Sampa Misra854e61f2019-08-22 04:36:47 -0500786 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
787
788 struct pldm_read_write_file_by_type_memory_resp* resp =
789 reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
790 responsePtr->payload);
791 ASSERT_EQ(PLDM_ERROR_INVALID_LENGTH, resp->completion_code);
792
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600793 response = handler.writeFileByTypeFromMemory(req, requestPayloadLength);
Sampa Misra854e61f2019-08-22 04:36:47 -0500794 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
795
796 resp = reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
797 responsePtr->payload);
Deepak Kodihalli3bf5c552020-04-20 06:16:01 -0500798 ASSERT_EQ(PLDM_ERROR_INVALID_LENGTH, resp->completion_code);
Sampa Misra854e61f2019-08-22 04:36:47 -0500799}
800
801TEST(getHandlerByType, allPaths)
802{
803 uint32_t fileHandle{};
804 auto handler = getHandlerByType(PLDM_FILE_TYPE_PEL, fileHandle);
805 auto pelType = dynamic_cast<PelHandler*>(handler.get());
806 ASSERT_TRUE(pelType != nullptr);
807
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600808 handler = getHandlerByType(PLDM_FILE_TYPE_LID_PERM, fileHandle);
809 auto lidType = dynamic_cast<LidHandler*>(handler.get());
810 ASSERT_TRUE(lidType != nullptr);
811 pelType = dynamic_cast<PelHandler*>(handler.get());
812 ASSERT_TRUE(pelType == nullptr);
813 handler = getHandlerByType(PLDM_FILE_TYPE_LID_TEMP, fileHandle);
814 lidType = dynamic_cast<LidHandler*>(handler.get());
815 ASSERT_TRUE(lidType != nullptr);
816
Sampa Misra18967162020-01-14 02:31:41 -0600817 handler = getHandlerByType(PLDM_FILE_TYPE_DUMP, fileHandle);
818 auto dumpType = dynamic_cast<DumpHandler*>(handler.get());
819 ASSERT_TRUE(dumpType != nullptr);
820
Sampa Misrad823cc02020-03-24 04:53:20 -0500821 handler = getHandlerByType(PLDM_FILE_TYPE_CERT_SIGNING_REQUEST, fileHandle);
822 auto certType = dynamic_cast<CertHandler*>(handler.get());
823 ASSERT_TRUE(certType != nullptr);
824
825 handler = getHandlerByType(PLDM_FILE_TYPE_SIGNED_CERT, fileHandle);
826 certType = dynamic_cast<CertHandler*>(handler.get());
827 ASSERT_TRUE(certType != nullptr);
828
829 handler = getHandlerByType(PLDM_FILE_TYPE_ROOT_CERT, fileHandle);
830 certType = dynamic_cast<CertHandler*>(handler.get());
831 ASSERT_TRUE(certType != nullptr);
832
Sampa Misra854e61f2019-08-22 04:36:47 -0500833 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
834 ASSERT_THROW(getHandlerByType(0xFFFF, fileHandle), InternalFailure);
835}
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600836
837TEST(readFileByTypeIntoMemory, testBadPath)
838{
839 const auto hdr_size = sizeof(pldm_msg_hdr);
840 std::array<uint8_t, hdr_size + PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES>
841 requestMsg{};
842 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
843 struct pldm_read_write_file_by_type_memory_req* request =
844 reinterpret_cast<struct pldm_read_write_file_by_type_memory_req*>(
845 req->payload);
846 request->file_type = 0xFFFF;
847 request->file_handle = 0;
848 request->offset = 0;
849 request->length = 17;
850 request->address = 0;
851
Sampa Misraaea5dde2020-08-31 08:33:47 -0500852 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
853 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600854 auto response = handler.readFileByTypeIntoMemory(req, 0);
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600855 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
856 struct pldm_read_write_file_by_type_memory_resp* resp =
857 reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
858 responsePtr->payload);
859 ASSERT_EQ(PLDM_ERROR_INVALID_LENGTH, resp->completion_code);
860
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600861 response = handler.readFileByTypeIntoMemory(
862 req, PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES);
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600863 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
864 resp = reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
865 responsePtr->payload);
Deepak Kodihalli3bf5c552020-04-20 06:16:01 -0500866 ASSERT_EQ(PLDM_ERROR_INVALID_LENGTH, resp->completion_code);
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600867
868 request->length = 16;
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600869 response = handler.readFileByTypeIntoMemory(
870 req, PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES);
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600871 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
872 resp = reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
873 responsePtr->payload);
874 ASSERT_EQ(PLDM_INVALID_FILE_TYPE, resp->completion_code);
875}
876
877TEST(readFileByType, testBadPath)
878{
879 const auto hdr_size = sizeof(pldm_msg_hdr);
880 std::array<uint8_t, hdr_size + PLDM_RW_FILE_BY_TYPE_REQ_BYTES> requestMsg{};
881 auto payloadLength = requestMsg.size() - hdr_size;
882 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
883 struct pldm_read_write_file_by_type_req* request =
884 reinterpret_cast<struct pldm_read_write_file_by_type_req*>(
885 req->payload);
886 request->file_type = 0xFFFF;
887 request->file_handle = 0;
888 request->offset = 0;
889 request->length = 13;
890
Sampa Misraaea5dde2020-08-31 08:33:47 -0500891 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
892 oem_ibm::Handler handler(oemPlatformHandler.get());
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600893 auto response = handler.readFileByType(req, 0);
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600894 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
895 struct pldm_read_write_file_by_type_resp* resp =
896 reinterpret_cast<struct pldm_read_write_file_by_type_resp*>(
897 responsePtr->payload);
898 ASSERT_EQ(PLDM_ERROR_INVALID_LENGTH, resp->completion_code);
899
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600900 response = handler.readFileByType(req, payloadLength);
Deepak Kodihalli75e02f82019-11-20 02:51:05 -0600901 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
902 resp = reinterpret_cast<struct pldm_read_write_file_by_type_resp*>(
903 responsePtr->payload);
904 ASSERT_EQ(PLDM_INVALID_FILE_TYPE, resp->completion_code);
905}
906
907TEST(readFileByType, testReadFile)
908{
909 LidHandler handler(0, true);
910 Response response;
911 uint32_t length{};
912
913 auto rc = handler.readFile({}, 0, length, response);
914 ASSERT_EQ(PLDM_INVALID_FILE_HANDLE, rc);
915
916 char tmplt[] = "/tmp/lid.XXXXXX";
917 auto fd = mkstemp(tmplt);
918 std::vector<uint8_t> in = {100, 10, 56, 78, 34, 56, 79, 235, 111};
919 write(fd, in.data(), in.size());
920 close(fd);
921 length = in.size() + 1000;
922 rc = handler.readFile(tmplt, 0, length, response);
923 ASSERT_EQ(rc, PLDM_SUCCESS);
924 ASSERT_EQ(length, in.size());
925 ASSERT_EQ(response.size(), in.size());
926 ASSERT_EQ(std::equal(in.begin(), in.end(), response.begin()), true);
927}