1eac61a4bSGilbert Chen #include "common/instance_id.hpp" 2eac61a4bSGilbert Chen #include "common/types.hpp" 3eac61a4bSGilbert Chen #include "mock_sensor_manager.hpp" 4eac61a4bSGilbert Chen #include "platform-mc/terminus_manager.hpp" 5eac61a4bSGilbert Chen #include "test/test_instance_id.hpp" 6eac61a4bSGilbert Chen 7eac61a4bSGilbert Chen #include <sdeventplus/event.hpp> 8eac61a4bSGilbert Chen 9eac61a4bSGilbert Chen #include <gtest/gtest.h> 10eac61a4bSGilbert Chen 11eac61a4bSGilbert Chen using ::testing::_; 12eac61a4bSGilbert Chen using ::testing::Between; 13eac61a4bSGilbert Chen using ::testing::Return; 14eac61a4bSGilbert Chen 15eac61a4bSGilbert Chen class SensorManagerTest : public testing::Test 16eac61a4bSGilbert Chen { 17eac61a4bSGilbert Chen protected: 18eac61a4bSGilbert Chen SensorManagerTest() : 19eac61a4bSGilbert Chen bus(pldm::utils::DBusHandler::getBus()), 20eac61a4bSGilbert Chen event(sdeventplus::Event::get_default()), instanceIdDb(), 21eac61a4bSGilbert Chen reqHandler(pldmTransport, event, instanceIdDb, false), 22eac61a4bSGilbert Chen terminusManager(event, reqHandler, instanceIdDb, termini, nullptr), 23eac61a4bSGilbert Chen sensorManager(event, terminusManager, termini) 24eac61a4bSGilbert Chen {} 25eac61a4bSGilbert Chen 26eac61a4bSGilbert Chen void runEventLoopForSeconds(uint64_t sec) 27eac61a4bSGilbert Chen { 28eac61a4bSGilbert Chen uint64_t t0 = 0; 29eac61a4bSGilbert Chen uint64_t t1 = 0; 30eac61a4bSGilbert Chen uint64_t usec = sec * 1000000; 31eac61a4bSGilbert Chen uint64_t elapsed = 0; 32eac61a4bSGilbert Chen sd_event_now(event.get(), CLOCK_MONOTONIC, &t0); 33eac61a4bSGilbert Chen do 34eac61a4bSGilbert Chen { 35eac61a4bSGilbert Chen if (!sd_event_run(event.get(), usec - elapsed)) 36eac61a4bSGilbert Chen { 37eac61a4bSGilbert Chen break; 38eac61a4bSGilbert Chen } 39eac61a4bSGilbert Chen sd_event_now(event.get(), CLOCK_MONOTONIC, &t1); 40eac61a4bSGilbert Chen elapsed = t1 - t0; 41eac61a4bSGilbert Chen } while (elapsed < usec); 42eac61a4bSGilbert Chen } 43eac61a4bSGilbert Chen 44eac61a4bSGilbert Chen PldmTransport* pldmTransport = nullptr; 45*e2b83747SPatrick Williams sdbusplus::bus_t& bus; 46eac61a4bSGilbert Chen sdeventplus::Event event; 47eac61a4bSGilbert Chen TestInstanceIdDb instanceIdDb; 48eac61a4bSGilbert Chen pldm::requester::Handler<pldm::requester::Request> reqHandler; 49eac61a4bSGilbert Chen pldm::platform_mc::TerminusManager terminusManager; 50eac61a4bSGilbert Chen pldm::platform_mc::MockSensorManager sensorManager; 51eac61a4bSGilbert Chen std::map<pldm_tid_t, std::shared_ptr<pldm::platform_mc::Terminus>> termini; 52eac61a4bSGilbert Chen 53eac61a4bSGilbert Chen std::vector<uint8_t> pdr1{ 54eac61a4bSGilbert Chen 0x1, 55eac61a4bSGilbert Chen 0x0, 56eac61a4bSGilbert Chen 0x0, 57eac61a4bSGilbert Chen 0x0, // record handle 58eac61a4bSGilbert Chen 0x1, // PDRHeaderVersion 59eac61a4bSGilbert Chen PLDM_NUMERIC_SENSOR_PDR, // PDRType 60eac61a4bSGilbert Chen 0x0, 61eac61a4bSGilbert Chen 0x0, // recordChangeNumber 62eac61a4bSGilbert Chen PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH + 63eac61a4bSGilbert Chen PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH + 64eac61a4bSGilbert Chen PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH, 65eac61a4bSGilbert Chen 0, // dataLength 66eac61a4bSGilbert Chen 0, 67eac61a4bSGilbert Chen 0, // PLDMTerminusHandle 68eac61a4bSGilbert Chen 0x1, 69eac61a4bSGilbert Chen 0x0, // sensorID=1 70eac61a4bSGilbert Chen PLDM_ENTITY_POWER_SUPPLY, 71eac61a4bSGilbert Chen 0, // entityType=Power Supply(120) 72eac61a4bSGilbert Chen 1, 73eac61a4bSGilbert Chen 0, // entityInstanceNumber 74eac61a4bSGilbert Chen 0x1, 75eac61a4bSGilbert Chen 0x0, // containerID=1 76eac61a4bSGilbert Chen PLDM_NO_INIT, // sensorInit 77eac61a4bSGilbert Chen false, // sensorAuxiliaryNamesPDR 78eac61a4bSGilbert Chen PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C 79eac61a4bSGilbert Chen 1, // unitModifier = 1 80eac61a4bSGilbert Chen 0, // rateUnit 81eac61a4bSGilbert Chen 0, // baseOEMUnitHandle 82eac61a4bSGilbert Chen 0, // auxUnit 83eac61a4bSGilbert Chen 0, // auxUnitModifier 84eac61a4bSGilbert Chen 0, // auxRateUnit 85eac61a4bSGilbert Chen 0, // rel 86eac61a4bSGilbert Chen 0, // auxOEMUnitHandle 87eac61a4bSGilbert Chen true, // isLinear 88eac61a4bSGilbert Chen PLDM_RANGE_FIELD_FORMAT_SINT8, // sensorDataSize 89eac61a4bSGilbert Chen 0, 90eac61a4bSGilbert Chen 0, 91eac61a4bSGilbert Chen 0xc0, 92eac61a4bSGilbert Chen 0x3f, // resolution=1.5 93eac61a4bSGilbert Chen 0, 94eac61a4bSGilbert Chen 0, 95eac61a4bSGilbert Chen 0x80, 96eac61a4bSGilbert Chen 0x3f, // offset=1.0 97eac61a4bSGilbert Chen 0, 98eac61a4bSGilbert Chen 0, // accuracy 99eac61a4bSGilbert Chen 0, // plusTolerance 100eac61a4bSGilbert Chen 0, // minusTolerance 101eac61a4bSGilbert Chen 2, // hysteresis 102eac61a4bSGilbert Chen 0, // supportedThresholds 103eac61a4bSGilbert Chen 0, // thresholdAndHysteresisVolatility 104eac61a4bSGilbert Chen 0, 105eac61a4bSGilbert Chen 0, 106eac61a4bSGilbert Chen 0x80, 107eac61a4bSGilbert Chen 0x3f, // stateTransistionInterval=1.0 108eac61a4bSGilbert Chen 0, 109eac61a4bSGilbert Chen 0, 110eac61a4bSGilbert Chen 0x80, 111eac61a4bSGilbert Chen 0x3f, // updateInverval=1.0 112eac61a4bSGilbert Chen 255, // maxReadable 113eac61a4bSGilbert Chen 0, // minReadable 114eac61a4bSGilbert Chen PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat 115eac61a4bSGilbert Chen 0, // rangeFieldsupport 116eac61a4bSGilbert Chen 0, // nominalValue 117eac61a4bSGilbert Chen 0, // normalMax 118eac61a4bSGilbert Chen 0, // normalMin 119eac61a4bSGilbert Chen 0, // warningHigh 120eac61a4bSGilbert Chen 0, // warningLow 121eac61a4bSGilbert Chen 0, // criticalHigh 122eac61a4bSGilbert Chen 0, // criticalLow 123eac61a4bSGilbert Chen 0, // fatalHigh 124eac61a4bSGilbert Chen 0 // fatalLow 125eac61a4bSGilbert Chen }; 126eac61a4bSGilbert Chen 127eac61a4bSGilbert Chen std::vector<uint8_t> pdr2{ 128eac61a4bSGilbert Chen 0x1, 0x0, 0x0, 129eac61a4bSGilbert Chen 0x0, // record handle 130eac61a4bSGilbert Chen 0x1, // PDRHeaderVersion 131eac61a4bSGilbert Chen PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType 132eac61a4bSGilbert Chen 0x1, 133eac61a4bSGilbert Chen 0x0, // recordChangeNumber 134eac61a4bSGilbert Chen 0x11, 135eac61a4bSGilbert Chen 0, // dataLength 136eac61a4bSGilbert Chen /* Entity Auxiliary Names PDR Data*/ 137eac61a4bSGilbert Chen 3, 138eac61a4bSGilbert Chen 0x80, // entityType system software 139eac61a4bSGilbert Chen 0x1, 140eac61a4bSGilbert Chen 0x0, // Entity instance number =1 141eac61a4bSGilbert Chen 0, 142eac61a4bSGilbert Chen 0, // Overal system 143eac61a4bSGilbert Chen 0, // shared Name Count one name only 144eac61a4bSGilbert Chen 01, // nameStringCount 145eac61a4bSGilbert Chen 0x65, 0x6e, 0x00, 146eac61a4bSGilbert Chen 0x00, // Language Tag "en" 147eac61a4bSGilbert Chen 0x53, 0x00, 0x30, 0x00, 148eac61a4bSGilbert Chen 0x00 // Entity Name "S0" 149eac61a4bSGilbert Chen }; 150eac61a4bSGilbert Chen }; 151eac61a4bSGilbert Chen 152eac61a4bSGilbert Chen TEST_F(SensorManagerTest, sensorPollingTest) 153eac61a4bSGilbert Chen { 154eac61a4bSGilbert Chen uint64_t seconds = 10; 155eac61a4bSGilbert Chen uint64_t expectedTimes = (seconds * 1000) / SENSOR_POLLING_TIME; 156eac61a4bSGilbert Chen 157eac61a4bSGilbert Chen pldm_tid_t tid = 1; 158eac61a4bSGilbert Chen termini[tid] = std::make_shared<pldm::platform_mc::Terminus>(tid, 0); 159eac61a4bSGilbert Chen termini[tid]->pdrs.push_back(pdr1); 160eac61a4bSGilbert Chen termini[tid]->pdrs.push_back(pdr2); 161eac61a4bSGilbert Chen termini[tid]->parseTerminusPDRs(); 162eac61a4bSGilbert Chen 163eac61a4bSGilbert Chen EXPECT_CALL(sensorManager, doSensorPolling(tid)) 164eac61a4bSGilbert Chen .Times(Between(expectedTimes - 3, expectedTimes + 3)) 165eac61a4bSGilbert Chen .WillRepeatedly(Return()); 166eac61a4bSGilbert Chen 167eac61a4bSGilbert Chen sensorManager.startPolling(tid); 168eac61a4bSGilbert Chen 169eac61a4bSGilbert Chen runEventLoopForSeconds(seconds); 170eac61a4bSGilbert Chen 171eac61a4bSGilbert Chen sensorManager.stopPolling(tid); 172eac61a4bSGilbert Chen } 173