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);
+}