xref: /openbmc/pldm/libpldmresponder/test/libpldmresponder_pdr_effecter_test.cpp (revision 5ea723773b102e5820fb638b27175b23705c1a05)
15327988eSTom Joseph #include "common/test/mocked_utils.hpp"
25327988eSTom Joseph #include "libpldmresponder/pdr_utils.hpp"
35327988eSTom Joseph #include "libpldmresponder/platform.hpp"
45327988eSTom Joseph 
5c453e164SGeorge Liu #include <libpldm/platform.h>
6c453e164SGeorge Liu 
75327988eSTom Joseph #include <sdbusplus/test/sdbus_mock.hpp>
85327988eSTom Joseph #include <sdeventplus/event.hpp>
95327988eSTom Joseph 
105327988eSTom Joseph #include <gtest/gtest.h>
115327988eSTom Joseph 
125327988eSTom Joseph using namespace pldm::responder;
135327988eSTom Joseph using namespace pldm::responder::platform;
145327988eSTom Joseph using namespace pldm::responder::pdr;
155327988eSTom Joseph using namespace pldm::responder::pdr_utils;
165079ac4aSBrad Bishop using namespace pldm::utils;
175327988eSTom Joseph 
185327988eSTom Joseph using ::testing::_;
195327988eSTom Joseph using ::testing::Return;
205327988eSTom Joseph using ::testing::StrEq;
215327988eSTom Joseph 
TEST(GeneratePDRByStateEffecter,testGoodJson)225327988eSTom Joseph TEST(GeneratePDRByStateEffecter, testGoodJson)
235327988eSTom Joseph {
245327988eSTom Joseph     MockdBusHandler mockedUtils;
255327988eSTom Joseph     EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
265327988eSTom Joseph         .Times(5)
275327988eSTom Joseph         .WillRepeatedly(Return("foo.bar"));
285327988eSTom Joseph 
295327988eSTom Joseph     auto inPDRRepo = pldm_pdr_init();
305327988eSTom Joseph     auto outPDRRepo = pldm_pdr_init();
315327988eSTom Joseph     Repo outRepo(outPDRRepo);
325327988eSTom Joseph     auto event = sdeventplus::Event::get_default();
3390314a3fSSagar Srinivas     Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
3490314a3fSSagar Srinivas                     inPDRRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
35a881c170SGeorge Liu                     event);
365327988eSTom Joseph     Repo inRepo(inPDRRepo);
375327988eSTom Joseph     getRepoByType(inRepo, outRepo, PLDM_STATE_EFFECTER_PDR);
385327988eSTom Joseph 
395327988eSTom Joseph     // 2 entries
405327988eSTom Joseph     ASSERT_EQ(outRepo.getRecordCount(), 2);
415327988eSTom Joseph 
425327988eSTom Joseph     // Check first PDR
435327988eSTom Joseph     pdr_utils::PdrEntry e;
445327988eSTom Joseph     auto record2 = pdr::getRecordByHandle(outRepo, 2, e);
455327988eSTom Joseph     ASSERT_NE(record2, nullptr);
46*5ea72377SPavithra Barithaya     pldm_state_effecter_pdr* pdr = new (e.data) pldm_state_effecter_pdr;
475327988eSTom Joseph 
485327988eSTom Joseph     ASSERT_EQ(pdr->hdr.record_handle, 2);
495327988eSTom Joseph     ASSERT_EQ(pdr->hdr.version, 1);
505327988eSTom Joseph     ASSERT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
515327988eSTom Joseph     ASSERT_EQ(pdr->hdr.record_change_num, 0);
525327988eSTom Joseph     ASSERT_EQ(pdr->hdr.length, 23);
535327988eSTom Joseph 
54cc5f1586SManojkiran Eda     ASSERT_EQ(pdr->terminus_handle, TERMINUS_HANDLE);
555327988eSTom Joseph     ASSERT_EQ(pdr->effecter_id, 1);
565327988eSTom Joseph     ASSERT_EQ(pdr->entity_type, 33);
575327988eSTom Joseph     ASSERT_EQ(pdr->entity_instance, 0);
585327988eSTom Joseph     ASSERT_EQ(pdr->container_id, 0);
595327988eSTom Joseph     ASSERT_EQ(pdr->effecter_semantic_id, 0);
605327988eSTom Joseph     ASSERT_EQ(pdr->effecter_init, PLDM_NO_INIT);
615327988eSTom Joseph     ASSERT_EQ(pdr->has_description_pdr, false);
625327988eSTom Joseph     ASSERT_EQ(pdr->composite_effecter_count, 2);
63*5ea72377SPavithra Barithaya     state_effecter_possible_states* states = new (pdr->possible_states)
64*5ea72377SPavithra Barithaya         state_effecter_possible_states;
655327988eSTom Joseph     ASSERT_EQ(states->state_set_id, 196);
665327988eSTom Joseph     ASSERT_EQ(states->possible_states_size, 1);
675327988eSTom Joseph     bitfield8_t bf1{};
685327988eSTom Joseph     bf1.byte = 2;
695327988eSTom Joseph     ASSERT_EQ(states->states[0].byte, bf1.byte);
705327988eSTom Joseph 
7116c2a0a0SPatrick Williams     const auto& [dbusMappings1, dbusValMaps1] =
7216c2a0a0SPatrick Williams         handler.getDbusObjMaps(pdr->effecter_id);
735327988eSTom Joseph     ASSERT_EQ(dbusMappings1[0].objectPath, "/foo/bar");
745327988eSTom Joseph 
755327988eSTom Joseph     // Check second PDR
765327988eSTom Joseph     auto record3 = pdr::getRecordByHandle(outRepo, 3, e);
775327988eSTom Joseph     ASSERT_NE(record3, nullptr);
78*5ea72377SPavithra Barithaya     pdr = new (e.data) pldm_state_effecter_pdr;
795327988eSTom Joseph 
805327988eSTom Joseph     ASSERT_EQ(pdr->hdr.record_handle, 3);
815327988eSTom Joseph     ASSERT_EQ(pdr->hdr.version, 1);
825327988eSTom Joseph     ASSERT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
835327988eSTom Joseph     ASSERT_EQ(pdr->hdr.record_change_num, 0);
845327988eSTom Joseph     ASSERT_EQ(pdr->hdr.length, 24);
855327988eSTom Joseph 
86cc5f1586SManojkiran Eda     ASSERT_EQ(pdr->terminus_handle, TERMINUS_HANDLE);
875327988eSTom Joseph     ASSERT_EQ(pdr->effecter_id, 2);
885327988eSTom Joseph     ASSERT_EQ(pdr->entity_type, 100);
895327988eSTom Joseph     ASSERT_EQ(pdr->entity_instance, 0);
905327988eSTom Joseph     ASSERT_EQ(pdr->container_id, 0);
915327988eSTom Joseph     ASSERT_EQ(pdr->effecter_semantic_id, 0);
925327988eSTom Joseph     ASSERT_EQ(pdr->effecter_init, PLDM_NO_INIT);
935327988eSTom Joseph     ASSERT_EQ(pdr->has_description_pdr, false);
945327988eSTom Joseph     ASSERT_EQ(pdr->composite_effecter_count, 2);
95*5ea72377SPavithra Barithaya     states = new (pdr->possible_states) state_effecter_possible_states;
965327988eSTom Joseph     ASSERT_EQ(states->state_set_id, 197);
975327988eSTom Joseph     ASSERT_EQ(states->possible_states_size, 1);
985327988eSTom Joseph     bf1.byte = 2;
995327988eSTom Joseph     ASSERT_EQ(states->states[0].byte, bf1.byte);
100*5ea72377SPavithra Barithaya     states = new (pdr->possible_states + sizeof(state_effecter_possible_states))
101*5ea72377SPavithra Barithaya         state_effecter_possible_states;
1025327988eSTom Joseph     ASSERT_EQ(states->state_set_id, 198);
1035327988eSTom Joseph     ASSERT_EQ(states->possible_states_size, 2);
1045327988eSTom Joseph     bitfield8_t bf2[2];
1055327988eSTom Joseph     bf2[0].byte = 38;
1065327988eSTom Joseph     bf2[1].byte = 128;
1075327988eSTom Joseph     ASSERT_EQ(states->states[0].byte, bf2[0].byte);
1085327988eSTom Joseph     ASSERT_EQ(states->states[1].byte, bf2[1].byte);
1095327988eSTom Joseph 
11016c2a0a0SPatrick Williams     const auto& [dbusMappings2, dbusValMaps2] =
11116c2a0a0SPatrick Williams         handler.getDbusObjMaps(pdr->effecter_id);
1125327988eSTom Joseph     ASSERT_EQ(dbusMappings2[0].objectPath, "/foo/bar");
1135327988eSTom Joseph     ASSERT_EQ(dbusMappings2[1].objectPath, "/foo/bar");
1145327988eSTom Joseph 
1155327988eSTom Joseph     ASSERT_THROW(handler.getDbusObjMaps(0xDEAD), std::exception);
1165327988eSTom Joseph 
1175327988eSTom Joseph     pldm_pdr_destroy(inPDRRepo);
1185327988eSTom Joseph     pldm_pdr_destroy(outPDRRepo);
1195327988eSTom Joseph }
1205327988eSTom Joseph 
TEST(GeneratePDRByNumericEffecter,testGoodJson)1215327988eSTom Joseph TEST(GeneratePDRByNumericEffecter, testGoodJson)
1225327988eSTom Joseph {
1235327988eSTom Joseph     MockdBusHandler mockedUtils;
1245327988eSTom Joseph     EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
1255327988eSTom Joseph         .Times(5)
1265327988eSTom Joseph         .WillRepeatedly(Return("foo.bar"));
1275327988eSTom Joseph 
1285327988eSTom Joseph     auto inPDRRepo = pldm_pdr_init();
1295327988eSTom Joseph     auto outPDRRepo = pldm_pdr_init();
1305327988eSTom Joseph     Repo outRepo(outPDRRepo);
1315327988eSTom Joseph     auto event = sdeventplus::Event::get_default();
13290314a3fSSagar Srinivas     Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
13390314a3fSSagar Srinivas                     inPDRRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
134a881c170SGeorge Liu                     event);
1355327988eSTom Joseph     Repo inRepo(inPDRRepo);
1365327988eSTom Joseph     getRepoByType(inRepo, outRepo, PLDM_NUMERIC_EFFECTER_PDR);
1375327988eSTom Joseph 
1385327988eSTom Joseph     // 1 entries
1395327988eSTom Joseph     ASSERT_EQ(outRepo.getRecordCount(), 1);
1405327988eSTom Joseph 
1415327988eSTom Joseph     // Check first PDR
1425327988eSTom Joseph     pdr_utils::PdrEntry e;
1435327988eSTom Joseph     auto record = pdr::getRecordByHandle(outRepo, 4, e);
1445327988eSTom Joseph     ASSERT_NE(record, nullptr);
1455327988eSTom Joseph 
146*5ea72377SPavithra Barithaya     pldm_numeric_effecter_value_pdr* pdr = new (e.data)
147*5ea72377SPavithra Barithaya         pldm_numeric_effecter_value_pdr;
1485327988eSTom Joseph     EXPECT_EQ(pdr->hdr.record_handle, 4);
1495327988eSTom Joseph     EXPECT_EQ(pdr->hdr.version, 1);
1505327988eSTom Joseph     EXPECT_EQ(pdr->hdr.type, PLDM_NUMERIC_EFFECTER_PDR);
1515327988eSTom Joseph     EXPECT_EQ(pdr->hdr.record_change_num, 0);
1525327988eSTom Joseph     EXPECT_EQ(pdr->hdr.length,
1535327988eSTom Joseph               sizeof(pldm_numeric_effecter_value_pdr) - sizeof(pldm_pdr_hdr));
1545327988eSTom Joseph 
1555327988eSTom Joseph     EXPECT_EQ(pdr->effecter_id, 3);
1565327988eSTom Joseph     EXPECT_EQ(pdr->effecter_data_size, 4);
1575327988eSTom Joseph 
15816c2a0a0SPatrick Williams     const auto& [dbusMappings, dbusValMaps] =
15916c2a0a0SPatrick Williams         handler.getDbusObjMaps(pdr->effecter_id);
1605327988eSTom Joseph     EXPECT_EQ(dbusMappings[0].objectPath, "/foo/bar");
1615327988eSTom Joseph     EXPECT_EQ(dbusMappings[0].interface, "xyz.openbmc_project.Foo.Bar");
1625327988eSTom Joseph     EXPECT_EQ(dbusMappings[0].propertyName, "propertyName");
1635327988eSTom Joseph     EXPECT_EQ(dbusMappings[0].propertyType, "uint64_t");
1645327988eSTom Joseph 
1655327988eSTom Joseph     pldm_pdr_destroy(inPDRRepo);
1665327988eSTom Joseph     pldm_pdr_destroy(outPDRRepo);
1675327988eSTom Joseph }
1685327988eSTom Joseph 
TEST(GeneratePDR,testMalformedJson)1695327988eSTom Joseph TEST(GeneratePDR, testMalformedJson)
1705327988eSTom Joseph {
1715327988eSTom Joseph     MockdBusHandler mockedUtils;
1725327988eSTom Joseph     EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
1735327988eSTom Joseph         .Times(5)
1745327988eSTom Joseph         .WillRepeatedly(Return("foo.bar"));
1755327988eSTom Joseph 
1765327988eSTom Joseph     auto inPDRRepo = pldm_pdr_init();
1775327988eSTom Joseph     auto outPDRRepo = pldm_pdr_init();
1785327988eSTom Joseph     Repo outRepo(outPDRRepo);
1795327988eSTom Joseph     auto event = sdeventplus::Event::get_default();
18090314a3fSSagar Srinivas     Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
18190314a3fSSagar Srinivas                     inPDRRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
182a881c170SGeorge Liu                     event);
1835327988eSTom Joseph     Repo inRepo(inPDRRepo);
1845327988eSTom Joseph     getRepoByType(inRepo, outRepo, PLDM_STATE_EFFECTER_PDR);
1855327988eSTom Joseph 
1865327988eSTom Joseph     ASSERT_EQ(outRepo.getRecordCount(), 2);
1875327988eSTom Joseph     ASSERT_THROW(pdr_utils::readJson("./pdr_jsons/state_effecter/malformed"),
1885327988eSTom Joseph                  std::exception);
1895327988eSTom Joseph 
1905327988eSTom Joseph     pldm_pdr_destroy(inPDRRepo);
1915327988eSTom Joseph     pldm_pdr_destroy(outPDRRepo);
1925327988eSTom Joseph }
1935327988eSTom Joseph 
TEST(findStateEffecterId,goodJson)1945327988eSTom Joseph TEST(findStateEffecterId, goodJson)
1955327988eSTom Joseph {
1965327988eSTom Joseph     MockdBusHandler mockedUtils;
1975327988eSTom Joseph     EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
1985327988eSTom Joseph         .Times(5)
1995327988eSTom Joseph         .WillRepeatedly(Return("foo.bar"));
2005327988eSTom Joseph 
2015327988eSTom Joseph     auto inPDRRepo = pldm_pdr_init();
2025327988eSTom Joseph     auto event = sdeventplus::Event::get_default();
20390314a3fSSagar Srinivas     Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
20490314a3fSSagar Srinivas                     inPDRRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
205a881c170SGeorge Liu                     event);
2065327988eSTom Joseph     uint16_t entityType = 33;
2075327988eSTom Joseph     uint16_t entityInstance = 0;
2085327988eSTom Joseph     uint16_t containerId = 0;
2095327988eSTom Joseph     uint16_t stateSetId = 196;
2105327988eSTom Joseph     auto effecterId = findStateEffecterId(inPDRRepo, entityType, entityInstance,
2115327988eSTom Joseph                                           containerId, stateSetId, true);
2125327988eSTom Joseph     ASSERT_EQ(effecterId, 1);
2135327988eSTom Joseph     stateSetId = 300;
2145327988eSTom Joseph     effecterId = findStateEffecterId(inPDRRepo, entityType, entityInstance,
2155327988eSTom Joseph                                      containerId, stateSetId, true);
2165327988eSTom Joseph     ASSERT_EQ(effecterId, PLDM_INVALID_EFFECTER_ID);
2175327988eSTom Joseph     pldm_pdr_destroy(inPDRRepo);
2185327988eSTom Joseph }
219