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_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;