blob: a40e43b4d4ddd91532bd76c0e4a13b55decd3fb4 [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
10#include <gtest/gtest.h>
11
Lora Lin84213eb2024-07-22 09:52:01 +080012#ifdef LIBPLDM_API_TESTING
13TEST(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};
Delphine CC Chiu22fad392023-10-27 11:05:01 +080016 struct pldm_msgbuf _ctx;
17 struct pldm_msgbuf* ctx = &_ctx;
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +000018 int rc;
Delphine CC Chiu22fad392023-10-27 11:05:01 +080019
Lora Lin84213eb2024-07-22 09:52:01 +080020 constexpr size_t encodedPayloadLen =
21 PLDM_OEM_META_FILE_IO_WRITE_REQ_MIN_LENGTH + sizeof(postCode);
22 constexpr size_t encodedMsgLen = sizeof(pldm_msg_hdr) + encodedPayloadLen;
23 alignas(pldm_msg) unsigned char encodedMsgBuf[encodedMsgLen] = {};
24 auto* encodedMsg = new (encodedMsgBuf) pldm_msg;
Delphine CC Chiu22fad392023-10-27 11:05:01 +080025
Lora Lin84213eb2024-07-22 09:52:01 +080026 rc = pldm_msgbuf_init_errno(ctx, 0, encodedMsg->payload, encodedPayloadLen);
27 ASSERT_EQ(rc, 0);
Delphine CC Chiu22fad392023-10-27 11:05:01 +080028
Lora Lin84213eb2024-07-22 09:52:01 +080029 pldm_msgbuf_insert_uint8(ctx, 0);
30 pldm_msgbuf_insert_int32(ctx, sizeof(postCode));
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +000031 rc = pldm_msgbuf_insert_array_uint8(ctx, sizeof(postCode), postCode,
32 sizeof(postCode));
Lora Lin84213eb2024-07-22 09:52:01 +080033 ASSERT_EQ(rc, 0);
Delphine CC Chiu22fad392023-10-27 11:05:01 +080034
Lora Lin84213eb2024-07-22 09:52:01 +080035 rc = pldm_msgbuf_destroy_consumed(ctx);
36 ASSERT_EQ(rc, 0);
Delphine CC Chiu22fad392023-10-27 11:05:01 +080037
Lora Lin84213eb2024-07-22 09:52:01 +080038 constexpr size_t decodedReqLen =
39 sizeof(struct pldm_oem_meta_file_io_write_req) + sizeof(postCode);
40 alignas(pldm_oem_meta_file_io_write_req) unsigned char
41 decodedReqBuf[decodedReqLen];
42 auto* decodedReq = new (decodedReqBuf) pldm_oem_meta_file_io_write_req;
43 auto* decodedReqData =
44 static_cast<uint8_t*>(pldm_oem_meta_file_io_write_req_data(decodedReq));
Delphine CC Chiu22fad392023-10-27 11:05:01 +080045
Lora Lin84213eb2024-07-22 09:52:01 +080046 rc = decode_oem_meta_file_io_write_req(encodedMsg, encodedPayloadLen,
47 decodedReq, decodedReqLen);
48 ASSERT_EQ(rc, 0);
Delphine CC Chiu22fad392023-10-27 11:05:01 +080049
Lora Lin84213eb2024-07-22 09:52:01 +080050 EXPECT_EQ(decodedReq->handle, 0);
51 ASSERT_EQ(decodedReq->length, sizeof(postCode));
52 EXPECT_EQ(memcmp(decodedReqData, postCode, decodedReq->length), 0);
Delphine CC Chiu22fad392023-10-27 11:05:01 +080053}
Lora Lin84213eb2024-07-22 09:52:01 +080054#endif
Delphine CC Chiu22fad392023-10-27 11:05:01 +080055
Lora Lin84213eb2024-07-22 09:52:01 +080056#ifdef LIBPLDM_API_TESTING
57TEST(DecodeOemMetaFileIoWriteReq, testInvalidFieldsDecodeRequest)
Delphine CC Chiu22fad392023-10-27 11:05:01 +080058{
Lora Lin84213eb2024-07-22 09:52:01 +080059 struct pldm_msg msg = {};
Delphine CC Chiu22fad392023-10-27 11:05:01 +080060
Lora Lin84213eb2024-07-22 09:52:01 +080061 auto rc = decode_oem_meta_file_io_write_req(&msg, sizeof(msg), NULL, 0);
62 EXPECT_EQ(rc, -EINVAL);
Delphine CC Chiu22fad392023-10-27 11:05:01 +080063}
Lora Lin84213eb2024-07-22 09:52:01 +080064#endif
Delphine CC Chiu22fad392023-10-27 11:05:01 +080065
Lora Lin84213eb2024-07-22 09:52:01 +080066#ifdef LIBPLDM_API_TESTING
67TEST(DecodeOemMetaFileIoWriteReq, testInvalidLengthDecodeRequest)
Delphine CC Chiu22fad392023-10-27 11:05:01 +080068{
Lora Lin84213eb2024-07-22 09:52:01 +080069 struct pldm_oem_meta_file_io_write_req req = {};
70 struct pldm_msg msg = {};
Delphine CC Chiu22fad392023-10-27 11:05:01 +080071
Lora Lin84213eb2024-07-22 09:52:01 +080072 auto rc = decode_oem_meta_file_io_write_req(&msg, 0, &req, sizeof(req));
73 EXPECT_EQ(rc, -EOVERFLOW);
Delphine CC Chiu22fad392023-10-27 11:05:01 +080074}
Lora Lin84213eb2024-07-22 09:52:01 +080075#endif
Delphine CC Chiu22fad392023-10-27 11:05:01 +080076
Lora Lin84213eb2024-07-22 09:52:01 +080077#ifdef LIBPLDM_API_TESTING
78TEST(DecodeOemMetaFileIoWriteReq, testInvalidDataRequest)
Delphine CC Chiu22fad392023-10-27 11:05:01 +080079{
Lora Lin84213eb2024-07-22 09:52:01 +080080 struct pldm_oem_meta_file_io_write_req req = {};
81 struct pldm_msg msg = {};
82 int rc;
Delphine CC Chiu22fad392023-10-27 11:05:01 +080083
Lora Lin84213eb2024-07-22 09:52:01 +080084 rc = decode_oem_meta_file_io_write_req(
85 &msg, PLDM_OEM_META_FILE_IO_WRITE_REQ_MIN_LENGTH - 1, &req,
86 sizeof(req));
87 EXPECT_EQ(rc, -EOVERFLOW);
Andrew Jeffery32df16c2024-05-17 14:28:18 +093088}
Lora Lin84213eb2024-07-22 09:52:01 +080089#endif
Lora Lin893a08f2024-07-16 15:03:31 +080090
91#ifdef LIBPLDM_API_TESTING
92TEST(DecodeOemMetaFileIoReadReq, testGoodDecodeRequest)
93{
94 struct pldm_msgbuf _ctx;
95 struct pldm_msgbuf* ctx = &_ctx;
96 int rc;
97
98 constexpr size_t payloadLen = PLDM_OEM_META_FILE_IO_READ_REQ_MIN_LENGTH +
99 PLDM_OEM_META_FILE_IO_READ_DATA_INFO_LENGTH;
100 alignas(pldm_msg) unsigned char buf[sizeof(pldm_msg_hdr) + payloadLen]{};
101 auto* msg = new (buf) pldm_msg;
102
103 rc = pldm_msgbuf_init_errno(ctx, 0, msg->payload, payloadLen);
104 ASSERT_EQ(rc, 0);
105
106 pldm_msgbuf_insert_uint8(ctx, 0);
107 pldm_msgbuf_insert_uint8(ctx, PLDM_OEM_META_FILE_IO_READ_DATA);
108 pldm_msgbuf_insert_uint8(ctx, PLDM_OEM_META_FILE_IO_READ_DATA_INFO_LENGTH);
109 pldm_msgbuf_insert_uint8(ctx, 1);
110 pldm_msgbuf_insert_uint16(ctx, 1223);
111
112 rc = pldm_msgbuf_destroy_consumed(ctx);
113 ASSERT_EQ(rc, 0);
114
115 struct pldm_oem_meta_file_io_read_req req = {};
116 req.version = sizeof(req);
117 rc = decode_oem_meta_file_io_read_req(msg, payloadLen, &req);
118 ASSERT_EQ(rc, 0);
119
120 EXPECT_EQ(req.handle, 0);
121 EXPECT_EQ(req.option, PLDM_OEM_META_FILE_IO_READ_DATA);
122 EXPECT_EQ(req.length, PLDM_OEM_META_FILE_IO_READ_DATA_INFO_LENGTH);
123 EXPECT_EQ(req.info.data.transferFlag, 1);
124 EXPECT_EQ(req.info.data.offset, 1223);
125}
126#endif
127
128#ifdef LIBPLDM_API_TESTING
129TEST(DecodeOemMetaFileIoReadReq, testInvalidFieldsDecodeRequest)
130{
131 struct pldm_msg msg = {};
132
133 auto rc = decode_oem_meta_file_io_read_req(
134 &msg, PLDM_OEM_META_FILE_IO_READ_REQ_MIN_LENGTH, NULL);
135 EXPECT_EQ(rc, -EINVAL);
136}
137#endif
138
139#ifdef LIBPLDM_API_TESTING
140TEST(DecodeOemMetaFileIoReadReq, testInvalidLengthDecodeRequest)
141{
142 struct pldm_oem_meta_file_io_read_req req = {};
143 struct pldm_msg msg = {};
144
145 auto rc = decode_oem_meta_file_io_read_req(&msg, 0, &req);
146 EXPECT_EQ(rc, -EOVERFLOW);
147}
148#endif
149
150#ifdef LIBPLDM_API_TESTING
151TEST(DecodeOemMetaFileIoReadReq, testInvalidDataRequest)
152{
153 struct pldm_oem_meta_file_io_read_req req = {};
154 struct pldm_msg msg = {};
155
156 auto rc = decode_oem_meta_file_io_read_req(
157 &msg, PLDM_OEM_META_FILE_IO_READ_REQ_MIN_LENGTH - 1, &req);
158 EXPECT_EQ(rc, -EOVERFLOW);
159}
160#endif