pldm: Refector PDR repo based on the new PDR APIs
The related APIs for PDR operations is implemented in
pldm/libpldm/pdr.h and pldm/libpldm/pdr.c, we need to use this instead
of pdr::Repo(defined in libpldmresponder/pdr.hpp).
pdr::Repo is now a C++ wrapper around the PDR APIs in libpldm.
Tested with unit tests, with JSON files:
https://gist.github.com/lxwinspur/2c3fd68cdb35e06480c4a5f7890e3a06#file-effecter_pdr-json.
$ pldmtool platform GetPDR -d 0
Encode request successfully
Request Message:
08 01 80 02 51 00 00 00 00 00 00 00 00 01 80 00 00 00
Success in creating the socket : RC = 3
Success in connecting to socket : RC = 0
Success in sending message type as pldm to mctp : RC = 0
Write to socket successful : RC = 18
Total length:18
Loopback response message:
08 01 80 02 51 00 00 00 00 00 00 00 00 01 80 00 00 00
On first recv(),response == request : RC = 0
Total length: 46
Shutdown Socket successful : RC = 0
Response Message:
08 01 00 02 51 00 02 00 00 00 00 00 00 00 01 1d 00 01 00 00 00 01 0b 00 00 13 00 00 00 01 00 21 00 00 00 00 00 00 00 00 00 01 c4 00 01 06
Parsed Response Msg:
nextRecordHandle: 2
responseCount: 29
recordHandle: 1
PDRHeaderVersion: 1
PDRType: 11
recordChangeNumber: 0
dataLength: 19
PLDMTerminusHandle: 0
effecterID: 1
entityType: 33
entityInstanceNumber: 0
containerID: 0
effecterSemanticID: 0
effecterInit: 0
effecterDescriptionPDR: false
compositeEffecterCount: 1
stateSetID: 196
possibleStatesSize: 1
possibleStates: 6
Signed-off-by: George Liu <liuxiwei@inspur.com>
Change-Id: I0c41f888b2e36a5a49968dff190ad8d53255b9ed
diff --git a/test/libpldmresponder_pdr_state_effecter_test.cpp b/test/libpldmresponder_pdr_state_effecter_test.cpp
index e758f63..c2b114c 100644
--- a/test/libpldmresponder_pdr_state_effecter_test.cpp
+++ b/test/libpldmresponder_pdr_state_effecter_test.cpp
@@ -1,5 +1,6 @@
#include "libpldmresponder/effecters.hpp"
#include "libpldmresponder/pdr.hpp"
+#include "libpldmresponder/pdr_utils.hpp"
#include "libpldm/platform.h"
@@ -9,17 +10,19 @@
TEST(GeneratePDR, testGoodJson)
{
- using namespace pdr;
using namespace effecter::dbus_mapping;
- Repo& pdrRepo = get("./pdr_jsons/state_effecter/good");
+ pdr_utils::Repo pdrRepo = pdr::getRepoByType(
+ "./pdr_jsons/state_effecter/good", PLDM_STATE_EFFECTER_PDR);
// 2 entries
- ASSERT_EQ(pdrRepo.numEntries(), 2);
+ ASSERT_EQ(pdrRepo.getRecordCount(), 2);
// Check first PDR
- pdr::Entry e = pdrRepo.at(1);
+ pdr_utils::PdrEntry e;
+ auto record1 = pdr::getRecordByHandle(pdrRepo, 1, e);
+ ASSERT_NE(record1, nullptr);
pldm_state_effecter_pdr* pdr =
- reinterpret_cast<pldm_state_effecter_pdr*>(e.data());
+ reinterpret_cast<pldm_state_effecter_pdr*>(e.data);
ASSERT_EQ(pdr->hdr.record_handle, 1);
ASSERT_EQ(pdr->hdr.version, 1);
@@ -48,8 +51,9 @@
ASSERT_EQ(paths[0], "/foo/bar");
// Check second PDR
- e = pdrRepo.at(2);
- pdr = reinterpret_cast<pldm_state_effecter_pdr*>(e.data());
+ auto record2 = pdr::getRecordByHandle(pdrRepo, 2, e);
+ ASSERT_NE(record2, nullptr);
+ pdr = reinterpret_cast<pldm_state_effecter_pdr*>(e.data);
ASSERT_EQ(pdr->hdr.record_handle, 2);
ASSERT_EQ(pdr->hdr.version, 1);
@@ -91,19 +95,14 @@
TEST(GeneratePDR, testNoJson)
{
- using namespace pdr;
- Repo& pdrRepo = get("./pdr_jsons/not_there");
-
- ASSERT_EQ(pdrRepo.numEntries(), 2);
+ ASSERT_THROW(pdr_utils::readJson("./pdr_jsons/not_there"), std::exception);
}
TEST(GeneratePDR, testMalformedJson)
{
- using namespace pdr;
- Repo& pdrRepo = get("./pdr_jsons/state_effecter/good");
- ASSERT_EQ(pdrRepo.numEntries(), 2);
- pdrRepo.makeEmpty();
- ASSERT_THROW(pldm::responder::pdr::internal::readJson(
- "./pdr_jsons/state_effecter/malformed"),
+ pdr_utils::Repo pdrRepo = pdr::getRepoByType(
+ "./pdr_jsons/state_effecter/good", PLDM_STATE_EFFECTER_PDR);
+ ASSERT_EQ(pdrRepo.getRecordCount(), 2);
+ ASSERT_THROW(pdr_utils::readJson("./pdr_jsons/state_effecter/malformed"),
std::exception);
}
diff --git a/test/libpldmresponder_platform_test.cpp b/test/libpldmresponder_platform_test.cpp
index 208edc3..8252920 100644
--- a/test/libpldmresponder_platform_test.cpp
+++ b/test/libpldmresponder_platform_test.cpp
@@ -1,5 +1,6 @@
#include "libpldmresponder/effecters.hpp"
#include "libpldmresponder/pdr.hpp"
+#include "libpldmresponder/pdr_utils.hpp"
#include "libpldmresponder/platform.hpp"
#include <iostream>
@@ -9,87 +10,76 @@
#include <gtest/gtest.h>
using namespace pldm::responder;
-using namespace pldm::responder::pdr;
TEST(getPDR, testGoodPath)
{
std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
requestPayload{};
- auto request = reinterpret_cast<pldm_msg*>(requestPayload.data());
+ auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
- uint8_t* start = request->payload;
- start += sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint8_t);
- uint16_t* reqCount = reinterpret_cast<uint16_t*>(start);
- *reqCount = 100;
- using namespace pdr;
- Repo& pdrRepo = get("./pdr_jsons/state_effecter/good");
+ struct pldm_get_pdr_req* request =
+ reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
+ request->request_count = 100;
+
+ pdr_utils::RepoInterface& pdrRepo =
+ pdr::getRepo("./pdr_jsons/state_effecter/good");
ASSERT_EQ(pdrRepo.empty(), false);
platform::Handler handler;
- auto response = handler.getPDR(request, requestPayloadLength);
+ auto response = handler.getPDR(req, requestPayloadLength);
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
- ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
- start = responsePtr->payload;
- start += sizeof(uint8_t);
- uint32_t* nextRecordHandle = reinterpret_cast<uint32_t*>(start);
- ASSERT_EQ(*nextRecordHandle, 2);
- start += sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint8_t);
- uint16_t* recordCount = reinterpret_cast<uint16_t*>(start);
- ASSERT_EQ(*recordCount != 0, true);
- start += sizeof(uint16_t);
- // Check a bit of the PDR common header
- pldm_state_effecter_pdr* pdr =
- reinterpret_cast<pldm_state_effecter_pdr*>(start);
- ASSERT_EQ(pdr->hdr.record_handle, 1);
- ASSERT_EQ(pdr->hdr.version, 1);
+ struct pldm_get_pdr_resp* resp =
+ reinterpret_cast<struct pldm_get_pdr_resp*>(responsePtr->payload);
+ ASSERT_EQ(PLDM_SUCCESS, resp->completion_code);
+ ASSERT_EQ(2, resp->next_record_handle);
+ ASSERT_EQ(true, resp->response_count != 0);
+
+ pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(resp->record_data);
+ ASSERT_EQ(hdr->record_handle, 1);
+ ASSERT_EQ(hdr->version, 1);
}
TEST(getPDR, testShortRead)
{
std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
requestPayload{};
- auto request = reinterpret_cast<pldm_msg*>(requestPayload.data());
+ auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
- uint8_t* start = request->payload;
- start += sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint8_t);
- uint16_t* reqCount = reinterpret_cast<uint16_t*>(start);
- // Read 1 byte of PDR
- *reqCount = 1;
- using namespace pdr;
- Repo& pdrRepo = get("./pdr_jsons/state_effecter/good");
+ struct pldm_get_pdr_req* request =
+ reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
+ request->request_count = 1;
+
+ pdr_utils::RepoInterface& pdrRepo =
+ pdr::getRepo("./pdr_jsons/state_effecter/good");
ASSERT_EQ(pdrRepo.empty(), false);
platform::Handler handler;
- auto response = handler.getPDR(request, requestPayloadLength);
+ auto response = handler.getPDR(req, requestPayloadLength);
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
-
- ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
- start = responsePtr->payload;
- start +=
- sizeof(uint8_t) + sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint8_t);
- uint16_t* recordCount = reinterpret_cast<uint16_t*>(start);
- ASSERT_EQ(*recordCount, 1);
+ struct pldm_get_pdr_resp* resp =
+ reinterpret_cast<struct pldm_get_pdr_resp*>(responsePtr->payload);
+ ASSERT_EQ(PLDM_SUCCESS, resp->completion_code);
+ ASSERT_EQ(1, resp->response_count);
}
TEST(getPDR, testBadRecordHandle)
{
std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
requestPayload{};
- auto request = reinterpret_cast<pldm_msg*>(requestPayload.data());
+ auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
- uint8_t* start = request->payload;
- uint32_t* recordHandle = reinterpret_cast<uint32_t*>(start);
- *recordHandle = 100000;
- start += sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint8_t);
- uint16_t* reqCount = reinterpret_cast<uint16_t*>(start);
- *reqCount = 1;
- using namespace pdr;
- Repo& pdrRepo = get("./pdr_jsons/state_effecter/good");
+ struct pldm_get_pdr_req* request =
+ reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
+ request->record_handle = 100000;
+ request->request_count = 1;
+
+ pdr_utils::RepoInterface& pdrRepo =
+ pdr::getRepo("./pdr_jsons/state_effecter/good");
ASSERT_EQ(pdrRepo.empty(), false);
platform::Handler handler;
- auto response = handler.getPDR(request, requestPayloadLength);
+ auto response = handler.getPDR(req, requestPayloadLength);
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
ASSERT_EQ(responsePtr->payload[0], PLDM_PLATFORM_INVALID_RECORD_HANDLE);
@@ -99,73 +89,66 @@
{
std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
requestPayload{};
- auto request = reinterpret_cast<pldm_msg*>(requestPayload.data());
+ auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
- uint8_t* start = request->payload;
- uint32_t* recordHandle = reinterpret_cast<uint32_t*>(start);
- *recordHandle = 3;
- using namespace pdr;
- Repo& pdrRepo = get("./pdr_jsons/state_effecter/good");
+ struct pldm_get_pdr_req* request =
+ reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
+ request->record_handle = 1;
+
+ pdr_utils::RepoInterface& pdrRepo =
+ pdr::getRepo("./pdr_jsons/state_effecter/good");
ASSERT_EQ(pdrRepo.empty(), false);
platform::Handler handler;
- auto response = handler.getPDR(request, requestPayloadLength);
+ auto response = handler.getPDR(req, requestPayloadLength);
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
-
- ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
- start = responsePtr->payload;
- start += sizeof(uint8_t);
- uint32_t* nextRecordHandle = reinterpret_cast<uint32_t*>(start);
- ASSERT_EQ(*nextRecordHandle, 0);
+ struct pldm_get_pdr_resp* resp =
+ reinterpret_cast<struct pldm_get_pdr_resp*>(responsePtr->payload);
+ ASSERT_EQ(PLDM_SUCCESS, resp->completion_code);
+ ASSERT_EQ(2, resp->next_record_handle);
}
TEST(getPDR, testFindPDR)
{
std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
requestPayload{};
- auto request = reinterpret_cast<pldm_msg*>(requestPayload.data());
+ auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
- uint8_t* start = request->payload;
- start += sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint8_t);
- uint16_t* reqCount = reinterpret_cast<uint16_t*>(start);
- *reqCount = 100;
- using namespace pdr;
- Repo& pdrRepo = get("./pdr_jsons/state_effecter/good");
+ struct pldm_get_pdr_req* request =
+ reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
+ request->request_count = 100;
+
+ pdr_utils::RepoInterface& pdrRepo =
+ pdr::getRepo("./pdr_jsons/state_effecter/good");
ASSERT_EQ(pdrRepo.empty(), false);
platform::Handler handler;
- auto response = handler.getPDR(request, requestPayloadLength);
+ auto response = handler.getPDR(req, requestPayloadLength);
// Let's try to find a PDR of type stateEffecter (= 11) and entity type =
// 100
bool found = false;
uint32_t handle = 0; // start asking for PDRs from recordHandle 0
- uint32_t* recordHandle = nullptr;
while (!found)
{
- start = request->payload;
- recordHandle = reinterpret_cast<uint32_t*>(start);
- *recordHandle = handle;
+ request->record_handle = handle;
platform::Handler handler;
- auto response = handler.getPDR(request, requestPayloadLength);
+ auto response = handler.getPDR(req, requestPayloadLength);
auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
+ struct pldm_get_pdr_resp* resp =
+ reinterpret_cast<struct pldm_get_pdr_resp*>(responsePtr->payload);
+ ASSERT_EQ(PLDM_SUCCESS, resp->completion_code);
- ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
- start = responsePtr->payload;
- start += sizeof(uint8_t);
- uint32_t* nextRecordHandle = reinterpret_cast<uint32_t*>(start);
- handle = *nextRecordHandle; // point to the next pdr in case current is
- // not what we want
- start += sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint8_t) +
- sizeof(uint16_t);
- pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(start);
- uint32_t intType = hdr->type;
+ handle = resp->next_record_handle; // point to the next pdr in case
+ // current is not what we want
+
+ pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(resp->record_data);
std::cerr << "PDR next record handle " << handle << "\n";
- std::cerr << "PDR type " << intType << "\n";
+ std::cerr << "PDR type " << hdr->type << "\n";
if (hdr->type == PLDM_STATE_EFFECTER_PDR)
{
pldm_state_effecter_pdr* pdr =
- reinterpret_cast<pldm_state_effecter_pdr*>(start);
+ reinterpret_cast<pldm_state_effecter_pdr*>(resp->record_data);
std::cerr << "PDR entity type " << pdr->entity_type << "\n";
if (pdr->entity_type == 100)
{
@@ -174,7 +157,7 @@
break;
}
}
- if (!*nextRecordHandle) // no more records
+ if (!resp->next_record_handle) // no more records
{
break;
}
@@ -204,10 +187,13 @@
TEST(setStateEffecterStatesHandler, testGoodRequest)
{
- Repo& pdrRepo = get("./pdr_jsons/state_effecter/good");
- pdr::Entry e = pdrRepo.at(1);
+ pdr_utils::Repo pdrRepo = pdr::getRepoByType(
+ "./pdr_jsons/state_effecter/good", PLDM_STATE_EFFECTER_PDR);
+ pdr_utils::PdrEntry e;
+ auto record1 = pdr::getRecordByHandle(pdrRepo, 1, e);
+ ASSERT_NE(record1, nullptr);
pldm_state_effecter_pdr* pdr =
- reinterpret_cast<pldm_state_effecter_pdr*>(e.data());
+ reinterpret_cast<pldm_state_effecter_pdr*>(e.data);
EXPECT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
std::vector<set_effecter_state_field> stateField;
@@ -232,10 +218,13 @@
TEST(setStateEffecterStatesHandler, testBadRequest)
{
- Repo& pdrRepo = get("./pdr_jsons/state_effecter/good");
- pdr::Entry e = pdrRepo.at(1);
+ pdr_utils::Repo pdrRepo = pdr::getRepoByType(
+ "./pdr_jsons/state_effecter/good", PLDM_STATE_EFFECTER_PDR);
+ pdr_utils::PdrEntry e;
+ auto record1 = pdr::getRecordByHandle(pdrRepo, 1, e);
+ ASSERT_NE(record1, nullptr);
pldm_state_effecter_pdr* pdr =
- reinterpret_cast<pldm_state_effecter_pdr*>(e.data());
+ reinterpret_cast<pldm_state_effecter_pdr*>(e.data);
EXPECT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
std::vector<set_effecter_state_field> stateField;