blob: 65505fb3c7592a433ab73ab5d6e9c1507b5f7f00 [file] [log] [blame]
#include "common/instance_id.hpp"
#include "common/types.hpp"
#include "mock_sensor_manager.hpp"
#include "platform-mc/terminus_manager.hpp"
#include "test/test_instance_id.hpp"
#include <sdeventplus/event.hpp>
#include <gtest/gtest.h>
using namespace ::testing;
class SensorManagerTest : public testing::Test
{
protected:
SensorManagerTest() :
bus(pldm::utils::DBusHandler::getBus()),
event(sdeventplus::Event::get_default()), instanceIdDb(),
reqHandler(pldmTransport, event, instanceIdDb, false),
terminusManager(event, reqHandler, instanceIdDb, termini, nullptr,
pldm::BmcMctpEid),
sensorManager(event, terminusManager, termini)
{}
void runEventLoopForSeconds(uint64_t sec)
{
uint64_t t0 = 0;
uint64_t t1 = 0;
uint64_t usec = sec * 1000000;
uint64_t elapsed = 0;
sd_event_now(event.get(), CLOCK_MONOTONIC, &t0);
do
{
if (!sd_event_run(event.get(), usec - elapsed))
{
break;
}
sd_event_now(event.get(), CLOCK_MONOTONIC, &t1);
elapsed = t1 - t0;
} while (elapsed < usec);
}
PldmTransport* pldmTransport = nullptr;
sdbusplus::bus_t& bus;
sdeventplus::Event event;
TestInstanceIdDb instanceIdDb;
pldm::requester::Handler<pldm::requester::Request> reqHandler;
pldm::platform_mc::TerminusManager terminusManager;
pldm::platform_mc::MockSensorManager sensorManager;
std::map<pldm_tid_t, std::shared_ptr<pldm::platform_mc::Terminus>> termini;
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
};
std::vector<uint8_t> pdr2{
0x1, 0x0, 0x0,
0x0, // record handle
0x1, // PDRHeaderVersion
PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType
0x1,
0x0, // recordChangeNumber
0x11,
0, // dataLength
/* Entity Auxiliary Names PDR Data*/
3,
0x80, // entityType system software
0x1,
0x0, // Entity instance number =1
0,
0, // Overal system
0, // shared Name Count one name only
01, // nameStringCount
0x65, 0x6e, 0x00,
0x00, // Language Tag "en"
0x53, 0x00, 0x30, 0x00,
0x00 // Entity Name "S0"
};
};
TEST_F(SensorManagerTest, sensorPollingTest)
{
uint64_t seconds = 10;
pldm_tid_t tid = 1;
termini[tid] = std::make_shared<pldm::platform_mc::Terminus>(tid, 0);
termini[tid]->pdrs.push_back(pdr1);
termini[tid]->pdrs.push_back(pdr2);
termini[tid]->parseTerminusPDRs();
uint64_t t0, t1;
ASSERT_TRUE(sd_event_now(event.get(), CLOCK_MONOTONIC, &t0) >= 0);
ON_CALL(sensorManager, doSensorPolling(tid))
.WillByDefault([this, &t0, &t1](unsigned char) {
ASSERT_TRUE(sd_event_now(event.get(), CLOCK_MONOTONIC, &t1) >= 0);
EXPECT_GE(t1 - t0, SENSOR_POLLING_TIME * 1000);
t0 = t1;
});
EXPECT_CALL(sensorManager, doSensorPolling(tid))
.Times(AtLeast(2))
.WillRepeatedly(Return());
sensorManager.startPolling(tid);
runEventLoopForSeconds(seconds);
sensorManager.stopPolling(tid);
}