1 #include "common/test/mocked_utils.hpp" 2 #include "common/utils.hpp" 3 #include "libpldmresponder/event_parser.hpp" 4 #include "libpldmresponder/pdr.hpp" 5 #include "libpldmresponder/pdr_utils.hpp" 6 #include "libpldmresponder/platform.hpp" 7 #include "oem/ibm/libpldmresponder/inband_code_update.hpp" 8 #include "oem/ibm/libpldmresponder/oem_ibm_handler.hpp" 9 #include "test/test_instance_id.hpp" 10 11 #include <libpldm/entity.h> 12 #include <libpldm/oem/ibm/entity.h> 13 14 #include <sdeventplus/event.hpp> 15 16 using namespace pldm::utils; 17 using namespace pldm::responder; 18 using namespace pldm::responder::pdr; 19 using namespace pldm::responder::pdr_utils; 20 using namespace pldm::responder::oem_ibm_platform; 21 22 class MockCodeUpdate : public CodeUpdate 23 { 24 public: 25 MockCodeUpdate(const pldm::utils::DBusHandler* dBusIntf) : 26 CodeUpdate(dBusIntf) 27 {} 28 29 MOCK_METHOD(void, setVersions, (), (override)); 30 }; 31 32 class MockOemPlatformHandler : public oem_ibm_platform::Handler 33 { 34 public: 35 MockOemPlatformHandler(const pldm::utils::DBusHandler* dBusIntf, 36 pldm::responder::CodeUpdate* codeUpdate, int mctp_fd, 37 uint8_t mctp_eid, pldm::InstanceIdDb& instanceIdDb, 38 sdeventplus::Event& event) : 39 oem_ibm_platform::Handler(dBusIntf, codeUpdate, mctp_fd, mctp_eid, 40 instanceIdDb, event, nullptr) 41 {} 42 MOCK_METHOD(uint16_t, getNextEffecterId, ()); 43 MOCK_METHOD(uint16_t, getNextSensorId, ()); 44 }; 45 46 TEST(OemSetStateEffecterStatesHandler, testGoodRequest) 47 { 48 uint16_t entityID_ = PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE; 49 uint16_t stateSetId_ = PLDM_OEM_IBM_BOOT_STATE; 50 uint16_t entityInstance_ = 0; 51 uint8_t compSensorCnt_ = 1; 52 uint16_t effecterId = 0xA; 53 TestInstanceIdDb instanceIdDb; 54 55 sdbusplus::bus_t bus(sdbusplus::bus::new_default()); 56 auto event = sdeventplus::Event::get_default(); 57 std::vector<get_sensor_state_field> stateField; 58 59 auto mockDbusHandler = std::make_unique<MockdBusHandler>(); 60 std::unique_ptr<CodeUpdate> mockCodeUpdate = 61 std::make_unique<MockCodeUpdate>(mockDbusHandler.get()); 62 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{}; 63 64 oemPlatformHandler = std::make_unique<oem_ibm_platform::Handler>( 65 mockDbusHandler.get(), mockCodeUpdate.get(), 0x1, 0x9, instanceIdDb, 66 event, nullptr); 67 68 auto rc = oemPlatformHandler->getOemStateSensorReadingsHandler( 69 entityID_, entityInstance_, stateSetId_, compSensorCnt_, stateField); 70 71 ASSERT_EQ(rc, PLDM_SUCCESS); 72 ASSERT_EQ(stateField.size(), 1); 73 ASSERT_EQ(stateField[0].event_state, tSideNum); 74 ASSERT_EQ(stateField[0].sensor_op_state, PLDM_SENSOR_ENABLED); 75 ASSERT_EQ(stateField[0].present_state, PLDM_SENSOR_UNKNOWN); 76 ASSERT_EQ(stateField[0].previous_state, PLDM_SENSOR_UNKNOWN); 77 78 entityInstance_ = 1; 79 80 std::vector<get_sensor_state_field> stateField1; 81 rc = oemPlatformHandler->getOemStateSensorReadingsHandler( 82 entityID_, entityInstance_, stateSetId_, compSensorCnt_, stateField1); 83 ASSERT_EQ(stateField1.size(), 1); 84 ASSERT_EQ(stateField1[0].event_state, tSideNum); 85 86 entityInstance_ = 2; 87 rc = oemPlatformHandler->getOemStateSensorReadingsHandler( 88 entityID_, entityInstance_, stateSetId_, compSensorCnt_, stateField1); 89 ASSERT_EQ(stateField1[0].event_state, PLDM_SENSOR_UNKNOWN); 90 91 entityID_ = 40; 92 stateSetId_ = 50; 93 rc = oemPlatformHandler->getOemStateSensorReadingsHandler( 94 entityID_, entityInstance_, stateSetId_, compSensorCnt_, stateField1); 95 ASSERT_EQ(rc, PLDM_PLATFORM_INVALID_STATE_VALUE); 96 97 entityID_ = PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE; 98 entityInstance_ = 0; 99 stateSetId_ = PLDM_OEM_IBM_BOOT_STATE; 100 compSensorCnt_ = 1; 101 102 std::vector<set_effecter_state_field> setEffecterStateField; 103 setEffecterStateField.push_back({PLDM_REQUEST_SET, pSideNum}); 104 105 rc = oemPlatformHandler->oemSetStateEffecterStatesHandler( 106 entityID_, entityInstance_, stateSetId_, compSensorCnt_, 107 setEffecterStateField, effecterId); 108 ASSERT_EQ(rc, PLDM_SUCCESS); 109 110 entityInstance_ = 2; 111 rc = oemPlatformHandler->oemSetStateEffecterStatesHandler( 112 entityID_, entityInstance_, stateSetId_, compSensorCnt_, 113 setEffecterStateField, effecterId); 114 115 ASSERT_EQ(rc, PLDM_PLATFORM_INVALID_STATE_VALUE); 116 117 entityID_ = 34; 118 stateSetId_ = 99; 119 entityInstance_ = 0; 120 rc = oemPlatformHandler->oemSetStateEffecterStatesHandler( 121 entityID_, entityInstance_, stateSetId_, compSensorCnt_, 122 setEffecterStateField, effecterId); 123 ASSERT_EQ(rc, PLDM_PLATFORM_SET_EFFECTER_UNSUPPORTED_SENSORSTATE); 124 } 125 126 TEST(EncodeCodeUpdateEvent, testGoodRequest) 127 { 128 size_t sensorEventSize = PLDM_SENSOR_EVENT_DATA_MIN_LENGTH + 1; 129 std::vector<uint8_t> sensorEventDataVec{}; 130 sensorEventDataVec.resize(sensorEventSize); 131 132 auto eventData = reinterpret_cast<struct pldm_sensor_event_data*>( 133 sensorEventDataVec.data()); 134 eventData->sensor_id = 0xA; 135 eventData->sensor_event_class_type = PLDM_SENSOR_OP_STATE; 136 137 auto opStateSensorEventData = 138 reinterpret_cast<struct pldm_sensor_event_sensor_op_state*>( 139 sensorEventDataVec.data()); 140 opStateSensorEventData->present_op_state = uint8_t(CodeUpdateState::START); 141 opStateSensorEventData->previous_op_state = uint8_t(CodeUpdateState::END); 142 143 std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr) + 144 PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES + 145 sensorEventDataVec.size()); 146 147 auto rc = encodeEventMsg(PLDM_SENSOR_EVENT, sensorEventDataVec, requestMsg, 148 0x1); 149 150 EXPECT_EQ(rc, PLDM_SUCCESS); 151 } 152 153 TEST(EncodeCodeUpdate, testBadRequest) 154 { 155 std::vector<uint8_t> requestMsg; 156 std::vector<uint8_t> sensorEventDataVec{}; 157 158 auto rc = encodeEventMsg(PLDM_SENSOR_EVENT, sensorEventDataVec, requestMsg, 159 0x1); 160 161 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA); 162 } 163 164 TEST(clearDirPath, testClearDirPath) 165 { 166 char dirPath[] = "/tmp/testClearDir/"; 167 fs::path dir(dirPath); 168 fs::create_directories(dir); 169 struct stat buffer; 170 ASSERT_EQ(stat(dirPath, &buffer), 0); 171 char filePath[] = "/tmp/testClearDir/file.txt"; 172 std::ofstream file(filePath); 173 ASSERT_EQ(stat(filePath, &buffer), 0); 174 175 auto mockDbusHandler = std::make_unique<MockdBusHandler>(); 176 std::unique_ptr<CodeUpdate> mockCodeUpdate = 177 std::make_unique<MockCodeUpdate>(mockDbusHandler.get()); 178 179 mockCodeUpdate->clearDirPath(dirPath); 180 ASSERT_EQ(stat(filePath, &buffer), -1); 181 ASSERT_EQ(stat(dirPath, &buffer), 0); 182 } 183 184 TEST(generateStateEffecterOEMPDR, testGoodRequest) 185 { 186 auto inPDRRepo = pldm_pdr_init(); 187 sdbusplus::bus_t bus(sdbusplus::bus::new_default()); 188 std::filesystem::path dbPath; 189 TestInstanceIdDb instanceIdDb; 190 auto mockDbusHandler = std::make_unique<MockdBusHandler>(); 191 auto event = sdeventplus::Event::get_default(); 192 std::unique_ptr<CodeUpdate> mockCodeUpdate = 193 std::make_unique<MockCodeUpdate>(mockDbusHandler.get()); 194 std::unique_ptr<oem_ibm_platform::Handler> mockoemPlatformHandler = 195 std::make_unique<MockOemPlatformHandler>(mockDbusHandler.get(), 196 mockCodeUpdate.get(), 0x1, 0x9, 197 instanceIdDb, event); 198 Repo inRepo(inPDRRepo); 199 200 mockoemPlatformHandler->buildOEMPDR(inRepo); 201 ASSERT_EQ(inRepo.empty(), false); 202 203 pdr_utils::PdrEntry e; 204 205 // Test for effecter number 1, for current boot side state 206 auto record1 = pdr::getRecordByHandle(inRepo, 1, e); 207 ASSERT_NE(record1, nullptr); 208 209 pldm_state_effecter_pdr* pdr = 210 reinterpret_cast<pldm_state_effecter_pdr*>(e.data); 211 212 ASSERT_EQ(pdr->hdr.record_handle, 1); 213 ASSERT_EQ(pdr->hdr.version, 1); 214 ASSERT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR); 215 ASSERT_EQ(pdr->hdr.record_change_num, 0); 216 ASSERT_EQ(pdr->hdr.length, 16); 217 ASSERT_EQ(pdr->terminus_handle, TERMINUS_HANDLE); 218 ASSERT_EQ(pdr->entity_type, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE); 219 ASSERT_EQ(pdr->entity_instance, 0); 220 ASSERT_EQ(pdr->container_id, 1); 221 ASSERT_EQ(pdr->effecter_semantic_id, 0); 222 ASSERT_EQ(pdr->effecter_init, PLDM_NO_INIT); 223 ASSERT_EQ(pdr->has_description_pdr, false); 224 ASSERT_EQ(pdr->composite_effecter_count, 1); 225 state_effecter_possible_states* states = 226 reinterpret_cast<state_effecter_possible_states*>(pdr->possible_states); 227 ASSERT_EQ(states->state_set_id, 32769); 228 ASSERT_EQ(states->possible_states_size, 2); 229 bitfield8_t bf1{}; 230 bf1.byte = 6; 231 ASSERT_EQ(states->states[0].byte, bf1.byte); 232 233 // Test for effecter number 2, for next boot side state 234 auto record2 = pdr::getRecordByHandle(inRepo, 2, e); 235 ASSERT_NE(record2, nullptr); 236 237 pdr = reinterpret_cast<pldm_state_effecter_pdr*>(e.data); 238 239 ASSERT_EQ(pdr->hdr.record_handle, 2); 240 ASSERT_EQ(pdr->hdr.version, 1); 241 ASSERT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR); 242 ASSERT_EQ(pdr->hdr.record_change_num, 0); 243 ASSERT_EQ(pdr->hdr.length, 16); 244 ASSERT_EQ(pdr->terminus_handle, TERMINUS_HANDLE); 245 ASSERT_EQ(pdr->entity_type, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE); 246 ASSERT_EQ(pdr->entity_instance, 1); 247 ASSERT_EQ(pdr->container_id, 1); 248 ASSERT_EQ(pdr->effecter_semantic_id, 0); 249 ASSERT_EQ(pdr->effecter_init, PLDM_NO_INIT); 250 ASSERT_EQ(pdr->has_description_pdr, false); 251 ASSERT_EQ(pdr->composite_effecter_count, 1); 252 states = 253 reinterpret_cast<state_effecter_possible_states*>(pdr->possible_states); 254 ASSERT_EQ(states->state_set_id, 32769); 255 ASSERT_EQ(states->possible_states_size, 2); 256 bitfield8_t bf2{}; 257 bf2.byte = 6; 258 ASSERT_EQ(states->states[0].byte, bf2.byte); 259 260 // Test for effecter number 3, for firmware update state control 261 auto record3 = pdr::getRecordByHandle(inRepo, 3, e); 262 ASSERT_NE(record3, nullptr); 263 264 pdr = reinterpret_cast<pldm_state_effecter_pdr*>(e.data); 265 266 ASSERT_EQ(pdr->hdr.record_handle, 3); 267 ASSERT_EQ(pdr->hdr.version, 1); 268 ASSERT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR); 269 ASSERT_EQ(pdr->hdr.record_change_num, 0); 270 ASSERT_EQ(pdr->hdr.length, 16); 271 ASSERT_EQ(pdr->terminus_handle, TERMINUS_HANDLE); 272 ASSERT_EQ(pdr->entity_type, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE); 273 ASSERT_EQ(pdr->entity_instance, 0); 274 ASSERT_EQ(pdr->container_id, 1); 275 ASSERT_EQ(pdr->effecter_semantic_id, 0); 276 ASSERT_EQ(pdr->effecter_init, PLDM_NO_INIT); 277 ASSERT_EQ(pdr->has_description_pdr, false); 278 ASSERT_EQ(pdr->composite_effecter_count, 1); 279 states = 280 reinterpret_cast<state_effecter_possible_states*>(pdr->possible_states); 281 ASSERT_EQ(states->state_set_id, 32768); 282 ASSERT_EQ(states->possible_states_size, 2); 283 bitfield8_t bf3{}; 284 bf3.byte = 126; 285 ASSERT_EQ(states->states[0].byte, bf3.byte); 286 287 pldm_pdr_destroy(inPDRRepo); 288 } 289 290 TEST(generateStateSensorOEMPDR, testGoodRequest) 291 { 292 auto inPDRRepo = pldm_pdr_init(); 293 sdbusplus::bus_t bus(sdbusplus::bus::new_default()); 294 std::filesystem::path dbPath; 295 TestInstanceIdDb instanceIdDb; 296 297 auto mockDbusHandler = std::make_unique<MockdBusHandler>(); 298 auto event = sdeventplus::Event::get_default(); 299 std::unique_ptr<CodeUpdate> mockCodeUpdate = 300 std::make_unique<MockCodeUpdate>(mockDbusHandler.get()); 301 std::unique_ptr<oem_ibm_platform::Handler> mockoemPlatformHandler = 302 std::make_unique<MockOemPlatformHandler>(mockDbusHandler.get(), 303 mockCodeUpdate.get(), 0x1, 0x9, 304 instanceIdDb, event); 305 Repo inRepo(inPDRRepo); 306 mockoemPlatformHandler->buildOEMPDR(inRepo); 307 ASSERT_EQ(inRepo.empty(), false); 308 309 pdr_utils::PdrEntry e; 310 311 // Test for sensor number 1, for current boot side state 312 auto record1 = pdr::getRecordByHandle(inRepo, 5, e); 313 ASSERT_NE(record1, nullptr); 314 315 pldm_state_sensor_pdr* pdr = 316 reinterpret_cast<pldm_state_sensor_pdr*>(e.data); 317 318 ASSERT_EQ(pdr->hdr.record_handle, 5); 319 ASSERT_EQ(pdr->hdr.version, 1); 320 ASSERT_EQ(pdr->hdr.type, PLDM_STATE_SENSOR_PDR); 321 ASSERT_EQ(pdr->hdr.record_change_num, 0); 322 ASSERT_EQ(pdr->hdr.length, 14); 323 ASSERT_EQ(pdr->terminus_handle, TERMINUS_HANDLE); 324 ASSERT_EQ(pdr->entity_type, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE); 325 ASSERT_EQ(pdr->entity_instance, 0); 326 ASSERT_EQ(pdr->container_id, 1); 327 ASSERT_EQ(pdr->sensor_init, PLDM_NO_INIT); 328 ASSERT_EQ(pdr->sensor_auxiliary_names_pdr, false); 329 ASSERT_EQ(pdr->composite_sensor_count, 1); 330 state_sensor_possible_states* states = 331 reinterpret_cast<state_sensor_possible_states*>(pdr->possible_states); 332 ASSERT_EQ(states->state_set_id, 32769); 333 ASSERT_EQ(states->possible_states_size, 2); 334 bitfield8_t bf1{}; 335 bf1.byte = 6; 336 ASSERT_EQ(states->states[0].byte, bf1.byte); 337 338 // Test for sensor number 2, for next boot side state 339 auto record2 = pdr::getRecordByHandle(inRepo, 6, e); 340 ASSERT_NE(record2, nullptr); 341 342 pdr = reinterpret_cast<pldm_state_sensor_pdr*>(e.data); 343 344 ASSERT_EQ(pdr->hdr.record_handle, 6); 345 ASSERT_EQ(pdr->hdr.version, 1); 346 ASSERT_EQ(pdr->hdr.type, PLDM_STATE_SENSOR_PDR); 347 ASSERT_EQ(pdr->hdr.record_change_num, 0); 348 ASSERT_EQ(pdr->hdr.length, 14); 349 ASSERT_EQ(pdr->terminus_handle, TERMINUS_HANDLE); 350 ASSERT_EQ(pdr->entity_type, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE); 351 ASSERT_EQ(pdr->entity_instance, 1); 352 ASSERT_EQ(pdr->container_id, 1); 353 ASSERT_EQ(pdr->sensor_init, PLDM_NO_INIT); 354 ASSERT_EQ(pdr->sensor_auxiliary_names_pdr, false); 355 ASSERT_EQ(pdr->composite_sensor_count, 1); 356 states = 357 reinterpret_cast<state_sensor_possible_states*>(pdr->possible_states); 358 ASSERT_EQ(states->state_set_id, 32769); 359 ASSERT_EQ(states->possible_states_size, 2); 360 bitfield8_t bf2{}; 361 bf2.byte = 6; 362 ASSERT_EQ(states->states[0].byte, bf2.byte); 363 364 // Test for sensor number 3, for firmware update state control 365 auto record3 = pdr::getRecordByHandle(inRepo, 7, e); 366 ASSERT_NE(record3, nullptr); 367 368 pdr = reinterpret_cast<pldm_state_sensor_pdr*>(e.data); 369 370 ASSERT_EQ(pdr->hdr.record_handle, 7); 371 ASSERT_EQ(pdr->hdr.version, 1); 372 ASSERT_EQ(pdr->hdr.type, PLDM_STATE_SENSOR_PDR); 373 ASSERT_EQ(pdr->hdr.record_change_num, 0); 374 ASSERT_EQ(pdr->hdr.length, 14); 375 ASSERT_EQ(pdr->terminus_handle, TERMINUS_HANDLE); 376 ASSERT_EQ(pdr->entity_type, PLDM_OEM_IBM_ENTITY_FIRMWARE_UPDATE); 377 ASSERT_EQ(pdr->entity_instance, 0); 378 ASSERT_EQ(pdr->container_id, 1); 379 ASSERT_EQ(pdr->sensor_init, PLDM_NO_INIT); 380 ASSERT_EQ(pdr->sensor_auxiliary_names_pdr, false); 381 ASSERT_EQ(pdr->composite_sensor_count, 1); 382 states = 383 reinterpret_cast<state_sensor_possible_states*>(pdr->possible_states); 384 ASSERT_EQ(states->state_set_id, 32768); 385 ASSERT_EQ(states->possible_states_size, 2); 386 bitfield8_t bf3{}; 387 bf3.byte = 126; 388 ASSERT_EQ(states->states[0].byte, bf3.byte); 389 390 pldm_pdr_destroy(inPDRRepo); 391 } 392