blob: 747f3be4bbf576741c3370607b4749df8b7ef16a [file] [log] [blame]
Delphine CC Chiu22fad392023-10-27 11:05:01 +08001/* 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
Lora Lin84213eb2024-07-22 09:52:01 +08005#include <cstdlib>
6#include <new>
7
Delphine CC Chiu22fad392023-10-27 11:05:01 +08008#include "msgbuf.h"
9
Lora Lin6476c962024-07-26 14:01:16 +080010#include "gmock/gmock.h"
Delphine CC Chiu22fad392023-10-27 11:05:01 +080011#include <gtest/gtest.h>
12
Lora Lin84213eb2024-07-22 09:52:01 +080013TEST(DecodeOemMetaFileIoWriteReq, testGoodDecodeRequest)
Delphine CC Chiu22fad392023-10-27 11:05:01 +080014{
Lora Lin84213eb2024-07-22 09:52:01 +080015 constexpr const uint8_t postCode[4] = {0x93, 0xe0, 0x00, 0xea};
Andrew Jefferya1896962025-03-03 21:41:25 +103016 PLDM_MSGBUF_DEFINE_P(ctx);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +000017 int rc;
Delphine CC Chiu22fad392023-10-27 11:05:01 +080018
Lora Lin84213eb2024-07-22 09:52:01 +080019 constexpr size_t encodedPayloadLen =
20 PLDM_OEM_META_FILE_IO_WRITE_REQ_MIN_LENGTH + sizeof(postCode);
21 constexpr size_t encodedMsgLen = sizeof(pldm_msg_hdr) + encodedPayloadLen;
22 alignas(pldm_msg) unsigned char encodedMsgBuf[encodedMsgLen] = {};
23 auto* encodedMsg = new (encodedMsgBuf) pldm_msg;
Delphine CC Chiu22fad392023-10-27 11:05:01 +080024
Lora Lin84213eb2024-07-22 09:52:01 +080025 rc = pldm_msgbuf_init_errno(ctx, 0, encodedMsg->payload, encodedPayloadLen);
26 ASSERT_EQ(rc, 0);
Delphine CC Chiu22fad392023-10-27 11:05:01 +080027
Lora Lin84213eb2024-07-22 09:52:01 +080028 pldm_msgbuf_insert_uint8(ctx, 0);
29 pldm_msgbuf_insert_int32(ctx, sizeof(postCode));
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +000030 rc = pldm_msgbuf_insert_array_uint8(ctx, sizeof(postCode), postCode,
31 sizeof(postCode));
Lora Lin84213eb2024-07-22 09:52:01 +080032 ASSERT_EQ(rc, 0);
Delphine CC Chiu22fad392023-10-27 11:05:01 +080033
Andrew Jeffery70d21c92025-03-05 12:59:42 +103034 rc = pldm_msgbuf_complete_consumed(ctx);
Lora Lin84213eb2024-07-22 09:52:01 +080035 ASSERT_EQ(rc, 0);
Delphine CC Chiu22fad392023-10-27 11:05:01 +080036
Lora Lin84213eb2024-07-22 09:52:01 +080037 constexpr size_t decodedReqLen =
38 sizeof(struct pldm_oem_meta_file_io_write_req) + sizeof(postCode);
39 alignas(pldm_oem_meta_file_io_write_req) unsigned char
40 decodedReqBuf[decodedReqLen];
41 auto* decodedReq = new (decodedReqBuf) pldm_oem_meta_file_io_write_req;
42 auto* decodedReqData =
43 static_cast<uint8_t*>(pldm_oem_meta_file_io_write_req_data(decodedReq));
Delphine CC Chiu22fad392023-10-27 11:05:01 +080044
Lora Lin84213eb2024-07-22 09:52:01 +080045 rc = decode_oem_meta_file_io_write_req(encodedMsg, encodedPayloadLen,
46 decodedReq, decodedReqLen);
47 ASSERT_EQ(rc, 0);
Delphine CC Chiu22fad392023-10-27 11:05:01 +080048
Lora Lin84213eb2024-07-22 09:52:01 +080049 EXPECT_EQ(decodedReq->handle, 0);
50 ASSERT_EQ(decodedReq->length, sizeof(postCode));
51 EXPECT_EQ(memcmp(decodedReqData, postCode, decodedReq->length), 0);
Delphine CC Chiu22fad392023-10-27 11:05:01 +080052}
53
Lora Lin84213eb2024-07-22 09:52:01 +080054TEST(DecodeOemMetaFileIoWriteReq, testInvalidFieldsDecodeRequest)
Delphine CC Chiu22fad392023-10-27 11:05:01 +080055{
Lora Lin84213eb2024-07-22 09:52:01 +080056 struct pldm_msg msg = {};
Delphine CC Chiu22fad392023-10-27 11:05:01 +080057
Lora Lin84213eb2024-07-22 09:52:01 +080058 auto rc = decode_oem_meta_file_io_write_req(&msg, sizeof(msg), NULL, 0);
59 EXPECT_EQ(rc, -EINVAL);
Delphine CC Chiu22fad392023-10-27 11:05:01 +080060}
61
Lora Lin84213eb2024-07-22 09:52:01 +080062TEST(DecodeOemMetaFileIoWriteReq, testInvalidLengthDecodeRequest)
Delphine CC Chiu22fad392023-10-27 11:05:01 +080063{
Lora Lin84213eb2024-07-22 09:52:01 +080064 struct pldm_oem_meta_file_io_write_req req = {};
65 struct pldm_msg msg = {};
Delphine CC Chiu22fad392023-10-27 11:05:01 +080066
Lora Lin84213eb2024-07-22 09:52:01 +080067 auto rc = decode_oem_meta_file_io_write_req(&msg, 0, &req, sizeof(req));
68 EXPECT_EQ(rc, -EOVERFLOW);
Delphine CC Chiu22fad392023-10-27 11:05:01 +080069}
70
Lora Lin84213eb2024-07-22 09:52:01 +080071TEST(DecodeOemMetaFileIoWriteReq, testInvalidDataRequest)
Delphine CC Chiu22fad392023-10-27 11:05:01 +080072{
Lora Lin84213eb2024-07-22 09:52:01 +080073 struct pldm_oem_meta_file_io_write_req req = {};
74 struct pldm_msg msg = {};
75 int rc;
Delphine CC Chiu22fad392023-10-27 11:05:01 +080076
Lora Lin84213eb2024-07-22 09:52:01 +080077 rc = decode_oem_meta_file_io_write_req(
78 &msg, PLDM_OEM_META_FILE_IO_WRITE_REQ_MIN_LENGTH - 1, &req,
79 sizeof(req));
80 EXPECT_EQ(rc, -EOVERFLOW);
Andrew Jeffery32df16c2024-05-17 14:28:18 +093081}
Lora Lin893a08f2024-07-16 15:03:31 +080082
Lora Lin893a08f2024-07-16 15:03:31 +080083TEST(DecodeOemMetaFileIoReadReq, testGoodDecodeRequest)
84{
Andrew Jefferya1896962025-03-03 21:41:25 +103085 PLDM_MSGBUF_DEFINE_P(ctx);
Lora Lin893a08f2024-07-16 15:03:31 +080086 int rc;
87
88 constexpr size_t payloadLen = PLDM_OEM_META_FILE_IO_READ_REQ_MIN_LENGTH +
89 PLDM_OEM_META_FILE_IO_READ_DATA_INFO_LENGTH;
90 alignas(pldm_msg) unsigned char buf[sizeof(pldm_msg_hdr) + payloadLen]{};
91 auto* msg = new (buf) pldm_msg;
92
93 rc = pldm_msgbuf_init_errno(ctx, 0, msg->payload, payloadLen);
94 ASSERT_EQ(rc, 0);
95
96 pldm_msgbuf_insert_uint8(ctx, 0);
97 pldm_msgbuf_insert_uint8(ctx, PLDM_OEM_META_FILE_IO_READ_DATA);
98 pldm_msgbuf_insert_uint8(ctx, PLDM_OEM_META_FILE_IO_READ_DATA_INFO_LENGTH);
99 pldm_msgbuf_insert_uint8(ctx, 1);
100 pldm_msgbuf_insert_uint16(ctx, 1223);
101
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030102 rc = pldm_msgbuf_complete_consumed(ctx);
Lora Lin893a08f2024-07-16 15:03:31 +0800103 ASSERT_EQ(rc, 0);
104
105 struct pldm_oem_meta_file_io_read_req req = {};
106 req.version = sizeof(req);
107 rc = decode_oem_meta_file_io_read_req(msg, payloadLen, &req);
108 ASSERT_EQ(rc, 0);
109
110 EXPECT_EQ(req.handle, 0);
111 EXPECT_EQ(req.option, PLDM_OEM_META_FILE_IO_READ_DATA);
112 EXPECT_EQ(req.length, PLDM_OEM_META_FILE_IO_READ_DATA_INFO_LENGTH);
113 EXPECT_EQ(req.info.data.transferFlag, 1);
114 EXPECT_EQ(req.info.data.offset, 1223);
115}
Lora Lin893a08f2024-07-16 15:03:31 +0800116
Lora Lin893a08f2024-07-16 15:03:31 +0800117TEST(DecodeOemMetaFileIoReadReq, testInvalidFieldsDecodeRequest)
118{
119 struct pldm_msg msg = {};
120
121 auto rc = decode_oem_meta_file_io_read_req(
122 &msg, PLDM_OEM_META_FILE_IO_READ_REQ_MIN_LENGTH, NULL);
123 EXPECT_EQ(rc, -EINVAL);
124}
Lora Lin893a08f2024-07-16 15:03:31 +0800125
Lora Lin893a08f2024-07-16 15:03:31 +0800126TEST(DecodeOemMetaFileIoReadReq, testInvalidLengthDecodeRequest)
127{
128 struct pldm_oem_meta_file_io_read_req req = {};
129 struct pldm_msg msg = {};
130
131 auto rc = decode_oem_meta_file_io_read_req(&msg, 0, &req);
132 EXPECT_EQ(rc, -EOVERFLOW);
133}
Lora Lin893a08f2024-07-16 15:03:31 +0800134
Lora Lin893a08f2024-07-16 15:03:31 +0800135TEST(DecodeOemMetaFileIoReadReq, testInvalidDataRequest)
136{
137 struct pldm_oem_meta_file_io_read_req req = {};
138 struct pldm_msg msg = {};
139
140 auto rc = decode_oem_meta_file_io_read_req(
141 &msg, PLDM_OEM_META_FILE_IO_READ_REQ_MIN_LENGTH - 1, &req);
142 EXPECT_EQ(rc, -EOVERFLOW);
143}
Lora Lin6476c962024-07-26 14:01:16 +0800144
Lora Lin6476c962024-07-26 14:01:16 +0800145TEST(EncodeOemMetaFileIoReadResp, testGoodEncodeReadAttrResponse)
146{
147 int rc;
148
149 alignas(pldm_oem_meta_file_io_read_resp) unsigned char
150 decodedBuf[sizeof(pldm_oem_meta_file_io_read_resp)];
151 auto* resp = new (decodedBuf) pldm_oem_meta_file_io_read_resp;
152 resp->version = sizeof(struct pldm_oem_meta_file_io_read_resp);
153 resp->completion_code = PLDM_SUCCESS;
154 resp->handle = 1;
155 resp->option = PLDM_OEM_META_FILE_IO_READ_ATTR;
156 resp->length = 0;
157 resp->info.attr.size = 0x1284;
158 resp->info.attr.crc32 = 0xab715432;
159
160 constexpr size_t payloadLen = PLDM_OEM_META_FILE_IO_READ_RESP_MIN_SIZE +
161 PLDM_OEM_META_FILE_IO_READ_ATTR_INFO_LENGTH;
162 alignas(pldm_msg) unsigned char
163 encodedBuf[sizeof(pldm_msg_hdr) + payloadLen] = {};
164 auto* msg = new (encodedBuf) pldm_msg;
165
166 rc = encode_oem_meta_file_io_read_resp(
167 0, resp, sizeof(pldm_oem_meta_file_io_read_resp), msg, payloadLen);
168 ASSERT_EQ(rc, 0);
169
170 EXPECT_THAT(encodedBuf, testing::ElementsAreArray(
171 {0x00, 0x3f, 0x03, 0x00, 0x01, 0x00, 0x00, 0x84,
172 0x12, 0x32, 0x54, 0x71, 0xab}));
173}
Lora Lin6476c962024-07-26 14:01:16 +0800174
Lora Lin6476c962024-07-26 14:01:16 +0800175TEST(EncodeOemMetaFileIoReadResp, testGoodEncodeReadDataResponse)
176{
177 constexpr static const uint8_t readbuf[4] = {0x23, 0xca, 0x84, 0x9d};
178 int rc;
179
180 alignas(pldm_oem_meta_file_io_read_resp) unsigned char
181 decodedBuf[sizeof(pldm_oem_meta_file_io_read_resp) + sizeof(readbuf)];
182 auto* resp = new (decodedBuf) pldm_oem_meta_file_io_read_resp;
183 resp->version = sizeof(struct pldm_oem_meta_file_io_read_resp);
184 resp->completion_code = PLDM_SUCCESS;
185 resp->handle = 1;
186 resp->option = PLDM_OEM_META_FILE_IO_READ_DATA;
187 resp->length = 4;
188 resp->info.data.transferFlag = 0x05;
189 resp->info.data.offset = 0x75cd;
190 memcpy(pldm_oem_meta_file_io_read_resp_data(resp), readbuf,
191 sizeof(readbuf));
192
193 constexpr size_t payloadLen = PLDM_OEM_META_FILE_IO_READ_RESP_MIN_SIZE +
194 PLDM_OEM_META_FILE_IO_READ_DATA_INFO_LENGTH +
195 sizeof(readbuf);
196 alignas(pldm_msg) unsigned char
197 encodedBuf[sizeof(pldm_msg_hdr) + payloadLen] = {};
198 auto* msg = new (encodedBuf) pldm_msg;
199
200 rc = encode_oem_meta_file_io_read_resp(
201 0, resp, sizeof(pldm_oem_meta_file_io_read_resp) + sizeof(readbuf), msg,
202 payloadLen);
203 ASSERT_EQ(rc, 0);
204
205 EXPECT_THAT(encodedBuf, testing::ElementsAreArray(
206 {0x00, 0x3f, 0x03, 0x00, 0x01, 0x01, 0x04, 0x05,
207 0xcd, 0x75, 0x23, 0xca, 0x84, 0x9d}));
208}
Lora Lin6476c962024-07-26 14:01:16 +0800209
Lora Lin6476c962024-07-26 14:01:16 +0800210TEST(EncodeOemMetaFileIoReadResp, testInvalidFieldsEncodeResponse)
211{
212 struct pldm_msg msg = {};
213
214 auto rc = encode_oem_meta_file_io_read_resp(
215 0, NULL, 0, &msg, PLDM_OEM_META_FILE_IO_READ_RESP_MIN_SIZE);
216 EXPECT_EQ(rc, -EINVAL);
217}
Lora Lin6476c962024-07-26 14:01:16 +0800218
Lora Lin6476c962024-07-26 14:01:16 +0800219TEST(EncodeOemMetaFileIoReadResp, testInvalidLengthEncodeResponse)
220{
221 struct pldm_oem_meta_file_io_read_resp resp = {};
222 struct pldm_msg msg = {};
223
224 auto rc =
225 encode_oem_meta_file_io_read_resp(0, &resp, sizeof(resp), &msg, 0);
226 EXPECT_EQ(rc, -EOVERFLOW);
227}
Lora Lin6476c962024-07-26 14:01:16 +0800228
Lora Lin6476c962024-07-26 14:01:16 +0800229TEST(EncodeOemMetaFileIoReadResp, testInvalidDataEncodeResponse)
230{
231 struct pldm_oem_meta_file_io_read_resp resp = {};
232 struct pldm_msg msg = {};
233
234 auto rc = encode_oem_meta_file_io_read_resp(
235 0, &resp, sizeof(resp), &msg,
236 PLDM_OEM_META_FILE_IO_READ_RESP_MIN_SIZE - 1);
237 EXPECT_EQ(rc, -EOVERFLOW);
238}