Platform: Unit tests for OEM PDRs

Signed-off-by: Sagar Srinivas <sagar.srinivas@ibm.com>
Change-Id: Ie2aa3fc910c524079b0d658aabcb4dd778230cab
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);
+}