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