blob: 6ef74b76f95ea075cd9d3abfb8121d5c452cef0f [file] [log] [blame]
Tom Joseph53279882021-04-28 06:29:13 -07001#include "common/test/mocked_utils.hpp"
George Liue53193f2020-02-24 09:23:26 +08002#include "libpldmresponder/pdr_utils.hpp"
Deepak Kodihallic682fe22020-03-04 00:42:54 -06003#include "libpldmresponder/platform.hpp"
George Liu36e81352020-07-01 14:40:30 +08004
George Liuc453e162022-12-21 17:16:23 +08005#include <libpldm/platform.h>
6
George Liu36e81352020-07-01 14:40:30 +08007#include <sdbusplus/test/sdbus_mock.hpp>
Sampa Misra5fb37d52021-03-06 07:26:00 -06008#include <sdeventplus/event.hpp>
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -05009
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -050010#include <gtest/gtest.h>
11
12using namespace pldm::responder;
Deepak Kodihallic682fe22020-03-04 00:42:54 -060013using namespace pldm::responder::platform;
14using namespace pldm::responder::pdr;
15using namespace pldm::responder::pdr_utils;
Brad Bishop5079ac42021-08-19 18:35:06 -040016using namespace pldm::utils;
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -050017
George Liu36e81352020-07-01 14:40:30 +080018using ::testing::_;
19using ::testing::Return;
20using ::testing::StrEq;
21
George Liu456c9a22020-01-13 11:36:22 +080022TEST(GeneratePDRByStateEffecter, testGoodJson)
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -050023{
George Liu36e81352020-07-01 14:40:30 +080024 MockdBusHandler mockedUtils;
25 EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
26 .Times(5)
27 .WillRepeatedly(Return("foo.bar"));
28
Deepak Kodihallic682fe22020-03-04 00:42:54 -060029 auto inPDRRepo = pldm_pdr_init();
30 auto outPDRRepo = pldm_pdr_init();
31 Repo outRepo(outPDRRepo);
Sampa Misra5fb37d52021-03-06 07:26:00 -060032 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -050033 Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
34 inPDRRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +080035 event);
Deepak Kodihallic682fe22020-03-04 00:42:54 -060036 Repo inRepo(inPDRRepo);
37 getRepoByType(inRepo, outRepo, PLDM_STATE_EFFECTER_PDR);
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -050038
39 // 2 entries
Deepak Kodihallic682fe22020-03-04 00:42:54 -060040 ASSERT_EQ(outRepo.getRecordCount(), 2);
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -050041
42 // Check first PDR
George Liue53193f2020-02-24 09:23:26 +080043 pdr_utils::PdrEntry e;
Sampa Misra12afe112020-05-25 11:40:44 -050044 auto record2 = pdr::getRecordByHandle(outRepo, 2, e);
45 ASSERT_NE(record2, nullptr);
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -050046 pldm_state_effecter_pdr* pdr =
George Liue53193f2020-02-24 09:23:26 +080047 reinterpret_cast<pldm_state_effecter_pdr*>(e.data);
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -050048
Sampa Misra12afe112020-05-25 11:40:44 -050049 ASSERT_EQ(pdr->hdr.record_handle, 2);
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -050050 ASSERT_EQ(pdr->hdr.version, 1);
51 ASSERT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
52 ASSERT_EQ(pdr->hdr.record_change_num, 0);
Sampa Misraa2fa0702019-05-31 01:28:55 -050053 ASSERT_EQ(pdr->hdr.length, 23);
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -050054
Manojkiran Edacc5f1582021-09-29 17:03:06 +053055 ASSERT_EQ(pdr->terminus_handle, TERMINUS_HANDLE);
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -050056 ASSERT_EQ(pdr->effecter_id, 1);
57 ASSERT_EQ(pdr->entity_type, 33);
58 ASSERT_EQ(pdr->entity_instance, 0);
59 ASSERT_EQ(pdr->container_id, 0);
60 ASSERT_EQ(pdr->effecter_semantic_id, 0);
61 ASSERT_EQ(pdr->effecter_init, PLDM_NO_INIT);
62 ASSERT_EQ(pdr->has_description_pdr, false);
Sampa Misraa2fa0702019-05-31 01:28:55 -050063 ASSERT_EQ(pdr->composite_effecter_count, 2);
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -050064 state_effecter_possible_states* states =
65 reinterpret_cast<state_effecter_possible_states*>(pdr->possible_states);
66 ASSERT_EQ(states->state_set_id, 196);
67 ASSERT_EQ(states->possible_states_size, 1);
68 bitfield8_t bf1{};
69 bf1.byte = 2;
70 ASSERT_EQ(states->states[0].byte, bf1.byte);
71
Patrick Williams6da4f912023-05-10 07:50:53 -050072 const auto& [dbusMappings1,
73 dbusValMaps1] = handler.getDbusObjMaps(pdr->effecter_id);
George Liu1ec85d42020-02-12 16:05:32 +080074 ASSERT_EQ(dbusMappings1[0].objectPath, "/foo/bar");
Deepak Kodihallid0782962019-05-07 16:36:47 +053075
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -050076 // Check second PDR
Sampa Misra12afe112020-05-25 11:40:44 -050077 auto record3 = pdr::getRecordByHandle(outRepo, 3, e);
78 ASSERT_NE(record3, nullptr);
George Liue53193f2020-02-24 09:23:26 +080079 pdr = reinterpret_cast<pldm_state_effecter_pdr*>(e.data);
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -050080
Sampa Misra12afe112020-05-25 11:40:44 -050081 ASSERT_EQ(pdr->hdr.record_handle, 3);
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -050082 ASSERT_EQ(pdr->hdr.version, 1);
83 ASSERT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
84 ASSERT_EQ(pdr->hdr.record_change_num, 0);
85 ASSERT_EQ(pdr->hdr.length, 24);
86
Manojkiran Edacc5f1582021-09-29 17:03:06 +053087 ASSERT_EQ(pdr->terminus_handle, TERMINUS_HANDLE);
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -050088 ASSERT_EQ(pdr->effecter_id, 2);
89 ASSERT_EQ(pdr->entity_type, 100);
90 ASSERT_EQ(pdr->entity_instance, 0);
91 ASSERT_EQ(pdr->container_id, 0);
92 ASSERT_EQ(pdr->effecter_semantic_id, 0);
93 ASSERT_EQ(pdr->effecter_init, PLDM_NO_INIT);
94 ASSERT_EQ(pdr->has_description_pdr, false);
95 ASSERT_EQ(pdr->composite_effecter_count, 2);
96 states =
97 reinterpret_cast<state_effecter_possible_states*>(pdr->possible_states);
98 ASSERT_EQ(states->state_set_id, 197);
99 ASSERT_EQ(states->possible_states_size, 1);
100 bf1.byte = 2;
101 ASSERT_EQ(states->states[0].byte, bf1.byte);
102 states = reinterpret_cast<state_effecter_possible_states*>(
103 pdr->possible_states + sizeof(state_effecter_possible_states));
104 ASSERT_EQ(states->state_set_id, 198);
105 ASSERT_EQ(states->possible_states_size, 2);
106 bitfield8_t bf2[2];
107 bf2[0].byte = 38;
108 bf2[1].byte = 128;
109 ASSERT_EQ(states->states[0].byte, bf2[0].byte);
110 ASSERT_EQ(states->states[1].byte, bf2[1].byte);
Deepak Kodihallid0782962019-05-07 16:36:47 +0530111
Patrick Williams6da4f912023-05-10 07:50:53 -0500112 const auto& [dbusMappings2,
113 dbusValMaps2] = handler.getDbusObjMaps(pdr->effecter_id);
George Liu1ec85d42020-02-12 16:05:32 +0800114 ASSERT_EQ(dbusMappings2[0].objectPath, "/foo/bar");
George Liu36e81352020-07-01 14:40:30 +0800115 ASSERT_EQ(dbusMappings2[1].objectPath, "/foo/bar");
Deepak Kodihallid0782962019-05-07 16:36:47 +0530116
George Liu1ec85d42020-02-12 16:05:32 +0800117 ASSERT_THROW(handler.getDbusObjMaps(0xDEAD), std::exception);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600118
119 pldm_pdr_destroy(inPDRRepo);
120 pldm_pdr_destroy(outPDRRepo);
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -0500121}
122
George Liu456c9a22020-01-13 11:36:22 +0800123TEST(GeneratePDRByNumericEffecter, testGoodJson)
124{
George Liu36e81352020-07-01 14:40:30 +0800125 MockdBusHandler mockedUtils;
126 EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
127 .Times(5)
128 .WillRepeatedly(Return("foo.bar"));
129
George Liu456c9a22020-01-13 11:36:22 +0800130 auto inPDRRepo = pldm_pdr_init();
131 auto outPDRRepo = pldm_pdr_init();
132 Repo outRepo(outPDRRepo);
Sampa Misra5fb37d52021-03-06 07:26:00 -0600133 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -0500134 Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
135 inPDRRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +0800136 event);
George Liu456c9a22020-01-13 11:36:22 +0800137 Repo inRepo(inPDRRepo);
138 getRepoByType(inRepo, outRepo, PLDM_NUMERIC_EFFECTER_PDR);
139
140 // 1 entries
141 ASSERT_EQ(outRepo.getRecordCount(), 1);
142
143 // Check first PDR
144 pdr_utils::PdrEntry e;
Sampa Misra12afe112020-05-25 11:40:44 -0500145 auto record = pdr::getRecordByHandle(outRepo, 4, e);
George Liu456c9a22020-01-13 11:36:22 +0800146 ASSERT_NE(record, nullptr);
147
148 pldm_numeric_effecter_value_pdr* pdr =
149 reinterpret_cast<pldm_numeric_effecter_value_pdr*>(e.data);
Sampa Misra12afe112020-05-25 11:40:44 -0500150 EXPECT_EQ(pdr->hdr.record_handle, 4);
George Liu456c9a22020-01-13 11:36:22 +0800151 EXPECT_EQ(pdr->hdr.version, 1);
152 EXPECT_EQ(pdr->hdr.type, PLDM_NUMERIC_EFFECTER_PDR);
153 EXPECT_EQ(pdr->hdr.record_change_num, 0);
154 EXPECT_EQ(pdr->hdr.length,
155 sizeof(pldm_numeric_effecter_value_pdr) - sizeof(pldm_pdr_hdr));
156
157 EXPECT_EQ(pdr->effecter_id, 3);
158 EXPECT_EQ(pdr->effecter_data_size, 4);
159
Patrick Williams6da4f912023-05-10 07:50:53 -0500160 const auto& [dbusMappings,
161 dbusValMaps] = handler.getDbusObjMaps(pdr->effecter_id);
George Liu456c9a22020-01-13 11:36:22 +0800162 EXPECT_EQ(dbusMappings[0].objectPath, "/foo/bar");
163 EXPECT_EQ(dbusMappings[0].interface, "xyz.openbmc_project.Foo.Bar");
164 EXPECT_EQ(dbusMappings[0].propertyName, "propertyName");
165 EXPECT_EQ(dbusMappings[0].propertyType, "uint64_t");
166
167 pldm_pdr_destroy(inPDRRepo);
168 pldm_pdr_destroy(outPDRRepo);
169}
170
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -0500171TEST(GeneratePDR, testMalformedJson)
172{
George Liu36e81352020-07-01 14:40:30 +0800173 MockdBusHandler mockedUtils;
174 EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
175 .Times(5)
176 .WillRepeatedly(Return("foo.bar"));
177
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600178 auto inPDRRepo = pldm_pdr_init();
179 auto outPDRRepo = pldm_pdr_init();
180 Repo outRepo(outPDRRepo);
Sampa Misra5fb37d52021-03-06 07:26:00 -0600181 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -0500182 Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
183 inPDRRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +0800184 event);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600185 Repo inRepo(inPDRRepo);
186 getRepoByType(inRepo, outRepo, PLDM_STATE_EFFECTER_PDR);
187
188 ASSERT_EQ(outRepo.getRecordCount(), 2);
George Liue53193f2020-02-24 09:23:26 +0800189 ASSERT_THROW(pdr_utils::readJson("./pdr_jsons/state_effecter/malformed"),
Sampa Misraaa8ae722019-12-12 03:20:40 -0600190 std::exception);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600191
192 pldm_pdr_destroy(inPDRRepo);
193 pldm_pdr_destroy(outPDRRepo);
Deepak Kodihallic6e8fb52019-05-02 08:35:31 -0500194}
Tom Joseph250c4752020-04-15 10:32:45 +0530195
196TEST(findStateEffecterId, goodJson)
197{
George Liu36e81352020-07-01 14:40:30 +0800198 MockdBusHandler mockedUtils;
199 EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
200 .Times(5)
201 .WillRepeatedly(Return("foo.bar"));
202
Tom Joseph250c4752020-04-15 10:32:45 +0530203 auto inPDRRepo = pldm_pdr_init();
Sampa Misra5fb37d52021-03-06 07:26:00 -0600204 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -0500205 Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
206 inPDRRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +0800207 event);
Tom Joseph250c4752020-04-15 10:32:45 +0530208 uint16_t entityType = 33;
209 uint16_t entityInstance = 0;
210 uint16_t containerId = 0;
211 uint16_t stateSetId = 196;
212 auto effecterId = findStateEffecterId(inPDRRepo, entityType, entityInstance,
Sampa Misraa4a96162020-07-14 05:33:46 -0500213 containerId, stateSetId, true);
Tom Joseph250c4752020-04-15 10:32:45 +0530214 ASSERT_EQ(effecterId, 1);
215 stateSetId = 300;
216 effecterId = findStateEffecterId(inPDRRepo, entityType, entityInstance,
Sampa Misraa4a96162020-07-14 05:33:46 -0500217 containerId, stateSetId, true);
Tom Joseph250c4752020-04-15 10:32:45 +0530218 ASSERT_EQ(effecterId, PLDM_INVALID_EFFECTER_ID);
219 pldm_pdr_destroy(inPDRRepo);
George Liucae18662020-05-15 09:32:57 +0800220}