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