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