1 2 #include "libpldm/entity.h" 3 #include "libpldm/platform.h" 4 5 #include "platform-mc/numeric_sensor.hpp" 6 #include "platform-mc/terminus.hpp" 7 8 #include <gtest/gtest.h> 9 10 TEST(NumericSensor, conversionFormula) 11 { 12 std::vector<uint8_t> pdr1{ 13 0x1, 14 0x0, 15 0x0, 16 0x0, // record handle 17 0x1, // PDRHeaderVersion 18 PLDM_NUMERIC_SENSOR_PDR, // PDRType 19 0x0, 20 0x0, // recordChangeNumber 21 PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH + 22 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH + 23 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH, 24 0, // dataLength 25 0, 26 0, // PLDMTerminusHandle 27 0x1, 28 0x0, // sensorID=1 29 PLDM_ENTITY_POWER_SUPPLY, 30 0, // entityType=Power Supply(120) 31 1, 32 0, // entityInstanceNumber 33 0x1, 34 0x0, // containerID=1 35 PLDM_NO_INIT, // sensorInit 36 false, // sensorAuxiliaryNamesPDR 37 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C 38 1, // unitModifier = 1 39 0, // rateUnit 40 0, // baseOEMUnitHandle 41 0, // auxUnit 42 0, // auxUnitModifier 43 0, // auxRateUnit 44 0, // rel 45 0, // auxOEMUnitHandle 46 true, // isLinear 47 PLDM_RANGE_FIELD_FORMAT_SINT8, // sensorDataSize 48 0, 49 0, 50 0xc0, 51 0x3f, // resolution=1.5 52 0, 53 0, 54 0x80, 55 0x3f, // offset=1.0 56 0, 57 0, // accuracy 58 0, // plusTolerance 59 0, // minusTolerance 60 2, // hysteresis 61 0, // supportedThresholds 62 0, // thresholdAndHysteresisVolatility 63 0, 64 0, 65 0x80, 66 0x3f, // stateTransistionInterval=1.0 67 0, 68 0, 69 0x80, 70 0x3f, // updateInverval=1.0 71 255, // maxReadable 72 0, // minReadable 73 PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat 74 0, // rangeFieldsupport 75 0, // nominalValue 76 0, // normalMax 77 0, // normalMin 78 0, // warningHigh 79 0, // warningLow 80 0, // criticalHigh 81 0, // criticalLow 82 0, // fatalHigh 83 0 // fatalLow 84 }; 85 86 auto numericSensorPdr = std::make_shared<pldm_numeric_sensor_value_pdr>(); 87 std::printf("pdr size=%ld\n", pdr1.size()); 88 auto rc = decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), 89 numericSensorPdr.get()); 90 EXPECT_EQ(rc, PLDM_SUCCESS); 91 92 std::string sensorName{"test1"}; 93 std::string inventoryPath{ 94 "/xyz/openbmc_project/inventroy/Item/Board/PLDM_device_1"}; 95 pldm::platform_mc::NumericSensor sensor(0x01, true, numericSensorPdr, 96 sensorName, inventoryPath); 97 double reading = 40.0; 98 double convertedValue = 0; 99 convertedValue = sensor.conversionFormula(reading); 100 convertedValue = sensor.unitModifier(convertedValue); 101 102 // (40*1.5 + 1.0 ) * 10^1 = 610 103 EXPECT_EQ(610, convertedValue); 104 } 105 106 TEST(NumericSensor, checkThreshold) 107 { 108 std::vector<uint8_t> pdr1{ 109 0x1, 110 0x0, 111 0x0, 112 0x0, // record handle 113 0x1, // PDRHeaderVersion 114 PLDM_NUMERIC_SENSOR_PDR, // PDRType 115 0x0, 116 0x0, // recordChangeNumber 117 PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH + 118 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH + 119 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH, 120 0, // dataLength 121 0, 122 0, // PLDMTerminusHandle 123 0x1, 124 0x0, // sensorID=1 125 PLDM_ENTITY_POWER_SUPPLY, 126 0, // entityType=Power Supply(120) 127 1, 128 0, // entityInstanceNumber 129 0x1, 130 0x0, // containerID=1 131 PLDM_NO_INIT, // sensorInit 132 false, // sensorAuxiliaryNamesPDR 133 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C 134 1, // unitModifier = 1 135 0, // rateUnit 136 0, // baseOEMUnitHandle 137 0, // auxUnit 138 0, // auxUnitModifier 139 0, // auxRateUnit 140 0, // rel 141 0, // auxOEMUnitHandle 142 true, // isLinear 143 PLDM_RANGE_FIELD_FORMAT_SINT8, // sensorDataSize 144 0, 145 0, 146 0xc0, 147 0x3f, // resolution=1.5 148 0, 149 0, 150 0x80, 151 0x3f, // offset=1.0 152 0, 153 0, // accuracy 154 0, // plusTolerance 155 0, // minusTolerance 156 2, // hysteresis 157 0, // supportedThresholds 158 0, // thresholdAndHysteresisVolatility 159 0, 160 0, 161 0x80, 162 0x3f, // stateTransistionInterval=1.0 163 0, 164 0, 165 0x80, 166 0x3f, // updateInverval=1.0 167 255, // maxReadable 168 0, // minReadable 169 PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat 170 0, // rangeFieldsupport 171 0, // nominalValue 172 0, // normalMax 173 0, // normalMin 174 0, // warningHigh 175 0, // warningLow 176 0, // criticalHigh 177 0, // criticalLow 178 0, // fatalHigh 179 0 // fatalLow 180 }; 181 182 auto numericSensorPdr = std::make_shared<pldm_numeric_sensor_value_pdr>(); 183 auto rc = decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), 184 numericSensorPdr.get()); 185 EXPECT_EQ(rc, PLDM_SUCCESS); 186 std::string sensorName{"test1"}; 187 std::string inventoryPath{ 188 "/xyz/openbmc_project/inventroy/Item/Board/PLDM_device_1"}; 189 pldm::platform_mc::NumericSensor sensor(0x01, true, numericSensorPdr, 190 sensorName, inventoryPath); 191 192 bool highAlarm = false; 193 bool lowAlarm = false; 194 double highThreshold = 40; 195 double lowThreshold = 30; 196 double hysteresis = 2; 197 198 // reading 35->40->45->38->35->30->25->32->35 199 // highAlarm F->T ->T ->T ->F ->F ->F -> F-> F 200 // lowAlarm F->F ->F ->F ->F ->T ->T -> T ->F 201 double reading = 35; 202 highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold, 203 hysteresis); 204 EXPECT_EQ(false, highAlarm); 205 lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold, 206 hysteresis); 207 EXPECT_EQ(false, lowAlarm); 208 209 reading = 40; 210 highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold, 211 hysteresis); 212 EXPECT_EQ(true, highAlarm); 213 lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold, 214 hysteresis); 215 EXPECT_EQ(false, lowAlarm); 216 217 reading = 45; 218 highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold, 219 hysteresis); 220 EXPECT_EQ(true, highAlarm); 221 lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold, 222 hysteresis); 223 EXPECT_EQ(false, lowAlarm); 224 225 reading = 38; 226 highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold, 227 hysteresis); 228 EXPECT_EQ(true, highAlarm); 229 lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold, 230 hysteresis); 231 EXPECT_EQ(false, lowAlarm); 232 233 reading = 35; 234 highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold, 235 hysteresis); 236 EXPECT_EQ(false, highAlarm); 237 lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold, 238 hysteresis); 239 EXPECT_EQ(false, lowAlarm); 240 241 reading = 30; 242 highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold, 243 hysteresis); 244 EXPECT_EQ(false, highAlarm); 245 lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold, 246 hysteresis); 247 EXPECT_EQ(true, lowAlarm); 248 249 reading = 25; 250 highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold, 251 hysteresis); 252 EXPECT_EQ(false, highAlarm); 253 lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold, 254 hysteresis); 255 EXPECT_EQ(true, lowAlarm); 256 257 reading = 32; 258 highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold, 259 hysteresis); 260 EXPECT_EQ(false, highAlarm); 261 lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold, 262 hysteresis); 263 EXPECT_EQ(true, lowAlarm); 264 265 reading = 35; 266 highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold, 267 hysteresis); 268 EXPECT_EQ(false, highAlarm); 269 lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold, 270 hysteresis); 271 EXPECT_EQ(false, lowAlarm); 272 } 273