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