PLDM: Implement encode response & decode request API for SetFRURecordTable
This commit implements the responder flow for SetFRURecordTable
PLDM SPEC: DSP0257_1.0.0 Table 11
Tested: Unit tests passed
Signed-off-by: Sridevi Ramesh <sridevra@in.ibm.com>
Change-Id: Ic9cd7e0f37148fcb6fe5a7aea4c6719562a55b0d
diff --git a/libpldm/tests/libpldm_fru_test.cpp b/libpldm/tests/libpldm_fru_test.cpp
index 8a3850c..0419826 100644
--- a/libpldm/tests/libpldm_fru_test.cpp
+++ b/libpldm/tests/libpldm_fru_test.cpp
@@ -772,3 +772,116 @@
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
+
+TEST(SetFRURecordTable, testGoodEncodeResponse)
+{
+ uint8_t instanceId = 2;
+ uint8_t completionCode = PLDM_SUCCESS;
+ uint32_t nextDataTransferHandle = 32;
+
+ std::array<uint8_t,
+ sizeof(pldm_msg_hdr) + PLDM_SET_FRU_RECORD_TABLE_RESP_BYTES>
+ responseMsg{};
+ struct pldm_msg* response =
+ reinterpret_cast<struct pldm_msg*>(responseMsg.data());
+ auto rc = encode_set_fru_record_table_resp(
+ instanceId, completionCode, nextDataTransferHandle,
+ responseMsg.size() - sizeof(pldm_msg_hdr), response);
+ EXPECT_EQ(rc, PLDM_SUCCESS);
+
+ struct pldm_set_fru_record_table_resp* resp =
+ reinterpret_cast<struct pldm_set_fru_record_table_resp*>(
+ response->payload);
+ EXPECT_EQ(completionCode, resp->completion_code);
+ EXPECT_EQ(htole32(nextDataTransferHandle), resp->next_data_transfer_handle);
+}
+
+TEST(SetFRURecordTable, testBadEncodeResponse)
+{
+ uint8_t instanceId = 0;
+ uint8_t completionCode = PLDM_SUCCESS;
+ uint32_t nextDataTransferHandle = 1;
+
+ std::array<uint8_t,
+ sizeof(pldm_msg_hdr) + PLDM_SET_FRU_RECORD_TABLE_RESP_BYTES>
+ responseMsg{};
+ struct pldm_msg* response =
+ reinterpret_cast<struct pldm_msg*>(responseMsg.data());
+
+ auto rc = encode_set_fru_record_table_resp(
+ instanceId, completionCode, nextDataTransferHandle,
+ responseMsg.size() - sizeof(pldm_msg_hdr), NULL);
+ EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+ rc = encode_set_fru_record_table_resp(
+ instanceId, completionCode, nextDataTransferHandle,
+ responseMsg.size() - sizeof(pldm_msg_hdr) - 1, response);
+ EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(SetFRURecordTable, testGoodDecodeRequest)
+{
+ uint32_t transferHandle = 1;
+ uint8_t transferFlag = PLDM_GET_FIRSTPART;
+ uint32_t tableData = 44;
+
+ std::array<uint8_t, sizeof(pldm_msg_hdr) +
+ PLDM_SET_FRU_RECORD_TABLE_MIN_REQ_BYTES +
+ sizeof(tableData)>
+ requestMsg{};
+ auto request = reinterpret_cast<struct pldm_msg*>(requestMsg.data());
+ struct pldm_set_fru_record_table_req* req =
+ reinterpret_cast<struct pldm_set_fru_record_table_req*>(
+ request->payload);
+ req->data_transfer_handle = htole32(transferHandle);
+ req->transfer_flag = transferFlag;
+ memcpy(req->fru_record_table_data, &tableData, sizeof(tableData));
+
+ uint32_t retTransferHandle;
+ uint8_t retTransferFlag;
+ struct variable_field table;
+
+ auto rc = decode_set_fru_record_table_req(
+ request, requestMsg.size() - sizeof(pldm_msg_hdr), &retTransferHandle,
+ &retTransferFlag, &table);
+
+ EXPECT_EQ(rc, PLDM_SUCCESS);
+ EXPECT_EQ(retTransferHandle, transferHandle);
+ EXPECT_EQ(retTransferFlag, transferFlag);
+ EXPECT_EQ(table.length, sizeof(tableData));
+ EXPECT_EQ(0, memcmp(table.ptr, &tableData, sizeof(tableData)));
+}
+
+TEST(SetFRURecordTable, testBadDecodeRequest)
+{
+ uint32_t transferHandle = 1;
+ uint8_t transferFlag = PLDM_GET_FIRSTPART;
+ uint32_t tableData = 44;
+
+ std::array<uint8_t, sizeof(pldm_msg_hdr) +
+ PLDM_SET_FRU_RECORD_TABLE_MIN_REQ_BYTES +
+ sizeof(tableData)>
+ requestMsg{};
+ auto request = reinterpret_cast<struct pldm_msg*>(requestMsg.data());
+ struct pldm_set_fru_record_table_req* req =
+ reinterpret_cast<struct pldm_set_fru_record_table_req*>(
+ request->payload);
+ req->data_transfer_handle = htole32(transferHandle);
+ req->transfer_flag = transferFlag;
+ memcpy(req->fru_record_table_data, &tableData, sizeof(tableData));
+
+ uint32_t retTransferHandle;
+ uint8_t retTransferFlag;
+
+ auto rc = decode_set_fru_record_table_req(
+ request, requestMsg.size() - sizeof(pldm_msg_hdr), &retTransferHandle,
+ &retTransferFlag, NULL);
+ EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+ struct variable_field table;
+ rc = decode_set_fru_record_table_req(
+ request,
+ requestMsg.size() - sizeof(pldm_msg_hdr) - sizeof(tableData) - 1,
+ &retTransferHandle, &retTransferFlag, &table);
+ EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}