xref: /openbmc/libpldm/tests/oem/meta/fileio.cpp (revision 48761c62)
1 /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
2 #include <endian.h>
3 #include <libpldm/oem/meta/file_io.h>
4 
5 #include "msgbuf.h"
6 
7 #include <gtest/gtest.h>
8 
9 static constexpr size_t oemMetaDecodeWriteFileIoReqBytes = 9;
10 static constexpr size_t postCodeSize = 4;
11 static constexpr size_t invalidDataSize = 0;
12 
TEST(DecodeOemMetaFileIoReq,testGoodDecodeRequest)13 TEST(DecodeOemMetaFileIoReq, testGoodDecodeRequest)
14 {
15     struct pldm_msgbuf _ctx;
16     struct pldm_msgbuf* ctx = &_ctx;
17     uint8_t fileHandle = 0x00;
18     int32_t dataLengthLE = 0x04;
19     uint8_t postCode[4] = {0x93, 0xe0, 0x00, 0xea};
20 
21     constexpr auto hdrSize = sizeof(pldm_msg_hdr);
22 
23     uint8_t buf[hdrSize + sizeof(uint8_t) + sizeof(int32_t) +
24                 (postCodeSize * sizeof(uint8_t))] = {};
25 
26     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, &buf[hdrSize], sizeof(buf) - hdrSize),
27               0);
28 
29     pldm_msgbuf_insert_uint8(ctx, fileHandle);
30     pldm_msgbuf_insert_int32(ctx, dataLengthLE);
31     pldm_msgbuf_insert_array_uint8(ctx, postCode, sizeof(postCode));
32 
33     std::array<uint8_t, oemMetaDecodeWriteFileIoReqBytes> retDataField{};
34 
35     uint8_t retfileHandle = 0;
36     uint32_t retFileDataCnt = 0;
37 
38     auto request = reinterpret_cast<pldm_msg*>(buf);
39 
40     auto rc = decode_oem_meta_file_io_req(request, sizeof(buf) - hdrSize,
41                                           &retfileHandle, &retFileDataCnt,
42                                           retDataField.data());
43 
44     EXPECT_EQ(rc, PLDM_SUCCESS);
45     EXPECT_EQ(retfileHandle, fileHandle);
46     EXPECT_EQ(retFileDataCnt, dataLengthLE);
47     EXPECT_EQ(retDataField[0], postCode[0]);
48     EXPECT_EQ(retDataField[1], postCode[1]);
49     EXPECT_EQ(retDataField[2], postCode[2]);
50     EXPECT_EQ(retDataField[3], postCode[3]);
51 }
52 
TEST(DecodeOemMetaFileIoReq,testInvalidFieldsDecodeRequest)53 TEST(DecodeOemMetaFileIoReq, testInvalidFieldsDecodeRequest)
54 {
55     std::array<uint8_t, oemMetaDecodeWriteFileIoReqBytes> requestMsg{};
56     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
57 
58     auto rc = decode_oem_meta_file_io_req(request, requestMsg.size(), NULL,
59                                           NULL, NULL);
60 
61     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
62 }
63 
TEST(DecodeOemMetaFileIoReq,testInvalidLengthDecodeRequest)64 TEST(DecodeOemMetaFileIoReq, testInvalidLengthDecodeRequest)
65 {
66     uint8_t retfileHandle = 0;
67     uint32_t retFileDataCnt = 0;
68     uint8_t buf[1] = {};
69     std::array<uint8_t, oemMetaDecodeWriteFileIoReqBytes> retDataField{};
70 
71     auto request = reinterpret_cast<pldm_msg*>(buf);
72 
73     auto rc = decode_oem_meta_file_io_req(request, 0, &retfileHandle,
74                                           &retFileDataCnt, retDataField.data());
75 
76     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
77 }
78 
TEST(DecodeOemMetaFileIoReq,testInvalidDataRequest)79 TEST(DecodeOemMetaFileIoReq, testInvalidDataRequest)
80 {
81     uint8_t buf[1] = {};
82     uint8_t retfileHandle = 0;
83     uint32_t retFileDataCnt = 0;
84 
85     std::array<uint8_t, invalidDataSize> retDataField{};
86 
87     auto request = reinterpret_cast<pldm_msg*>(buf);
88 
89     auto rc = decode_oem_meta_file_io_req(request, sizeof(buf), &retfileHandle,
90                                           &retFileDataCnt, retDataField.data());
91 
92     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
93 }
94