xref: /openbmc/libpldm/tests/oem/meta/fileio.cpp (revision 615344fc)
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 
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     int rc;
21 
22     constexpr auto hdrSize = sizeof(pldm_msg_hdr);
23 
24     uint8_t buf[hdrSize + sizeof(uint8_t) + sizeof(int32_t) +
25                 (postCodeSize * sizeof(uint8_t))] = {};
26 
27     ASSERT_EQ(pldm_msgbuf_init_cc(ctx, 0, &buf[hdrSize], sizeof(buf) - hdrSize),
28               0);
29 
30     pldm_msgbuf_insert_uint8(ctx, fileHandle);
31     pldm_msgbuf_insert_int32(ctx, dataLengthLE);
32     rc = pldm_msgbuf_insert_array_uint8(ctx, sizeof(postCode), postCode,
33                                         sizeof(postCode));
34     ASSERT_EQ(rc, PLDM_SUCCESS);
35 
36     std::array<uint8_t, oemMetaDecodeWriteFileIoReqBytes> retDataField{};
37 
38     uint8_t retfileHandle = 0;
39     uint32_t retFileDataCnt = 0;
40 
41     auto request = reinterpret_cast<pldm_msg*>(buf);
42 
43     rc = decode_oem_meta_file_io_req(request, sizeof(buf) - hdrSize,
44                                      &retfileHandle, &retFileDataCnt,
45                                      retDataField.data());
46 
47     ASSERT_EQ(rc, PLDM_SUCCESS);
48     EXPECT_EQ(retfileHandle, fileHandle);
49     EXPECT_EQ(retFileDataCnt, dataLengthLE);
50     EXPECT_EQ(retDataField[0], postCode[0]);
51     EXPECT_EQ(retDataField[1], postCode[1]);
52     EXPECT_EQ(retDataField[2], postCode[2]);
53     EXPECT_EQ(retDataField[3], postCode[3]);
54 }
55 
56 TEST(DecodeOemMetaFileIoReq, testInvalidFieldsDecodeRequest)
57 {
58     std::array<uint8_t, oemMetaDecodeWriteFileIoReqBytes> requestMsg{};
59     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
60 
61     auto rc = decode_oem_meta_file_io_req(request, requestMsg.size(), NULL,
62                                           NULL, NULL);
63 
64     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
65 }
66 
67 TEST(DecodeOemMetaFileIoReq, testInvalidLengthDecodeRequest)
68 {
69     uint8_t retfileHandle = 0;
70     uint32_t retFileDataCnt = 0;
71     uint8_t buf[1] = {};
72     std::array<uint8_t, oemMetaDecodeWriteFileIoReqBytes> retDataField{};
73 
74     auto request = reinterpret_cast<pldm_msg*>(buf);
75 
76     auto rc = decode_oem_meta_file_io_req(request, 0, &retfileHandle,
77                                           &retFileDataCnt, retDataField.data());
78 
79     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
80 }
81 
82 TEST(DecodeOemMetaFileIoReq, testInvalidDataRequest)
83 {
84     uint8_t buf[1] = {};
85     uint8_t retfileHandle = 0;
86     uint32_t retFileDataCnt = 0;
87 
88     std::array<uint8_t, invalidDataSize> retDataField{};
89 
90     auto request = reinterpret_cast<pldm_msg*>(buf);
91 
92     auto rc = decode_oem_meta_file_io_req(request, sizeof(buf), &retfileHandle,
93                                           &retFileDataCnt, retDataField.data());
94 
95     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
96 }
97