blob: 8b59401c4d6cad94fb4557d5db2d933c0b4da585 [file] [log] [blame]
#include "libpldm/entity.h"
#include "libpldm/platform.h"
#include "platform-mc/numeric_sensor.hpp"
#include "platform-mc/terminus.hpp"
#include <gtest/gtest.h>
TEST(NumericSensor, conversionFormula)
{
std::vector<uint8_t> pdr1{
0x1,
0x0,
0x0,
0x0, // record handle
0x1, // PDRHeaderVersion
PLDM_NUMERIC_SENSOR_PDR, // PDRType
0x0,
0x0, // recordChangeNumber
PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH +
PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH,
0, // dataLength
0,
0, // PLDMTerminusHandle
0x1,
0x0, // sensorID=1
PLDM_ENTITY_POWER_SUPPLY,
0, // entityType=Power Supply(120)
1,
0, // entityInstanceNumber
0x1,
0x0, // containerID=1
PLDM_NO_INIT, // sensorInit
false, // sensorAuxiliaryNamesPDR
PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
1, // unitModifier = 1
0, // rateUnit
0, // baseOEMUnitHandle
0, // auxUnit
0, // auxUnitModifier
0, // auxRateUnit
0, // rel
0, // auxOEMUnitHandle
true, // isLinear
PLDM_RANGE_FIELD_FORMAT_SINT8, // sensorDataSize
0,
0,
0xc0,
0x3f, // resolution=1.5
0,
0,
0x80,
0x3f, // offset=1.0
0,
0, // accuracy
0, // plusTolerance
0, // minusTolerance
2, // hysteresis
0, // supportedThresholds
0, // thresholdAndHysteresisVolatility
0,
0,
0x80,
0x3f, // stateTransistionInterval=1.0
0,
0,
0x80,
0x3f, // updateInverval=1.0
255, // maxReadable
0, // minReadable
PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat
0, // rangeFieldsupport
0, // nominalValue
0, // normalMax
0, // normalMin
0, // warningHigh
0, // warningLow
0, // criticalHigh
0, // criticalLow
0, // fatalHigh
0 // fatalLow
};
auto numericSensorPdr = std::make_shared<pldm_numeric_sensor_value_pdr>();
std::printf("pdr size=%ld\n", pdr1.size());
auto rc = decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(),
numericSensorPdr.get());
EXPECT_EQ(rc, PLDM_SUCCESS);
std::string sensorName{"test1"};
std::string inventoryPath{
"/xyz/openbmc_project/inventroy/Item/Board/PLDM_device_1"};
pldm::platform_mc::NumericSensor sensor(0x01, true, numericSensorPdr,
sensorName, inventoryPath);
double reading = 40.0;
double convertedValue = 0;
convertedValue = sensor.conversionFormula(reading);
convertedValue = sensor.unitModifier(convertedValue);
// (40*1.5 + 1.0 ) * 10^1 = 610
EXPECT_EQ(610, convertedValue);
}
TEST(NumericSensor, checkThreshold)
{
std::vector<uint8_t> pdr1{
0x1,
0x0,
0x0,
0x0, // record handle
0x1, // PDRHeaderVersion
PLDM_NUMERIC_SENSOR_PDR, // PDRType
0x0,
0x0, // recordChangeNumber
PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH +
PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH,
0, // dataLength
0,
0, // PLDMTerminusHandle
0x1,
0x0, // sensorID=1
PLDM_ENTITY_POWER_SUPPLY,
0, // entityType=Power Supply(120)
1,
0, // entityInstanceNumber
0x1,
0x0, // containerID=1
PLDM_NO_INIT, // sensorInit
false, // sensorAuxiliaryNamesPDR
PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
1, // unitModifier = 1
0, // rateUnit
0, // baseOEMUnitHandle
0, // auxUnit
0, // auxUnitModifier
0, // auxRateUnit
0, // rel
0, // auxOEMUnitHandle
true, // isLinear
PLDM_RANGE_FIELD_FORMAT_SINT8, // sensorDataSize
0,
0,
0xc0,
0x3f, // resolution=1.5
0,
0,
0x80,
0x3f, // offset=1.0
0,
0, // accuracy
0, // plusTolerance
0, // minusTolerance
2, // hysteresis
0, // supportedThresholds
0, // thresholdAndHysteresisVolatility
0,
0,
0x80,
0x3f, // stateTransistionInterval=1.0
0,
0,
0x80,
0x3f, // updateInverval=1.0
255, // maxReadable
0, // minReadable
PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat
0, // rangeFieldsupport
0, // nominalValue
0, // normalMax
0, // normalMin
0, // warningHigh
0, // warningLow
0, // criticalHigh
0, // criticalLow
0, // fatalHigh
0 // fatalLow
};
auto numericSensorPdr = std::make_shared<pldm_numeric_sensor_value_pdr>();
auto rc = decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(),
numericSensorPdr.get());
EXPECT_EQ(rc, PLDM_SUCCESS);
std::string sensorName{"test1"};
std::string inventoryPath{
"/xyz/openbmc_project/inventroy/Item/Board/PLDM_device_1"};
pldm::platform_mc::NumericSensor sensor(0x01, true, numericSensorPdr,
sensorName, inventoryPath);
bool highAlarm = false;
bool lowAlarm = false;
double highThreshold = 40;
double lowThreshold = 30;
double hysteresis = 2;
// reading 35->40->45->38->35->30->25->32->35
// highAlarm F->T ->T ->T ->F ->F ->F -> F-> F
// lowAlarm F->F ->F ->F ->F ->T ->T -> T ->F
double reading = 35;
highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold,
hysteresis);
EXPECT_EQ(false, highAlarm);
lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold,
hysteresis);
EXPECT_EQ(false, lowAlarm);
reading = 40;
highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold,
hysteresis);
EXPECT_EQ(true, highAlarm);
lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold,
hysteresis);
EXPECT_EQ(false, lowAlarm);
reading = 45;
highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold,
hysteresis);
EXPECT_EQ(true, highAlarm);
lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold,
hysteresis);
EXPECT_EQ(false, lowAlarm);
reading = 38;
highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold,
hysteresis);
EXPECT_EQ(true, highAlarm);
lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold,
hysteresis);
EXPECT_EQ(false, lowAlarm);
reading = 35;
highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold,
hysteresis);
EXPECT_EQ(false, highAlarm);
lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold,
hysteresis);
EXPECT_EQ(false, lowAlarm);
reading = 30;
highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold,
hysteresis);
EXPECT_EQ(false, highAlarm);
lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold,
hysteresis);
EXPECT_EQ(true, lowAlarm);
reading = 25;
highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold,
hysteresis);
EXPECT_EQ(false, highAlarm);
lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold,
hysteresis);
EXPECT_EQ(true, lowAlarm);
reading = 32;
highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold,
hysteresis);
EXPECT_EQ(false, highAlarm);
lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold,
hysteresis);
EXPECT_EQ(true, lowAlarm);
reading = 35;
highAlarm = sensor.checkThreshold(highAlarm, true, reading, highThreshold,
hysteresis);
EXPECT_EQ(false, highAlarm);
lowAlarm = sensor.checkThreshold(lowAlarm, false, reading, lowThreshold,
hysteresis);
EXPECT_EQ(false, lowAlarm);
}