Add decode GetPDRRepositoryInfo resp API
Add decode response API for GetPDRRepositoryInfo command(0x50).
DSP0248_1.2.0 Table 67
Signed-off-by: Gilbert Chen <gilbertc@nvidia.com>
Change-Id: I000be34a217499340bee60dc412ccd72530a52db
diff --git a/tests/libpldm_platform_test.cpp b/tests/libpldm_platform_test.cpp
index 9c5e3b0..329f4ff 100644
--- a/tests/libpldm_platform_test.cpp
+++ b/tests/libpldm_platform_test.cpp
@@ -434,6 +434,115 @@
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
+TEST(GetPDRRepositoryInfo, testGoodDecodeResponse)
+{
+ uint8_t completionCode = PLDM_SUCCESS;
+ uint8_t repositoryState = PLDM_AVAILABLE;
+ uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
+ uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
+ uint32_t recordCount = 100;
+ uint32_t repositorySize = 100;
+ uint32_t largestRecordSize = UINT32_MAX;
+ uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
+
+ std::array<uint8_t, hdrSize + PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES>
+ responseMsg{};
+ auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+ struct pldm_pdr_repository_info_resp* resp =
+ reinterpret_cast<struct pldm_pdr_repository_info_resp*>(
+ response->payload);
+ resp->completion_code = completionCode;
+ resp->repository_state = repositoryState;
+ memcpy(resp->update_time, updateTime, PLDM_TIMESTAMP104_SIZE);
+ memcpy(resp->oem_update_time, oemUpdateTime, PLDM_TIMESTAMP104_SIZE);
+ resp->record_count = htole32(recordCount);
+ resp->repository_size = htole32(repositorySize);
+ resp->largest_record_size = htole32(largestRecordSize);
+ resp->data_transfer_handle_timeout = dataTransferHandleTimeout;
+
+ uint8_t retCompletionCode = 0;
+ uint8_t retRepositoryState = 0;
+ uint8_t retUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
+ uint8_t retOemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
+ uint32_t retRecordCount = 0;
+ uint32_t retRepositorySize = 0;
+ uint32_t retLargestRecordSize = 0;
+ uint8_t retDataTransferHandleTimeout = 0;
+
+ auto rc = decode_get_pdr_repository_info_resp(
+ response, responseMsg.size() - hdrSize, &retCompletionCode,
+ &retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
+ &retRepositorySize, &retLargestRecordSize,
+ &retDataTransferHandleTimeout);
+
+ EXPECT_EQ(rc, PLDM_SUCCESS);
+ EXPECT_EQ(completionCode, retCompletionCode);
+ EXPECT_EQ(repositoryState, retRepositoryState);
+ EXPECT_EQ(0, memcmp(updateTime, retUpdateTime, PLDM_TIMESTAMP104_SIZE));
+ EXPECT_EQ(0,
+ memcmp(oemUpdateTime, retOemUpdateTime, PLDM_TIMESTAMP104_SIZE));
+ EXPECT_EQ(recordCount, recordCount);
+ EXPECT_EQ(repositorySize, repositorySize);
+ EXPECT_EQ(largestRecordSize, largestRecordSize);
+ EXPECT_EQ(dataTransferHandleTimeout, dataTransferHandleTimeout);
+}
+
+TEST(GetPDRRepositoryInfo, testBadDecodeResponse)
+{
+ uint8_t completionCode = PLDM_SUCCESS;
+ uint8_t repositoryState = PLDM_AVAILABLE;
+ uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
+ uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
+ uint32_t recordCount = htole32(100);
+ uint32_t repositorySize = htole32(100);
+ uint32_t largestRecordSize = htole32(UINT32_MAX);
+ uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
+
+ std::array<uint8_t, hdrSize + PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES>
+ responseMsg{};
+ auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+ struct pldm_pdr_repository_info_resp* resp =
+ reinterpret_cast<struct pldm_pdr_repository_info_resp*>(
+ response->payload);
+ resp->completion_code = completionCode;
+ resp->repository_state = repositoryState;
+ memcpy(resp->update_time, updateTime, PLDM_TIMESTAMP104_SIZE);
+ memcpy(resp->oem_update_time, oemUpdateTime, PLDM_TIMESTAMP104_SIZE);
+ resp->record_count = recordCount;
+ resp->repository_size = repositorySize;
+ resp->largest_record_size = largestRecordSize;
+ resp->data_transfer_handle_timeout = dataTransferHandleTimeout;
+
+ uint8_t retCompletionCode = 0;
+ uint8_t retRepositoryState = 0;
+ uint8_t retUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
+ uint8_t retOemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
+ uint32_t retRecordCount = 0;
+ uint32_t retRepositorySize = 0;
+ uint32_t retLargestRecordSize = 0;
+ uint8_t retDataTransferHandleTimeout = 0;
+
+ auto rc = decode_get_pdr_repository_info_resp(
+ response, responseMsg.size() - hdrSize, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL);
+ EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+ rc = decode_get_pdr_repository_info_resp(
+ response, responseMsg.size() - hdrSize - 1, &retCompletionCode,
+ &retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
+ &retRepositorySize, &retLargestRecordSize,
+ &retDataTransferHandleTimeout);
+ EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+ resp->repository_state = PLDM_FAILED + 1;
+ rc = decode_get_pdr_repository_info_resp(
+ response, responseMsg.size() - hdrSize, &retCompletionCode,
+ &retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
+ &retRepositorySize, &retLargestRecordSize,
+ &retDataTransferHandleTimeout);
+ EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
TEST(SetNumericEffecterValue, testGoodDecodeRequest)
{
std::array<uint8_t,