xref: /openbmc/pldm/platform-mc/test/sensor_manager_test.cpp (revision fdf61cc310dfe7bb56d007bf1026635081f44aca)
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