Implement PDR.FindStateEffecterPDR DBus API

This commit implements a DBus API defined at
https://gerrit.openbmc-project.xyz/c/openbmc/phosphor-dbus-interfaces/+/31774
to find the stateEffecterPDR based on the entity ID
and stateSetID.

Tested: Unit tests and in witherspoon system
busctl call :1.187 /xyz/openbmc_project/pldm xyz.openbmc_project.PLDM.PDR FindStateEffecterPDR yqq 1 33 196
aay 1 29 1 0 0 0 1 11 0 0 19 0 0 0 1 0 33 0 0 0 0 0 0 0 0 0 1 196 0 1 6

busctl call :1.187 /xyz/openbmc_project/pldm xyz.openbmc_project.PLDM.PDR FindStateEffecterPDR yqq 1 31 129
aay 1 29 3 0 0 0 1 11 0 0 19 0 0 0 3 0 31 0 0 0 0 0 0 0 0 0 1 129 0 1 64

Change-Id: I5c15be5303b511465c36914f5b60a0957cd3857e
Signed-off-by: Pavithra Barithaya <pbaritha@in.ibm.com>
diff --git a/test/pldm_utils_test.cpp b/test/pldm_utils_test.cpp
index c880c20..4af91d1 100644
--- a/test/pldm_utils_test.cpp
+++ b/test/pldm_utils_test.cpp
@@ -1,5 +1,7 @@
 #include "utils.hpp"
 
+#include "libpldm/platform.h"
+
 #include <gtest/gtest.h>
 
 using namespace pldm::utils;
@@ -77,3 +79,404 @@
 
     EXPECT_EQ(effecterField, std::nullopt);
 }
+
+TEST(FindStateEffecterPDR, testOneMatch)
+{
+
+    auto repo = pldm_pdr_init();
+    uint8_t tid = 1;
+    uint16_t entityID = 33;
+    uint16_t stateSetId = 196;
+
+    std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
+                             sizeof(uint8_t) +
+                             sizeof(struct state_effecter_possible_states));
+
+    auto rec = reinterpret_cast<pldm_state_effecter_pdr*>(pdr.data());
+
+    auto state =
+        reinterpret_cast<state_effecter_possible_states*>(rec->possible_states);
+
+    rec->hdr.type = 11;
+    rec->hdr.record_handle = 1;
+    rec->entity_type = 33;
+    rec->container_id = 0;
+    rec->composite_effecter_count = 1;
+    state->state_set_id = 196;
+    state->possible_states_size = 1;
+
+    pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false);
+
+    auto record = findStateEffecterPDR(tid, entityID, stateSetId, repo);
+
+    EXPECT_EQ(pdr, record[0]);
+
+    pldm_pdr_destroy(repo);
+}
+
+TEST(FindStateEffecterPDR, testNoMatch)
+{
+
+    auto repo = pldm_pdr_init();
+    uint8_t tid = 1;
+    uint16_t entityID = 44;
+    uint16_t stateSetId = 196;
+
+    std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
+                             sizeof(uint8_t) +
+                             sizeof(struct state_effecter_possible_states));
+
+    auto rec = reinterpret_cast<pldm_state_effecter_pdr*>(pdr.data());
+
+    auto state =
+        reinterpret_cast<state_effecter_possible_states*>(rec->possible_states);
+
+    rec->hdr.type = 11;
+    rec->hdr.record_handle = 1;
+    rec->entity_type = 33;
+    rec->container_id = 0;
+    rec->composite_effecter_count = 1;
+    state->state_set_id = 196;
+    state->possible_states_size = 1;
+
+    pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false);
+
+    auto record = findStateEffecterPDR(tid, entityID, stateSetId, repo);
+
+    EXPECT_EQ(record.empty(), true);
+
+    pldm_pdr_destroy(repo);
+}
+
+TEST(FindStateEffecterPDR, testEmptyRepo)
+{
+
+    auto repo = pldm_pdr_init();
+    uint8_t tid = 1;
+    uint16_t entityID = 33;
+    uint16_t stateSetId = 196;
+
+    std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
+                             sizeof(uint8_t) +
+                             sizeof(struct state_effecter_possible_states));
+
+    auto record = findStateEffecterPDR(tid, entityID, stateSetId, repo);
+
+    EXPECT_EQ(record.empty(), true);
+
+    pldm_pdr_destroy(repo);
+}
+
+TEST(FindStateEffecterPDR, testMoreMatch)
+{
+
+    auto repo = pldm_pdr_init();
+    uint8_t tid = 1;
+
+    std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
+                             sizeof(uint8_t) +
+                             sizeof(struct state_effecter_possible_states));
+
+    auto rec = reinterpret_cast<pldm_state_effecter_pdr*>(pdr.data());
+
+    auto state =
+        reinterpret_cast<state_effecter_possible_states*>(rec->possible_states);
+
+    rec->hdr.type = 11;
+    rec->hdr.record_handle = 1;
+    rec->entity_type = 31;
+    rec->container_id = 0;
+    rec->composite_effecter_count = 1;
+    state->state_set_id = 129;
+    state->possible_states_size = 1;
+
+    pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false);
+
+    std::vector<uint8_t> pdr_second(
+        sizeof(struct pldm_state_effecter_pdr) - sizeof(uint8_t) +
+        sizeof(struct state_effecter_possible_states));
+
+    auto rec_second =
+        reinterpret_cast<pldm_state_effecter_pdr*>(pdr_second.data());
+
+    auto state_second = reinterpret_cast<state_effecter_possible_states*>(
+        rec_second->possible_states);
+
+    rec_second->hdr.type = 11;
+    rec_second->hdr.record_handle = 2;
+    rec_second->entity_type = 31;
+    rec_second->container_id = 0;
+    rec_second->composite_effecter_count = 1;
+    state_second->state_set_id = 129;
+    state_second->possible_states_size = 1;
+
+    pldm_pdr_add(repo, pdr_second.data(), pdr_second.size(), 0, false);
+
+    uint16_t entityID_ = 31;
+    uint16_t stateSetId_ = 129;
+
+    auto record = findStateEffecterPDR(tid, entityID_, stateSetId_, repo);
+
+    EXPECT_EQ(pdr, record[0]);
+    EXPECT_EQ(pdr_second, record[1]);
+
+    pldm_pdr_destroy(repo);
+}
+
+TEST(FindStateEffecterPDR, testManyNoMatch)
+{
+
+    auto repo = pldm_pdr_init();
+    uint8_t tid = 1;
+    uint16_t entityID = 33;
+    uint16_t stateSetId = 196;
+
+    std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
+                             sizeof(uint8_t) +
+                             sizeof(struct state_effecter_possible_states));
+
+    auto rec = reinterpret_cast<pldm_state_effecter_pdr*>(pdr.data());
+
+    auto state =
+        reinterpret_cast<state_effecter_possible_states*>(rec->possible_states);
+
+    rec->hdr.type = 11;
+    rec->hdr.record_handle = 1;
+    rec->entity_type = 34;
+    rec->container_id = 0;
+    rec->composite_effecter_count = 1;
+    state->state_set_id = 198;
+    state->possible_states_size = 1;
+
+    pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false);
+
+    std::vector<uint8_t> pdr_second(
+        sizeof(struct pldm_state_effecter_pdr) - sizeof(uint8_t) +
+        sizeof(struct state_effecter_possible_states));
+
+    auto rec_second =
+        reinterpret_cast<pldm_state_effecter_pdr*>(pdr_second.data());
+
+    auto state_second = reinterpret_cast<state_effecter_possible_states*>(
+        rec_second->possible_states);
+
+    rec_second->hdr.type = 11;
+    rec_second->hdr.record_handle = 2;
+    rec_second->entity_type = 39;
+    rec_second->container_id = 0;
+    rec_second->composite_effecter_count = 1;
+    state_second->state_set_id = 169;
+    state_second->possible_states_size = 1;
+
+    pldm_pdr_add(repo, pdr_second.data(), pdr_second.size(), 0, false);
+
+    auto record = findStateEffecterPDR(tid, entityID, stateSetId, repo);
+
+    EXPECT_EQ(record.empty(), true);
+
+    pldm_pdr_destroy(repo);
+}
+
+TEST(FindStateEffecterPDR, testOneMatchOneNoMatch)
+{
+    auto repo = pldm_pdr_init();
+    uint8_t tid = 1;
+    uint16_t entityID = 67;
+    uint16_t stateSetId = 192;
+
+    std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
+                             sizeof(uint8_t) +
+                             sizeof(struct state_effecter_possible_states));
+
+    auto rec = reinterpret_cast<pldm_state_effecter_pdr*>(pdr.data());
+
+    auto state =
+        reinterpret_cast<state_effecter_possible_states*>(rec->possible_states);
+
+    rec->hdr.type = 11;
+    rec->hdr.record_handle = 1;
+    rec->entity_type = 32;
+    rec->container_id = 0;
+    rec->composite_effecter_count = 1;
+    state->state_set_id = 198;
+    state->possible_states_size = 1;
+
+    pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false);
+
+    std::vector<uint8_t> pdr_second(
+        sizeof(struct pldm_state_effecter_pdr) - sizeof(uint8_t) +
+        sizeof(struct state_effecter_possible_states));
+
+    auto rec_second =
+        reinterpret_cast<pldm_state_effecter_pdr*>(pdr_second.data());
+
+    auto state_second = reinterpret_cast<state_effecter_possible_states*>(
+        rec_second->possible_states);
+
+    rec_second->hdr.type = 11;
+    rec_second->hdr.record_handle = 2;
+    rec_second->entity_type = 67;
+    rec_second->container_id = 0;
+    rec_second->composite_effecter_count = 1;
+    state_second->state_set_id = 192;
+    state_second->possible_states_size = 1;
+
+    pldm_pdr_add(repo, pdr_second.data(), pdr_second.size(), 0, false);
+
+    auto record = findStateEffecterPDR(tid, entityID, stateSetId, repo);
+
+    EXPECT_EQ(pdr_second, record[0]);
+    EXPECT_EQ(record.size(), 1);
+
+    pldm_pdr_destroy(repo);
+}
+
+TEST(FindStateEffecterPDR, testOneMatchManyNoMatch)
+{
+    auto repo = pldm_pdr_init();
+    uint8_t tid = 1;
+    uint16_t entityID = 67;
+    uint16_t stateSetId = 192;
+
+    std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
+                             sizeof(uint8_t) +
+                             sizeof(struct state_effecter_possible_states));
+
+    auto rec = reinterpret_cast<pldm_state_effecter_pdr*>(pdr.data());
+
+    auto state =
+        reinterpret_cast<state_effecter_possible_states*>(rec->possible_states);
+
+    rec->hdr.type = 11;
+    rec->hdr.record_handle = 1;
+    rec->entity_type = 32;
+    rec->container_id = 0;
+    rec->composite_effecter_count = 1;
+    state->state_set_id = 198;
+    state->possible_states_size = 1;
+
+    pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false);
+
+    std::vector<uint8_t> pdr_second(
+        sizeof(struct pldm_state_effecter_pdr) - sizeof(uint8_t) +
+        sizeof(struct state_effecter_possible_states));
+
+    auto rec_second =
+        reinterpret_cast<pldm_state_effecter_pdr*>(pdr_second.data());
+
+    auto state_second = reinterpret_cast<state_effecter_possible_states*>(
+        rec_second->possible_states);
+
+    rec_second->hdr.type = 11;
+    rec_second->hdr.record_handle = 2;
+    rec_second->entity_type = 67;
+    rec_second->container_id = 0;
+    rec_second->composite_effecter_count = 1;
+    state_second->state_set_id = 192;
+    state_second->possible_states_size = 1;
+
+    pldm_pdr_add(repo, pdr_second.data(), pdr_second.size(), 0, false);
+
+    std::vector<uint8_t> pdr_third(
+        sizeof(struct pldm_state_effecter_pdr) - sizeof(uint8_t) +
+        sizeof(struct state_effecter_possible_states));
+
+    auto rec_third =
+        reinterpret_cast<pldm_state_effecter_pdr*>(pdr_third.data());
+
+    auto state_third = reinterpret_cast<state_effecter_possible_states*>(
+        rec_third->possible_states);
+
+    rec_third->hdr.type = 11;
+    rec_third->hdr.record_handle = 3;
+    rec_third->entity_type = 69;
+    rec_third->container_id = 0;
+    rec_third->composite_effecter_count = 1;
+    state_third->state_set_id = 199;
+    state_third->possible_states_size = 1;
+
+    auto record = findStateEffecterPDR(tid, entityID, stateSetId, repo);
+
+    EXPECT_EQ(pdr_second, record[0]);
+    EXPECT_EQ(record.size(), 1);
+
+    pldm_pdr_destroy(repo);
+}
+
+TEST(FindStateEffecterPDR, testCompositeEffecter)
+{
+    auto repo = pldm_pdr_init();
+    uint8_t tid = 1;
+    uint16_t entityID = 67;
+    uint16_t stateSetId = 192;
+
+    std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
+                             sizeof(uint8_t) +
+                             sizeof(struct state_effecter_possible_states));
+
+    auto rec = reinterpret_cast<pldm_state_effecter_pdr*>(pdr.data());
+
+    auto state =
+        reinterpret_cast<state_effecter_possible_states*>(rec->possible_states);
+
+    rec->hdr.type = 11;
+    rec->hdr.record_handle = 1;
+    rec->entity_type = 67;
+    rec->container_id = 0;
+    rec->composite_effecter_count = 3;
+    state->state_set_id = 198;
+    state->possible_states_size = 1;
+
+    state->state_set_id = 193;
+    state->possible_states_size = 1;
+
+    state->state_set_id = 192;
+    state->possible_states_size = 1;
+
+    pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false);
+
+    auto record = findStateEffecterPDR(tid, entityID, stateSetId, repo);
+
+    EXPECT_EQ(pdr, record[0]);
+
+    pldm_pdr_destroy(repo);
+}
+
+TEST(FindStateEffecterPDR, testNoMatchCompositeEffecter)
+{
+    auto repo = pldm_pdr_init();
+    uint8_t tid = 1;
+    uint16_t entityID = 67;
+    uint16_t stateSetId = 192;
+
+    std::vector<uint8_t> pdr(sizeof(struct pldm_state_effecter_pdr) -
+                             sizeof(uint8_t) +
+                             sizeof(struct state_effecter_possible_states));
+
+    auto rec = reinterpret_cast<pldm_state_effecter_pdr*>(pdr.data());
+
+    auto state =
+        reinterpret_cast<state_effecter_possible_states*>(rec->possible_states);
+
+    rec->hdr.type = 11;
+    rec->hdr.record_handle = 1;
+    rec->entity_type = 34;
+    rec->container_id = 0;
+    rec->composite_effecter_count = 3;
+    state->state_set_id = 198;
+    state->possible_states_size = 1;
+
+    state->state_set_id = 193;
+    state->possible_states_size = 1;
+
+    state->state_set_id = 123;
+    state->possible_states_size = 1;
+
+    pldm_pdr_add(repo, pdr.data(), pdr.size(), 0, false);
+
+    auto record = findStateEffecterPDR(tid, entityID, stateSetId, repo);
+
+    EXPECT_EQ(record.empty(), true);
+
+    pldm_pdr_destroy(repo);
+}