1de2a132aSGilbert Chen #include "common/instance_id.hpp" 2de2a132aSGilbert Chen #include "mock_terminus_manager.hpp" 3de2a132aSGilbert Chen #include "platform-mc/platform_manager.hpp" 4de2a132aSGilbert Chen #include "test/test_instance_id.hpp" 5de2a132aSGilbert Chen 6de2a132aSGilbert Chen #include <sdeventplus/event.hpp> 7de2a132aSGilbert Chen 8de2a132aSGilbert Chen #include <bitset> 9de2a132aSGilbert Chen 10de2a132aSGilbert Chen #include <gtest/gtest.h> 11de2a132aSGilbert Chen 12de2a132aSGilbert Chen class PlatformManagerTest : public testing::Test 13de2a132aSGilbert Chen { 14de2a132aSGilbert Chen protected: 15de2a132aSGilbert Chen PlatformManagerTest() : 16de2a132aSGilbert Chen bus(pldm::utils::DBusHandler::getBus()), 17de2a132aSGilbert Chen event(sdeventplus::Event::get_default()), instanceIdDb(), 18de2a132aSGilbert Chen reqHandler(pldmTransport, event, instanceIdDb, false, 19de2a132aSGilbert Chen std::chrono::seconds(1), 2, std::chrono::milliseconds(100)), 20de2a132aSGilbert Chen mockTerminusManager(event, reqHandler, instanceIdDb, termini, nullptr), 21de2a132aSGilbert Chen platformManager(mockTerminusManager, termini) 22de2a132aSGilbert Chen {} 23de2a132aSGilbert Chen 24de2a132aSGilbert Chen PldmTransport* pldmTransport = nullptr; 25de2a132aSGilbert Chen sdbusplus::bus_t& bus; 26de2a132aSGilbert Chen sdeventplus::Event event; 27de2a132aSGilbert Chen TestInstanceIdDb instanceIdDb; 28de2a132aSGilbert Chen pldm::requester::Handler<pldm::requester::Request> reqHandler; 29de2a132aSGilbert Chen pldm::platform_mc::MockTerminusManager mockTerminusManager; 30de2a132aSGilbert Chen pldm::platform_mc::PlatformManager platformManager; 31de2a132aSGilbert Chen std::map<pldm_tid_t, std::shared_ptr<pldm::platform_mc::Terminus>> termini; 32de2a132aSGilbert Chen }; 33de2a132aSGilbert Chen 34de2a132aSGilbert Chen TEST_F(PlatformManagerTest, initTerminusTest) 35de2a132aSGilbert Chen { 36de2a132aSGilbert Chen // Add terminus 37de2a132aSGilbert Chen auto mappedTid = mockTerminusManager.mapTid(pldm::MctpInfo(10, "", "", 1)); 38de2a132aSGilbert Chen auto tid = mappedTid.value(); 39de2a132aSGilbert Chen termini[tid] = std::make_shared<pldm::platform_mc::Terminus>( 40de2a132aSGilbert Chen tid, 1 << PLDM_BASE | 1 << PLDM_PLATFORM); 41de2a132aSGilbert Chen auto terminus = termini[tid]; 42de2a132aSGilbert Chen 43de2a132aSGilbert Chen /* Set supported command by terminus */ 44de2a132aSGilbert Chen auto size = PLDM_MAX_TYPES * (PLDM_MAX_CMDS_PER_TYPE / 8); 45de2a132aSGilbert Chen std::vector<uint8_t> pldmCmds(size); 46de2a132aSGilbert Chen uint8_t type = PLDM_PLATFORM; 47de2a132aSGilbert Chen uint8_t cmd = PLDM_GET_PDR; 48de2a132aSGilbert Chen auto idx = type * (PLDM_MAX_CMDS_PER_TYPE / 8) + (cmd / 8); 49de2a132aSGilbert Chen pldmCmds[idx] = pldmCmds[idx] | (1 << (cmd % 8)); 50de2a132aSGilbert Chen cmd = PLDM_GET_PDR_REPOSITORY_INFO; 51de2a132aSGilbert Chen idx = type * (PLDM_MAX_CMDS_PER_TYPE / 8) + (cmd / 8); 52de2a132aSGilbert Chen pldmCmds[idx] = pldmCmds[idx] | (1 << (cmd % 8)); 53de2a132aSGilbert Chen termini[tid]->setSupportedCommands(pldmCmds); 54de2a132aSGilbert Chen 55de2a132aSGilbert Chen // queue getPDRRepositoryInfo response 56de2a132aSGilbert Chen const size_t getPDRRepositoryInfoLen = 57de2a132aSGilbert Chen PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES; 58de2a132aSGilbert Chen std::array<uint8_t, sizeof(pldm_msg_hdr) + getPDRRepositoryInfoLen> 59de2a132aSGilbert Chen getPDRRepositoryInfoResp{ 60de2a132aSGilbert Chen 0x0, 0x02, 0x50, PLDM_SUCCESS, 61de2a132aSGilbert Chen 0x0, // repositoryState 62de2a132aSGilbert Chen 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 63de2a132aSGilbert Chen 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, // updateTime 64de2a132aSGilbert Chen 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 65de2a132aSGilbert Chen 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, // OEMUpdateTime 66*eac61a4bSGilbert Chen 2, 0x0, 0x0, 0x0, // recordCount 67de2a132aSGilbert Chen 0x0, 0x1, 0x0, 0x0, // repositorySize 68de2a132aSGilbert Chen 59, 0x0, 0x0, 0x0, // largestRecordSize 69de2a132aSGilbert Chen 0x0 // dataTransferHandleTimeout 70de2a132aSGilbert Chen }; 71de2a132aSGilbert Chen auto rc = mockTerminusManager.enqueueResponse( 7298831af9SThu Nguyen reinterpret_cast<pldm_msg*>(getPDRRepositoryInfoResp.data()), 73de2a132aSGilbert Chen sizeof(getPDRRepositoryInfoResp)); 74de2a132aSGilbert Chen EXPECT_EQ(rc, PLDM_SUCCESS); 75de2a132aSGilbert Chen 76de2a132aSGilbert Chen // queue getPDR responses 77de2a132aSGilbert Chen const size_t getPdrRespLen = 81; 78de2a132aSGilbert Chen std::array<uint8_t, sizeof(pldm_msg_hdr) + getPdrRespLen> getPdrResp{ 79*eac61a4bSGilbert Chen 0x0, 0x02, 0x51, PLDM_SUCCESS, 0x1, 0x0, 0x0, 0x0, // nextRecordHandle 80de2a132aSGilbert Chen 0x0, 0x0, 0x0, 0x0, // nextDataTransferHandle 81de2a132aSGilbert Chen 0x5, // transferFlag 82de2a132aSGilbert Chen 69, 0x0, // responseCount 83de2a132aSGilbert Chen // numeric Sensor PDR 84*eac61a4bSGilbert Chen 0x0, 0x0, 0x0, 85de2a132aSGilbert Chen 0x0, // record handle 86de2a132aSGilbert Chen 0x1, // PDRHeaderVersion 87de2a132aSGilbert Chen PLDM_NUMERIC_SENSOR_PDR, // PDRType 88de2a132aSGilbert Chen 0x0, 89de2a132aSGilbert Chen 0x0, // recordChangeNumber 90de2a132aSGilbert Chen PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH + 91de2a132aSGilbert Chen PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH + 92de2a132aSGilbert Chen PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH, 93de2a132aSGilbert Chen 0, // dataLength 94de2a132aSGilbert Chen 0, 95de2a132aSGilbert Chen 0, // PLDMTerminusHandle 96de2a132aSGilbert Chen 0x1, 97de2a132aSGilbert Chen 0x0, // sensorID=1 98de2a132aSGilbert Chen 120, 99de2a132aSGilbert Chen 0, // entityType=Power Supply(120) 100de2a132aSGilbert Chen 1, 101de2a132aSGilbert Chen 0, // entityInstanceNumber 102de2a132aSGilbert Chen 0x1, 103de2a132aSGilbert Chen 0x0, // containerID=1 104de2a132aSGilbert Chen PLDM_NO_INIT, // sensorInit 105de2a132aSGilbert Chen false, // sensorAuxiliaryNamesPDR 106de2a132aSGilbert Chen PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C 107de2a132aSGilbert Chen 1, // unitModifier = 1 108de2a132aSGilbert Chen 0, // rateUnit 109de2a132aSGilbert Chen 0, // baseOEMUnitHandle 110de2a132aSGilbert Chen 0, // auxUnit 111de2a132aSGilbert Chen 0, // auxUnitModifier 112de2a132aSGilbert Chen 0, // auxRateUnit 113de2a132aSGilbert Chen 0, // rel 114de2a132aSGilbert Chen 0, // auxOEMUnitHandle 115de2a132aSGilbert Chen true, // isLinear 116de2a132aSGilbert Chen PLDM_SENSOR_DATA_SIZE_UINT8, // sensorDataSize 117de2a132aSGilbert Chen 0, 0, 0xc0, 118de2a132aSGilbert Chen 0x3f, // resolution=1.5 119de2a132aSGilbert Chen 0, 0, 0x80, 120de2a132aSGilbert Chen 0x3f, // offset=1.0 121de2a132aSGilbert Chen 0, 122de2a132aSGilbert Chen 0, // accuracy 123de2a132aSGilbert Chen 0, // plusTolerance 124de2a132aSGilbert Chen 0, // minusTolerance 125de2a132aSGilbert Chen 2, // hysteresis 126de2a132aSGilbert Chen 0, // supportedThresholds 127de2a132aSGilbert Chen 0, // thresholdAndHysteresisVolatility 128de2a132aSGilbert Chen 0, 0, 0x80, 129de2a132aSGilbert Chen 0x3f, // stateTransistionInterval=1.0 130de2a132aSGilbert Chen 0, 0, 0x80, 131de2a132aSGilbert Chen 0x3f, // updateInverval=1.0 132de2a132aSGilbert Chen 255, // maxReadable 133de2a132aSGilbert Chen 0, // minReadable 134de2a132aSGilbert Chen PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat 135de2a132aSGilbert Chen 0, // rangeFieldsupport 136de2a132aSGilbert Chen 0, // nominalValue 137de2a132aSGilbert Chen 0, // normalMax 138de2a132aSGilbert Chen 0, // normalMin 139de2a132aSGilbert Chen 0, // warningHigh 140de2a132aSGilbert Chen 0, // warningLow 141de2a132aSGilbert Chen 0, // criticalHigh 142de2a132aSGilbert Chen 0, // criticalLow 143de2a132aSGilbert Chen 0, // fatalHigh 144de2a132aSGilbert Chen 0 // fatalLow 145de2a132aSGilbert Chen }; 14698831af9SThu Nguyen rc = mockTerminusManager.enqueueResponse( 14798831af9SThu Nguyen reinterpret_cast<pldm_msg*>(getPdrResp.data()), sizeof(getPdrResp)); 148de2a132aSGilbert Chen EXPECT_EQ(rc, PLDM_SUCCESS); 149de2a132aSGilbert Chen 150*eac61a4bSGilbert Chen const size_t getPdrAuxNameRespLen = 39; 151*eac61a4bSGilbert Chen std::array<uint8_t, sizeof(pldm_msg_hdr) + getPdrAuxNameRespLen> 152*eac61a4bSGilbert Chen getPdrAuxNameResp{ 153*eac61a4bSGilbert Chen 0x0, 0x02, 0x51, PLDM_SUCCESS, 0x0, 0x0, 0x0, 154*eac61a4bSGilbert Chen 0x0, // nextRecordHandle 155*eac61a4bSGilbert Chen 0x0, 0x0, 0x0, 0x0, // nextDataTransferHandle 156*eac61a4bSGilbert Chen 0x5, // transferFlag 157*eac61a4bSGilbert Chen 0x1b, 0x0, // responseCount 158*eac61a4bSGilbert Chen // Common PDR Header 159*eac61a4bSGilbert Chen 0x1, 0x0, 0x0, 160*eac61a4bSGilbert Chen 0x0, // record handle 161*eac61a4bSGilbert Chen 0x1, // PDRHeaderVersion 162*eac61a4bSGilbert Chen PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType 163*eac61a4bSGilbert Chen 0x1, 164*eac61a4bSGilbert Chen 0x0, // recordChangeNumber 165*eac61a4bSGilbert Chen 0x11, 166*eac61a4bSGilbert Chen 0, // dataLength 167*eac61a4bSGilbert Chen /* Entity Auxiliary Names PDR Data*/ 168*eac61a4bSGilbert Chen 3, 169*eac61a4bSGilbert Chen 0x80, // entityType system software 170*eac61a4bSGilbert Chen 0x1, 171*eac61a4bSGilbert Chen 0x0, // Entity instance number =1 172*eac61a4bSGilbert Chen 0, 173*eac61a4bSGilbert Chen 0, // Overal system 174*eac61a4bSGilbert Chen 0, // shared Name Count one name only 175*eac61a4bSGilbert Chen 01, // nameStringCount 176*eac61a4bSGilbert Chen 0x65, 0x6e, 0x00, 177*eac61a4bSGilbert Chen 0x00, // Language Tag "en" 178*eac61a4bSGilbert Chen 0x53, 0x00, 0x30, 0x00, 179*eac61a4bSGilbert Chen 0x00 // Entity Name "S0" 180*eac61a4bSGilbert Chen }; 181*eac61a4bSGilbert Chen rc = mockTerminusManager.enqueueResponse( 182*eac61a4bSGilbert Chen reinterpret_cast<pldm_msg*>(getPdrAuxNameResp.data()), 183*eac61a4bSGilbert Chen sizeof(getPdrAuxNameResp)); 184*eac61a4bSGilbert Chen EXPECT_EQ(rc, PLDM_SUCCESS); 185*eac61a4bSGilbert Chen 186de2a132aSGilbert Chen stdexec::sync_wait(platformManager.initTerminus()); 187de2a132aSGilbert Chen EXPECT_EQ(true, terminus->initialized); 188*eac61a4bSGilbert Chen EXPECT_EQ(2, terminus->pdrs.size()); 189*eac61a4bSGilbert Chen EXPECT_EQ(1, terminus->numericSensors.size()); 190*eac61a4bSGilbert Chen EXPECT_EQ("S0", terminus->getTerminusName()); 191de2a132aSGilbert Chen } 192de2a132aSGilbert Chen 193b8cf46b8SThu Nguyen TEST_F(PlatformManagerTest, parseTerminusNameTest) 194b8cf46b8SThu Nguyen { 195b8cf46b8SThu Nguyen // Add terminus 196b8cf46b8SThu Nguyen auto mappedTid = mockTerminusManager.mapTid(pldm::MctpInfo(10, "", "", 1)); 197b8cf46b8SThu Nguyen auto tid = mappedTid.value(); 198b8cf46b8SThu Nguyen termini[tid] = std::make_shared<pldm::platform_mc::Terminus>( 199b8cf46b8SThu Nguyen tid, 1 << PLDM_BASE | 1 << PLDM_PLATFORM); 200b8cf46b8SThu Nguyen auto terminus = termini[tid]; 201b8cf46b8SThu Nguyen 202b8cf46b8SThu Nguyen /* Set supported command by terminus */ 203b8cf46b8SThu Nguyen auto size = PLDM_MAX_TYPES * (PLDM_MAX_CMDS_PER_TYPE / 8); 204b8cf46b8SThu Nguyen std::vector<uint8_t> pldmCmds(size); 205b8cf46b8SThu Nguyen uint8_t type = PLDM_PLATFORM; 206b8cf46b8SThu Nguyen uint8_t cmd = PLDM_GET_PDR; 207b8cf46b8SThu Nguyen auto idx = type * (PLDM_MAX_CMDS_PER_TYPE / 8) + (cmd / 8); 208b8cf46b8SThu Nguyen pldmCmds[idx] = pldmCmds[idx] | (1 << (cmd % 8)); 209b8cf46b8SThu Nguyen cmd = PLDM_GET_PDR_REPOSITORY_INFO; 210b8cf46b8SThu Nguyen idx = type * (PLDM_MAX_CMDS_PER_TYPE / 8) + (cmd / 8); 211b8cf46b8SThu Nguyen pldmCmds[idx] = pldmCmds[idx] | (1 << (cmd % 8)); 212b8cf46b8SThu Nguyen termini[tid]->setSupportedCommands(pldmCmds); 213b8cf46b8SThu Nguyen 214b8cf46b8SThu Nguyen // queue getPDRRepositoryInfo response 215b8cf46b8SThu Nguyen const size_t getPDRRepositoryInfoLen = 216b8cf46b8SThu Nguyen PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES; 217b8cf46b8SThu Nguyen std::array<uint8_t, sizeof(pldm_msg_hdr) + getPDRRepositoryInfoLen> 218b8cf46b8SThu Nguyen getPDRRepositoryInfoResp{ 219b8cf46b8SThu Nguyen 0x0, 0x02, 0x50, PLDM_SUCCESS, 220b8cf46b8SThu Nguyen 0x0, // repositoryState 221b8cf46b8SThu Nguyen 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 222b8cf46b8SThu Nguyen 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, // updateTime 223b8cf46b8SThu Nguyen 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 224b8cf46b8SThu Nguyen 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, // OEMUpdateTime 225b8cf46b8SThu Nguyen 2, 0x0, 0x0, 0x0, // recordCount 226b8cf46b8SThu Nguyen 0x0, 0x1, 0x0, 0x0, // repositorySize 227b8cf46b8SThu Nguyen 59, 0x0, 0x0, 0x0, // largestRecordSize 228b8cf46b8SThu Nguyen 0x0 // dataTransferHandleTimeout 229b8cf46b8SThu Nguyen }; 230b8cf46b8SThu Nguyen auto rc = mockTerminusManager.enqueueResponse( 231b8cf46b8SThu Nguyen reinterpret_cast<pldm_msg*>(getPDRRepositoryInfoResp.data()), 232b8cf46b8SThu Nguyen sizeof(getPDRRepositoryInfoResp)); 233b8cf46b8SThu Nguyen EXPECT_EQ(rc, PLDM_SUCCESS); 234b8cf46b8SThu Nguyen 235b8cf46b8SThu Nguyen // queue getPDR responses 236b8cf46b8SThu Nguyen const size_t getPdrRespLen = 81; 237b8cf46b8SThu Nguyen std::array<uint8_t, sizeof(pldm_msg_hdr) + getPdrRespLen> getPdrResp{ 238b8cf46b8SThu Nguyen 0x0, 0x02, 0x51, PLDM_SUCCESS, 0x1, 0x0, 0x0, 0x0, // nextRecordHandle 239b8cf46b8SThu Nguyen 0x0, 0x0, 0x0, 0x0, // nextDataTransferHandle 240b8cf46b8SThu Nguyen 0x5, // transferFlag 241b8cf46b8SThu Nguyen 69, 0x0, // responseCount 242b8cf46b8SThu Nguyen // numeric Sensor PDR 243b8cf46b8SThu Nguyen 0x0, 0x0, 0x0, 244b8cf46b8SThu Nguyen 0x0, // record handle 245b8cf46b8SThu Nguyen 0x1, // PDRHeaderVersion 246b8cf46b8SThu Nguyen PLDM_NUMERIC_SENSOR_PDR, // PDRType 247b8cf46b8SThu Nguyen 0x0, 248b8cf46b8SThu Nguyen 0x0, // recordChangeNumber 249b8cf46b8SThu Nguyen PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH + 250b8cf46b8SThu Nguyen PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH + 251b8cf46b8SThu Nguyen PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH, 252b8cf46b8SThu Nguyen 0, // dataLength 253b8cf46b8SThu Nguyen 0, 254b8cf46b8SThu Nguyen 0, // PLDMTerminusHandle 255b8cf46b8SThu Nguyen 0x1, 256b8cf46b8SThu Nguyen 0x0, // sensorID=1 257b8cf46b8SThu Nguyen 120, 258b8cf46b8SThu Nguyen 0, // entityType=Power Supply(120) 259b8cf46b8SThu Nguyen 1, 260b8cf46b8SThu Nguyen 0, // entityInstanceNumber 261b8cf46b8SThu Nguyen 0x1, 262b8cf46b8SThu Nguyen 0x0, // containerID=1 263b8cf46b8SThu Nguyen PLDM_NO_INIT, // sensorInit 264b8cf46b8SThu Nguyen false, // sensorAuxiliaryNamesPDR 265b8cf46b8SThu Nguyen PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C 266b8cf46b8SThu Nguyen 1, // unitModifier = 1 267b8cf46b8SThu Nguyen 0, // rateUnit 268b8cf46b8SThu Nguyen 0, // baseOEMUnitHandle 269b8cf46b8SThu Nguyen 0, // auxUnit 270b8cf46b8SThu Nguyen 0, // auxUnitModifier 271b8cf46b8SThu Nguyen 0, // auxRateUnit 272b8cf46b8SThu Nguyen 0, // rel 273b8cf46b8SThu Nguyen 0, // auxOEMUnitHandle 274b8cf46b8SThu Nguyen true, // isLinear 275b8cf46b8SThu Nguyen PLDM_SENSOR_DATA_SIZE_UINT8, // sensorDataSize 276b8cf46b8SThu Nguyen 0, 0, 0xc0, 277b8cf46b8SThu Nguyen 0x3f, // resolution=1.5 278b8cf46b8SThu Nguyen 0, 0, 0x80, 279b8cf46b8SThu Nguyen 0x3f, // offset=1.0 280b8cf46b8SThu Nguyen 0, 281b8cf46b8SThu Nguyen 0, // accuracy 282b8cf46b8SThu Nguyen 0, // plusTolerance 283b8cf46b8SThu Nguyen 0, // minusTolerance 284b8cf46b8SThu Nguyen 2, // hysteresis 285b8cf46b8SThu Nguyen 0, // supportedThresholds 286b8cf46b8SThu Nguyen 0, // thresholdAndHysteresisVolatility 287b8cf46b8SThu Nguyen 0, 0, 0x80, 288b8cf46b8SThu Nguyen 0x3f, // stateTransistionInterval=1.0 289b8cf46b8SThu Nguyen 0, 0, 0x80, 290b8cf46b8SThu Nguyen 0x3f, // updateInverval=1.0 291b8cf46b8SThu Nguyen 255, // maxReadable 292b8cf46b8SThu Nguyen 0, // minReadable 293b8cf46b8SThu Nguyen PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat 294b8cf46b8SThu Nguyen 0, // rangeFieldsupport 295b8cf46b8SThu Nguyen 0, // nominalValue 296b8cf46b8SThu Nguyen 0, // normalMax 297b8cf46b8SThu Nguyen 0, // normalMin 298b8cf46b8SThu Nguyen 0, // warningHigh 299b8cf46b8SThu Nguyen 0, // warningLow 300b8cf46b8SThu Nguyen 0, // criticalHigh 301b8cf46b8SThu Nguyen 0, // criticalLow 302b8cf46b8SThu Nguyen 0, // fatalHigh 303b8cf46b8SThu Nguyen 0 // fatalLow 304b8cf46b8SThu Nguyen }; 305b8cf46b8SThu Nguyen rc = mockTerminusManager.enqueueResponse( 306b8cf46b8SThu Nguyen reinterpret_cast<pldm_msg*>(getPdrResp.data()), sizeof(getPdrResp)); 307b8cf46b8SThu Nguyen EXPECT_EQ(rc, PLDM_SUCCESS); 308b8cf46b8SThu Nguyen 309b8cf46b8SThu Nguyen const size_t getPdrAuxNameRespLen = 39; 310b8cf46b8SThu Nguyen std::array<uint8_t, sizeof(pldm_msg_hdr) + getPdrAuxNameRespLen> 311b8cf46b8SThu Nguyen getPdrAuxNameResp{ 312b8cf46b8SThu Nguyen 0x0, 0x02, 0x51, PLDM_SUCCESS, 0x0, 0x0, 0x0, 313b8cf46b8SThu Nguyen 0x0, // nextRecordHandle 314b8cf46b8SThu Nguyen 0x0, 0x0, 0x0, 0x0, // nextDataTransferHandle 315b8cf46b8SThu Nguyen 0x5, // transferFlag 316b8cf46b8SThu Nguyen 0x1b, 0x0, // responseCount 317b8cf46b8SThu Nguyen // Common PDR Header 318b8cf46b8SThu Nguyen 0x1, 0x0, 0x0, 319b8cf46b8SThu Nguyen 0x0, // record handle 320b8cf46b8SThu Nguyen 0x1, // PDRHeaderVersion 321b8cf46b8SThu Nguyen PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType 322b8cf46b8SThu Nguyen 0x1, 323b8cf46b8SThu Nguyen 0x0, // recordChangeNumber 324b8cf46b8SThu Nguyen 0x11, 325b8cf46b8SThu Nguyen 0, // dataLength 326b8cf46b8SThu Nguyen /* Entity Auxiliary Names PDR Data*/ 327b8cf46b8SThu Nguyen 3, 328b8cf46b8SThu Nguyen 0x80, // entityType system software 329b8cf46b8SThu Nguyen 0x1, 330b8cf46b8SThu Nguyen 0x0, // Entity instance number =1 331b8cf46b8SThu Nguyen 0, 332b8cf46b8SThu Nguyen 0, // Overal system 333b8cf46b8SThu Nguyen 0, // shared Name Count one name only 334b8cf46b8SThu Nguyen 01, // nameStringCount 335b8cf46b8SThu Nguyen 0x65, 0x6e, 0x00, 336b8cf46b8SThu Nguyen 0x00, // Language Tag "en" 337b8cf46b8SThu Nguyen 0x53, 0x00, 0x30, 0x00, 338b8cf46b8SThu Nguyen 0x00 // Entity Name "S0" 339b8cf46b8SThu Nguyen }; 340b8cf46b8SThu Nguyen rc = mockTerminusManager.enqueueResponse( 341b8cf46b8SThu Nguyen reinterpret_cast<pldm_msg*>(getPdrAuxNameResp.data()), 342b8cf46b8SThu Nguyen sizeof(getPdrAuxNameResp)); 343b8cf46b8SThu Nguyen EXPECT_EQ(rc, PLDM_SUCCESS); 344b8cf46b8SThu Nguyen 345b8cf46b8SThu Nguyen stdexec::sync_wait(platformManager.initTerminus()); 346b8cf46b8SThu Nguyen EXPECT_EQ(true, terminus->initialized); 347b8cf46b8SThu Nguyen EXPECT_EQ(2, terminus->pdrs.size()); 348b8cf46b8SThu Nguyen EXPECT_EQ("S0", terminus->getTerminusName()); 349b8cf46b8SThu Nguyen } 350b8cf46b8SThu Nguyen 351de2a132aSGilbert Chen TEST_F(PlatformManagerTest, initTerminusDontSupportGetPDRTest) 352de2a132aSGilbert Chen { 353de2a132aSGilbert Chen // Add terminus 354de2a132aSGilbert Chen auto mappedTid = mockTerminusManager.mapTid(pldm::MctpInfo(10, "", "", 1)); 355de2a132aSGilbert Chen auto tid = mappedTid.value(); 356de2a132aSGilbert Chen termini[tid] = std::make_shared<pldm::platform_mc::Terminus>( 357de2a132aSGilbert Chen tid, 1 << PLDM_BASE | 1 << PLDM_PLATFORM); 358de2a132aSGilbert Chen auto terminus = termini[tid]; 359de2a132aSGilbert Chen 360de2a132aSGilbert Chen /* Set supported command by terminus */ 361de2a132aSGilbert Chen auto size = PLDM_MAX_TYPES * (PLDM_MAX_CMDS_PER_TYPE / 8); 362de2a132aSGilbert Chen std::vector<uint8_t> pldmCmds(size); 363de2a132aSGilbert Chen uint8_t type = PLDM_PLATFORM; 364de2a132aSGilbert Chen uint8_t cmd = PLDM_GET_PDR_REPOSITORY_INFO; 365de2a132aSGilbert Chen auto idx = type * (PLDM_MAX_CMDS_PER_TYPE / 8) + (cmd / 8); 366de2a132aSGilbert Chen pldmCmds[idx] = pldmCmds[idx] | (1 << (cmd % 8)); 367de2a132aSGilbert Chen termini[tid]->setSupportedCommands(pldmCmds); 368de2a132aSGilbert Chen 369de2a132aSGilbert Chen // queue getPDRRepositoryInfo response 370de2a132aSGilbert Chen const size_t getPDRRepositoryInfoLen = 371de2a132aSGilbert Chen PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES; 372de2a132aSGilbert Chen std::array<uint8_t, sizeof(pldm_msg_hdr) + getPDRRepositoryInfoLen> 373de2a132aSGilbert Chen getPDRRepositoryInfoResp{ 374de2a132aSGilbert Chen 0x0, 0x02, 0x50, PLDM_SUCCESS, 375de2a132aSGilbert Chen 0x0, // repositoryState 376de2a132aSGilbert Chen 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 377de2a132aSGilbert Chen 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, // updateTime 378de2a132aSGilbert Chen 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 379de2a132aSGilbert Chen 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, // OEMUpdateTime 380de2a132aSGilbert Chen 1, 0x0, 0x0, 0x0, // recordCount 381de2a132aSGilbert Chen 0x0, 0x1, 0x0, 0x0, // repositorySize 382de2a132aSGilbert Chen 59, 0x0, 0x0, 0x0, // largestRecordSize 383de2a132aSGilbert Chen 0x0 // dataTransferHandleTimeout 384de2a132aSGilbert Chen }; 385de2a132aSGilbert Chen auto rc = mockTerminusManager.enqueueResponse( 38698831af9SThu Nguyen reinterpret_cast<pldm_msg*>(getPDRRepositoryInfoResp.data()), 387de2a132aSGilbert Chen sizeof(getPDRRepositoryInfoResp)); 388de2a132aSGilbert Chen EXPECT_EQ(rc, PLDM_SUCCESS); 389de2a132aSGilbert Chen 390de2a132aSGilbert Chen // queue getPDR responses 391de2a132aSGilbert Chen const size_t getPdrRespLen = 81; 392de2a132aSGilbert Chen std::array<uint8_t, sizeof(pldm_msg_hdr) + getPdrRespLen> getPdrResp{ 393de2a132aSGilbert Chen 0x0, 0x02, 0x51, PLDM_SUCCESS, 0x0, 0x0, 0x0, 0x0, // nextRecordHandle 394de2a132aSGilbert Chen 0x0, 0x0, 0x0, 0x0, // nextDataTransferHandle 395de2a132aSGilbert Chen 0x5, // transferFlag 396de2a132aSGilbert Chen 69, 0x0, // responseCount 397de2a132aSGilbert Chen // numeric Sensor PDR 398de2a132aSGilbert Chen 0x1, 0x0, 0x0, 399de2a132aSGilbert Chen 0x0, // record handle 400de2a132aSGilbert Chen 0x1, // PDRHeaderVersion 401de2a132aSGilbert Chen PLDM_NUMERIC_SENSOR_PDR, // PDRType 402de2a132aSGilbert Chen 0x0, 403de2a132aSGilbert Chen 0x0, // recordChangeNumber 404de2a132aSGilbert Chen PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH + 405de2a132aSGilbert Chen PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH + 406de2a132aSGilbert Chen PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH, 407de2a132aSGilbert Chen 0, // dataLength 408de2a132aSGilbert Chen 0, 409de2a132aSGilbert Chen 0, // PLDMTerminusHandle 410de2a132aSGilbert Chen 0x1, 411de2a132aSGilbert Chen 0x0, // sensorID=1 412de2a132aSGilbert Chen 120, 413de2a132aSGilbert Chen 0, // entityType=Power Supply(120) 414de2a132aSGilbert Chen 1, 415de2a132aSGilbert Chen 0, // entityInstanceNumber 416de2a132aSGilbert Chen 0x1, 417de2a132aSGilbert Chen 0x0, // containerID=1 418de2a132aSGilbert Chen PLDM_NO_INIT, // sensorInit 419de2a132aSGilbert Chen false, // sensorAuxiliaryNamesPDR 420de2a132aSGilbert Chen PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C 421de2a132aSGilbert Chen 1, // unitModifier = 1 422de2a132aSGilbert Chen 0, // rateUnit 423de2a132aSGilbert Chen 0, // baseOEMUnitHandle 424de2a132aSGilbert Chen 0, // auxUnit 425de2a132aSGilbert Chen 0, // auxUnitModifier 426de2a132aSGilbert Chen 0, // auxRateUnit 427de2a132aSGilbert Chen 0, // rel 428de2a132aSGilbert Chen 0, // auxOEMUnitHandle 429de2a132aSGilbert Chen true, // isLinear 430de2a132aSGilbert Chen PLDM_SENSOR_DATA_SIZE_UINT8, // sensorDataSize 431de2a132aSGilbert Chen 0, 0, 0xc0, 432de2a132aSGilbert Chen 0x3f, // resolution=1.5 433de2a132aSGilbert Chen 0, 0, 0x80, 434de2a132aSGilbert Chen 0x3f, // offset=1.0 435de2a132aSGilbert Chen 0, 436de2a132aSGilbert Chen 0, // accuracy 437de2a132aSGilbert Chen 0, // plusTolerance 438de2a132aSGilbert Chen 0, // minusTolerance 439de2a132aSGilbert Chen 2, // hysteresis 440de2a132aSGilbert Chen 0, // supportedThresholds 441de2a132aSGilbert Chen 0, // thresholdAndHysteresisVolatility 442de2a132aSGilbert Chen 0, 0, 0x80, 443de2a132aSGilbert Chen 0x3f, // stateTransistionInterval=1.0 444de2a132aSGilbert Chen 0, 0, 0x80, 445de2a132aSGilbert Chen 0x3f, // updateInverval=1.0 446de2a132aSGilbert Chen 255, // maxReadable 447de2a132aSGilbert Chen 0, // minReadable 448de2a132aSGilbert Chen PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat 449de2a132aSGilbert Chen 0, // rangeFieldsupport 450de2a132aSGilbert Chen 0, // nominalValue 451de2a132aSGilbert Chen 0, // normalMax 452de2a132aSGilbert Chen 0, // normalMin 453de2a132aSGilbert Chen 0, // warningHigh 454de2a132aSGilbert Chen 0, // warningLow 455de2a132aSGilbert Chen 0, // criticalHigh 456de2a132aSGilbert Chen 0, // criticalLow 457de2a132aSGilbert Chen 0, // fatalHigh 458de2a132aSGilbert Chen 0 // fatalLow 459de2a132aSGilbert Chen }; 46098831af9SThu Nguyen rc = mockTerminusManager.enqueueResponse( 46198831af9SThu Nguyen reinterpret_cast<pldm_msg*>(getPdrResp.data()), sizeof(getPdrResp)); 462de2a132aSGilbert Chen EXPECT_EQ(rc, PLDM_SUCCESS); 463de2a132aSGilbert Chen 464de2a132aSGilbert Chen stdexec::sync_wait(platformManager.initTerminus()); 465de2a132aSGilbert Chen EXPECT_EQ(true, terminus->initialized); 466de2a132aSGilbert Chen EXPECT_EQ(0, terminus->pdrs.size()); 467de2a132aSGilbert Chen } 468de2a132aSGilbert Chen 469de2a132aSGilbert Chen TEST_F(PlatformManagerTest, negativeInitTerminusTest1) 470de2a132aSGilbert Chen { 471de2a132aSGilbert Chen // terminus doesn't Type2 support 472de2a132aSGilbert Chen auto mappedTid = mockTerminusManager.mapTid(pldm::MctpInfo(10, "", "", 1)); 473de2a132aSGilbert Chen auto tid = mappedTid.value(); 474de2a132aSGilbert Chen termini[tid] = 475de2a132aSGilbert Chen std::make_shared<pldm::platform_mc::Terminus>(tid, 1 << PLDM_BASE); 476de2a132aSGilbert Chen auto terminus = termini[tid]; 477de2a132aSGilbert Chen 478de2a132aSGilbert Chen stdexec::sync_wait(platformManager.initTerminus()); 479de2a132aSGilbert Chen EXPECT_EQ(true, terminus->initialized); 480de2a132aSGilbert Chen EXPECT_EQ(0, terminus->pdrs.size()); 481*eac61a4bSGilbert Chen EXPECT_EQ(0, terminus->numericSensors.size()); 482de2a132aSGilbert Chen } 483de2a132aSGilbert Chen 484de2a132aSGilbert Chen TEST_F(PlatformManagerTest, negativeInitTerminusTest2) 485de2a132aSGilbert Chen { 486de2a132aSGilbert Chen // terminus responses error 487de2a132aSGilbert Chen auto mappedTid = mockTerminusManager.mapTid(pldm::MctpInfo(10, "", "", 1)); 488de2a132aSGilbert Chen auto tid = mappedTid.value(); 489de2a132aSGilbert Chen termini[tid] = std::make_shared<pldm::platform_mc::Terminus>( 490de2a132aSGilbert Chen tid, 1 << PLDM_BASE | 1 << PLDM_PLATFORM); 491de2a132aSGilbert Chen auto terminus = termini[tid]; 492de2a132aSGilbert Chen 493de2a132aSGilbert Chen // queue getPDRRepositoryInfo response cc=PLDM_ERROR 494de2a132aSGilbert Chen const size_t getPDRRepositoryInfoLen = 1; 495de2a132aSGilbert Chen std::array<uint8_t, sizeof(pldm_msg_hdr) + getPDRRepositoryInfoLen> 496de2a132aSGilbert Chen getPDRRepositoryInfoResp{0x0, 0x02, 0x50, PLDM_ERROR}; 497de2a132aSGilbert Chen auto rc = mockTerminusManager.enqueueResponse( 49898831af9SThu Nguyen reinterpret_cast<pldm_msg*>(getPDRRepositoryInfoResp.data()), 499de2a132aSGilbert Chen sizeof(getPDRRepositoryInfoResp)); 500de2a132aSGilbert Chen EXPECT_EQ(rc, PLDM_SUCCESS); 501de2a132aSGilbert Chen 502de2a132aSGilbert Chen // queue getPDR responses cc=PLDM_ERROR 503de2a132aSGilbert Chen const size_t getPdrRespLen = 1; 504de2a132aSGilbert Chen std::array<uint8_t, sizeof(pldm_msg_hdr) + getPdrRespLen> getPdrResp{ 505de2a132aSGilbert Chen 0x0, 0x02, 0x51, PLDM_ERROR}; 50698831af9SThu Nguyen rc = mockTerminusManager.enqueueResponse( 50798831af9SThu Nguyen reinterpret_cast<pldm_msg*>(getPdrResp.data()), sizeof(getPdrResp)); 508de2a132aSGilbert Chen EXPECT_EQ(rc, PLDM_SUCCESS); 509de2a132aSGilbert Chen 510de2a132aSGilbert Chen stdexec::sync_wait(platformManager.initTerminus()); 511de2a132aSGilbert Chen EXPECT_EQ(true, terminus->initialized); 512de2a132aSGilbert Chen EXPECT_EQ(0, terminus->pdrs.size()); 513*eac61a4bSGilbert Chen EXPECT_EQ(0, terminus->numericSensors.size()); 514de2a132aSGilbert Chen } 515