diff --git a/oem/ibm/test/libpldmresponder_oem_platform_test.cpp b/oem/ibm/test/libpldmresponder_oem_platform_test.cpp
index aa84403..09132cf 100644
--- a/oem/ibm/test/libpldmresponder_oem_platform_test.cpp
+++ b/oem/ibm/test/libpldmresponder_oem_platform_test.cpp
@@ -29,7 +29,21 @@
     MOCK_METHOD(void, setVersions, (), (override));
 };
 
-TEST(oemSetStateEffecterStatesHandler, testGoodRequest)
+class MockOemPlatformHandler : public oem_ibm_platform::Handler
+{
+  public:
+    MockOemPlatformHandler(const pldm::utils::DBusHandler* dBusIntf,
+                           pldm::responder::CodeUpdate* codeUpdate, int mctp_fd,
+                           uint8_t mctp_eid, Requester& requester,
+                           sdeventplus::Event& event) :
+        oem_ibm_platform::Handler(dBusIntf, codeUpdate, mctp_fd, mctp_eid,
+                                  requester, event)
+    {}
+    MOCK_METHOD(uint16_t, getNextEffecterId, ());
+    MOCK_METHOD(uint16_t, getNextSensorId, ());
+};
+
+TEST(OemSetStateEffecterStatesHandler, testGoodRequest)
 {
     uint16_t entityID_ = PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE;
     uint16_t stateSetId_ = PLDM_OEM_IBM_BOOT_STATE;
@@ -165,3 +179,236 @@
     ASSERT_EQ(stat(filePath, &buffer), -1);
     ASSERT_EQ(stat(dirPath, &buffer), 0);
 }
+
+TEST(generateStateEffecterOEMPDR, testGoodRequest)
+{
+    auto inPDRRepo = pldm_pdr_init();
+    sdbusplus::bus::bus bus(sdbusplus::bus::new_default());
+    Requester requester(bus, "/abc/def");
+    auto mockDbusHandler = std::make_unique<MockdBusHandler>();
+    auto event = sdeventplus::Event::get_default();
+    std::unique_ptr<CodeUpdate> mockCodeUpdate =
+        std::make_unique<MockCodeUpdate>(mockDbusHandler.get());
+    std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
+
+    oemPlatformHandler = std::make_unique<oem_ibm_platform::Handler>(
+        mockDbusHandler.get(), mockCodeUpdate.get(), 0x1, 0x9, requester,
+        event);
+    std::unique_ptr<oem_ibm_platform::Handler> mockoemPlatformHandler =
+        std::make_unique<MockOemPlatformHandler>(mockDbusHandler.get(),
+                                                 mockCodeUpdate.get(), 0x1, 0x9,
+                                                 requester, event);
+    pldm::responder::oem_ibm_platform::Handler* oemIbmPlatformHandler =
+        dynamic_cast<pldm::responder::oem_ibm_platform::Handler*>(
+            oemPlatformHandler.get());
+    pldm::responder::platform::Handler* mckPltHandler =
+        reinterpret_cast<pldm::responder::platform::Handler*>(
+            mockoemPlatformHandler.get());
+    oemIbmPlatformHandler->setPlatformHandler(mckPltHandler);
+
+    Repo inRepo(inPDRRepo);
+
+    oemPlatformHandler->buildOEMPDR(inRepo);
+    ASSERT_EQ(inRepo.empty(), false);
+
+    pdr_utils::PdrEntry e;
+
+    // Test for effecter number 1, for current boot side state
+    auto record1 = pdr::getRecordByHandle(inRepo, 1, e);
+    ASSERT_NE(record1, nullptr);
+
+    pldm_state_effecter_pdr* pdr =
+        reinterpret_cast<pldm_state_effecter_pdr*>(e.data);
+
+    ASSERT_EQ(pdr->hdr.record_handle, 1);
+    ASSERT_EQ(pdr->hdr.version, 1);
+    ASSERT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
+    ASSERT_EQ(pdr->hdr.record_change_num, 0);
+    ASSERT_EQ(pdr->hdr.length, 16);
+    ASSERT_EQ(pdr->terminus_handle, BmcPldmTerminusHandle);
+    ASSERT_EQ(pdr->entity_type, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE);
+    ASSERT_EQ(pdr->entity_instance, 0);
+    ASSERT_EQ(pdr->container_id, 0);
+    ASSERT_EQ(pdr->effecter_semantic_id, 0);
+    ASSERT_EQ(pdr->effecter_init, PLDM_NO_INIT);
+    ASSERT_EQ(pdr->has_description_pdr, false);
+    ASSERT_EQ(pdr->composite_effecter_count, 1);
+    state_effecter_possible_states* states =
+        reinterpret_cast<state_effecter_possible_states*>(pdr->possible_states);
+    ASSERT_EQ(states->state_set_id, 32769);
+    ASSERT_EQ(states->possible_states_size, 2);
+    bitfield8_t bf1{};
+    bf1.byte = 6;
+    ASSERT_EQ(states->states[0].byte, bf1.byte);
+
+    // Test for effecter number 2, for next boot side state
+    auto record2 = pdr::getRecordByHandle(inRepo, 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);
+    ASSERT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
+    ASSERT_EQ(pdr->hdr.record_change_num, 0);
+    ASSERT_EQ(pdr->hdr.length, 16);
+    ASSERT_EQ(pdr->terminus_handle, BmcPldmTerminusHandle);
+    ASSERT_EQ(pdr->entity_type, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE);
+    ASSERT_EQ(pdr->entity_instance, 1);
+    ASSERT_EQ(pdr->container_id, 0);
+    ASSERT_EQ(pdr->effecter_semantic_id, 0);
+    ASSERT_EQ(pdr->effecter_init, PLDM_NO_INIT);
+    ASSERT_EQ(pdr->has_description_pdr, false);
+    ASSERT_EQ(pdr->composite_effecter_count, 1);
+    states =
+        reinterpret_cast<state_effecter_possible_states*>(pdr->possible_states);
+    ASSERT_EQ(states->state_set_id, 32769);
+    ASSERT_EQ(states->possible_states_size, 2);
+    bitfield8_t bf2{};
+    bf2.byte = 6;
+    ASSERT_EQ(states->states[0].byte, bf2.byte);
+
+    // Test for effecter number 3, for firmware update state control
+    auto record3 = pdr::getRecordByHandle(inRepo, 3, e);
+    ASSERT_NE(record3, nullptr);
+
+    pdr = reinterpret_cast<pldm_state_effecter_pdr*>(e.data);
+
+    ASSERT_EQ(pdr->hdr.record_handle, 3);
+    ASSERT_EQ(pdr->hdr.version, 1);
+    ASSERT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
+    ASSERT_EQ(pdr->hdr.record_change_num, 0);
+    ASSERT_EQ(pdr->hdr.length, 16);
+    ASSERT_EQ(pdr->terminus_handle, BmcPldmTerminusHandle);
+    ASSERT_EQ(pdr->entity_type, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE);
+    ASSERT_EQ(pdr->entity_instance, 0);
+    ASSERT_EQ(pdr->container_id, 0);
+    ASSERT_EQ(pdr->effecter_semantic_id, 0);
+    ASSERT_EQ(pdr->effecter_init, PLDM_NO_INIT);
+    ASSERT_EQ(pdr->has_description_pdr, false);
+    ASSERT_EQ(pdr->composite_effecter_count, 1);
+    states =
+        reinterpret_cast<state_effecter_possible_states*>(pdr->possible_states);
+    ASSERT_EQ(states->state_set_id, 32768);
+    ASSERT_EQ(states->possible_states_size, 2);
+    bitfield8_t bf3{};
+    bf3.byte = 126;
+    ASSERT_EQ(states->states[0].byte, bf3.byte);
+
+    pldm_pdr_destroy(inPDRRepo);
+}
+
+TEST(generateStateSensorOEMPDR, testGoodRequest)
+{
+    auto inPDRRepo = pldm_pdr_init();
+    sdbusplus::bus::bus bus(sdbusplus::bus::new_default());
+    Requester requester(bus, "/abc/def");
+
+    auto mockDbusHandler = std::make_unique<MockdBusHandler>();
+    auto event = sdeventplus::Event::get_default();
+    std::unique_ptr<CodeUpdate> mockCodeUpdate =
+        std::make_unique<MockCodeUpdate>(mockDbusHandler.get());
+    std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
+
+    oemPlatformHandler = std::make_unique<oem_ibm_platform::Handler>(
+        mockDbusHandler.get(), mockCodeUpdate.get(), 0x1, 0x9, requester,
+        event);
+    std::unique_ptr<oem_ibm_platform::Handler> mockoemPlatformHandler =
+        std::make_unique<MockOemPlatformHandler>(mockDbusHandler.get(),
+                                                 mockCodeUpdate.get(), 0x1, 0x9,
+                                                 requester, event);
+    pldm::responder::oem_ibm_platform::Handler* oemIbmPlatformHandler =
+        dynamic_cast<pldm::responder::oem_ibm_platform::Handler*>(
+            oemPlatformHandler.get());
+    pldm::responder::platform::Handler* mckPltHandler =
+        reinterpret_cast<pldm::responder::platform::Handler*>(
+            mockoemPlatformHandler.get());
+    oemIbmPlatformHandler->setPlatformHandler(mckPltHandler);
+    Repo inRepo(inPDRRepo);
+
+    oemPlatformHandler->buildOEMPDR(inRepo);
+    ASSERT_EQ(inRepo.empty(), false);
+
+    pdr_utils::PdrEntry e;
+
+    // Test for sensor number 1, for current boot side state
+    auto record1 = pdr::getRecordByHandle(inRepo, 4, e);
+    ASSERT_NE(record1, nullptr);
+
+    pldm_state_sensor_pdr* pdr =
+        reinterpret_cast<pldm_state_sensor_pdr*>(e.data);
+
+    ASSERT_EQ(pdr->hdr.record_handle, 4);
+    ASSERT_EQ(pdr->hdr.version, 1);
+    ASSERT_EQ(pdr->hdr.type, PLDM_STATE_SENSOR_PDR);
+    ASSERT_EQ(pdr->hdr.record_change_num, 0);
+    ASSERT_EQ(pdr->hdr.length, 14);
+    ASSERT_EQ(pdr->terminus_handle, BmcPldmTerminusHandle);
+    ASSERT_EQ(pdr->entity_type, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE);
+    ASSERT_EQ(pdr->entity_instance, 0);
+    ASSERT_EQ(pdr->container_id, 0);
+    ASSERT_EQ(pdr->sensor_init, PLDM_NO_INIT);
+    ASSERT_EQ(pdr->sensor_auxiliary_names_pdr, false);
+    ASSERT_EQ(pdr->composite_sensor_count, 1);
+    state_sensor_possible_states* states =
+        reinterpret_cast<state_sensor_possible_states*>(pdr->possible_states);
+    ASSERT_EQ(states->state_set_id, 32769);
+    ASSERT_EQ(states->possible_states_size, 2);
+    bitfield8_t bf1{};
+    bf1.byte = 6;
+    ASSERT_EQ(states->states[0].byte, bf1.byte);
+
+    // Test for sensor number 2, for next boot side state
+    auto record2 = pdr::getRecordByHandle(inRepo, 5, e);
+    ASSERT_NE(record2, nullptr);
+
+    pdr = reinterpret_cast<pldm_state_sensor_pdr*>(e.data);
+
+    ASSERT_EQ(pdr->hdr.record_handle, 5);
+    ASSERT_EQ(pdr->hdr.version, 1);
+    ASSERT_EQ(pdr->hdr.type, PLDM_STATE_SENSOR_PDR);
+    ASSERT_EQ(pdr->hdr.record_change_num, 0);
+    ASSERT_EQ(pdr->hdr.length, 14);
+    ASSERT_EQ(pdr->terminus_handle, BmcPldmTerminusHandle);
+    ASSERT_EQ(pdr->entity_type, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE);
+    ASSERT_EQ(pdr->entity_instance, 1);
+    ASSERT_EQ(pdr->container_id, 0);
+    ASSERT_EQ(pdr->sensor_init, PLDM_NO_INIT);
+    ASSERT_EQ(pdr->sensor_auxiliary_names_pdr, false);
+    ASSERT_EQ(pdr->composite_sensor_count, 1);
+    states =
+        reinterpret_cast<state_sensor_possible_states*>(pdr->possible_states);
+    ASSERT_EQ(states->state_set_id, 32769);
+    ASSERT_EQ(states->possible_states_size, 2);
+    bitfield8_t bf2{};
+    bf2.byte = 6;
+    ASSERT_EQ(states->states[0].byte, bf2.byte);
+
+    // Test for sensor number 3, for firmware update state control
+    auto record3 = pdr::getRecordByHandle(inRepo, 6, e);
+    ASSERT_NE(record3, nullptr);
+
+    pdr = reinterpret_cast<pldm_state_sensor_pdr*>(e.data);
+
+    ASSERT_EQ(pdr->hdr.record_handle, 6);
+    ASSERT_EQ(pdr->hdr.version, 1);
+    ASSERT_EQ(pdr->hdr.type, PLDM_STATE_SENSOR_PDR);
+    ASSERT_EQ(pdr->hdr.record_change_num, 0);
+    ASSERT_EQ(pdr->hdr.length, 14);
+    ASSERT_EQ(pdr->terminus_handle, BmcPldmTerminusHandle);
+    ASSERT_EQ(pdr->entity_type, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE);
+    ASSERT_EQ(pdr->entity_instance, 0);
+    ASSERT_EQ(pdr->container_id, 0);
+    ASSERT_EQ(pdr->sensor_init, PLDM_NO_INIT);
+    ASSERT_EQ(pdr->sensor_auxiliary_names_pdr, false);
+    ASSERT_EQ(pdr->composite_sensor_count, 1);
+    states =
+        reinterpret_cast<state_sensor_possible_states*>(pdr->possible_states);
+    ASSERT_EQ(states->state_set_id, 32768);
+    ASSERT_EQ(states->possible_states_size, 2);
+    bitfield8_t bf3{};
+    bf3.byte = 126;
+    ASSERT_EQ(states->states[0].byte, bf3.byte);
+
+    pldm_pdr_destroy(inPDRRepo);
+}
