1*77e6fe7aSGilbert Chen #include "libpldm/base.h"
2*77e6fe7aSGilbert Chen #include "libpldm/entity.h"
3*77e6fe7aSGilbert Chen #include "libpldm/platform.h"
4*77e6fe7aSGilbert Chen 
5*77e6fe7aSGilbert Chen #include "common/instance_id.hpp"
6*77e6fe7aSGilbert Chen #include "common/types.hpp"
7*77e6fe7aSGilbert Chen #include "mock_event_manager.hpp"
8*77e6fe7aSGilbert Chen #include "mock_terminus_manager.hpp"
9*77e6fe7aSGilbert Chen #include "platform-mc/platform_manager.hpp"
10*77e6fe7aSGilbert Chen #include "platform-mc/terminus_manager.hpp"
11*77e6fe7aSGilbert Chen #include "test/test_instance_id.hpp"
12*77e6fe7aSGilbert Chen 
13*77e6fe7aSGilbert Chen #include <gtest/gtest.h>
14*77e6fe7aSGilbert Chen 
15*77e6fe7aSGilbert Chen using ::testing::_;
16*77e6fe7aSGilbert Chen using ::testing::Return;
17*77e6fe7aSGilbert Chen 
18*77e6fe7aSGilbert Chen class EventManagerTest : public testing::Test
19*77e6fe7aSGilbert Chen {
20*77e6fe7aSGilbert Chen   protected:
21*77e6fe7aSGilbert Chen     EventManagerTest() :
22*77e6fe7aSGilbert Chen         bus(pldm::utils::DBusHandler::getBus()),
23*77e6fe7aSGilbert Chen         event(sdeventplus::Event::get_default()), instanceIdDb(),
24*77e6fe7aSGilbert Chen         reqHandler(pldmTransport, event, instanceIdDb, false,
25*77e6fe7aSGilbert Chen                    std::chrono::seconds(1), 2, std::chrono::milliseconds(100)),
26*77e6fe7aSGilbert Chen         terminusManager(event, reqHandler, instanceIdDb, termini, nullptr),
27*77e6fe7aSGilbert Chen         eventManager(terminusManager, termini),
28*77e6fe7aSGilbert Chen         platformManager(terminusManager, termini)
29*77e6fe7aSGilbert Chen     {}
30*77e6fe7aSGilbert Chen 
31*77e6fe7aSGilbert Chen     PldmTransport* pldmTransport = nullptr;
32*77e6fe7aSGilbert Chen     sdbusplus::bus::bus& bus;
33*77e6fe7aSGilbert Chen     sdeventplus::Event event;
34*77e6fe7aSGilbert Chen     TestInstanceIdDb instanceIdDb;
35*77e6fe7aSGilbert Chen     pldm::requester::Handler<pldm::requester::Request> reqHandler;
36*77e6fe7aSGilbert Chen     pldm::platform_mc::MockTerminusManager terminusManager;
37*77e6fe7aSGilbert Chen     pldm::platform_mc::MockEventManager eventManager;
38*77e6fe7aSGilbert Chen     pldm::platform_mc::PlatformManager platformManager;
39*77e6fe7aSGilbert Chen     pldm::platform_mc::TerminiMapper termini{};
40*77e6fe7aSGilbert Chen };
41*77e6fe7aSGilbert Chen 
42*77e6fe7aSGilbert Chen TEST_F(EventManagerTest, processNumericSensorEventTest)
43*77e6fe7aSGilbert Chen {
44*77e6fe7aSGilbert Chen #define SENSOR_READING 50
45*77e6fe7aSGilbert Chen #define WARNING_HIGH 45
46*77e6fe7aSGilbert Chen     pldm_tid_t tid = 1;
47*77e6fe7aSGilbert Chen     termini[tid] = std::make_shared<pldm::platform_mc::Terminus>(
48*77e6fe7aSGilbert Chen         tid, 1 << PLDM_BASE | 1 << PLDM_PLATFORM);
49*77e6fe7aSGilbert Chen     std::vector<uint8_t> pdr1{
50*77e6fe7aSGilbert Chen         0x1,
51*77e6fe7aSGilbert Chen         0x0,
52*77e6fe7aSGilbert Chen         0x0,
53*77e6fe7aSGilbert Chen         0x0,                         // record handle
54*77e6fe7aSGilbert Chen         0x1,                         // PDRHeaderVersion
55*77e6fe7aSGilbert Chen         PLDM_NUMERIC_SENSOR_PDR,     // PDRType
56*77e6fe7aSGilbert Chen         0x0,
57*77e6fe7aSGilbert Chen         0x0,                         // recordChangeNumber
58*77e6fe7aSGilbert Chen         PLDM_PDR_NUMERIC_SENSOR_PDR_MIN_LENGTH,
59*77e6fe7aSGilbert Chen         0,                           // dataLength
60*77e6fe7aSGilbert Chen         0,
61*77e6fe7aSGilbert Chen         0,                           // PLDMTerminusHandle
62*77e6fe7aSGilbert Chen         0x1,
63*77e6fe7aSGilbert Chen         0x0,                         // sensorID=1
64*77e6fe7aSGilbert Chen         PLDM_ENTITY_POWER_SUPPLY,
65*77e6fe7aSGilbert Chen         0,                           // entityType=Power Supply(120)
66*77e6fe7aSGilbert Chen         1,
67*77e6fe7aSGilbert Chen         0,                           // entityInstanceNumber
68*77e6fe7aSGilbert Chen         1,
69*77e6fe7aSGilbert Chen         0,                           // containerID=1
70*77e6fe7aSGilbert Chen         PLDM_NO_INIT,                // sensorInit
71*77e6fe7aSGilbert Chen         false,                       // sensorAuxiliaryNamesPDR
72*77e6fe7aSGilbert Chen         PLDM_SENSOR_UNIT_DEGRESS_C,  // baseUint(2)=degrees C
73*77e6fe7aSGilbert Chen         0,                           // unitModifier = 0
74*77e6fe7aSGilbert Chen         0,                           // rateUnit
75*77e6fe7aSGilbert Chen         0,                           // baseOEMUnitHandle
76*77e6fe7aSGilbert Chen         0,                           // auxUnit
77*77e6fe7aSGilbert Chen         0,                           // auxUnitModifier
78*77e6fe7aSGilbert Chen         0,                           // auxRateUnit
79*77e6fe7aSGilbert Chen         0,                           // rel
80*77e6fe7aSGilbert Chen         0,                           // auxOEMUnitHandle
81*77e6fe7aSGilbert Chen         true,                        // isLinear
82*77e6fe7aSGilbert Chen         PLDM_SENSOR_DATA_SIZE_UINT8, // sensorDataSize
83*77e6fe7aSGilbert Chen         0,
84*77e6fe7aSGilbert Chen         0,
85*77e6fe7aSGilbert Chen         0x80,
86*77e6fe7aSGilbert Chen         0x3f, // resolution=1.0
87*77e6fe7aSGilbert Chen         0,
88*77e6fe7aSGilbert Chen         0,
89*77e6fe7aSGilbert Chen         0,
90*77e6fe7aSGilbert Chen         0,    // offset=0
91*77e6fe7aSGilbert Chen         0,
92*77e6fe7aSGilbert Chen         0,    // accuracy
93*77e6fe7aSGilbert Chen         0,    // plusTolerance
94*77e6fe7aSGilbert Chen         0,    // minusTolerance
95*77e6fe7aSGilbert Chen         2,    // hysteresis = 2
96*77e6fe7aSGilbert Chen         0x1b, // supportedThresholds
97*77e6fe7aSGilbert Chen         0,    // thresholdAndHysteresisVolatility
98*77e6fe7aSGilbert Chen         0,
99*77e6fe7aSGilbert Chen         0,
100*77e6fe7aSGilbert Chen         0x80,
101*77e6fe7aSGilbert Chen         0x3f, // stateTransistionInterval=1.0
102*77e6fe7aSGilbert Chen         0,
103*77e6fe7aSGilbert Chen         0,
104*77e6fe7aSGilbert Chen         0x80,
105*77e6fe7aSGilbert Chen         0x3f,                          // updateInverval=1.0
106*77e6fe7aSGilbert Chen         255,                           // maxReadable
107*77e6fe7aSGilbert Chen         0,                             // minReadable
108*77e6fe7aSGilbert Chen         PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat
109*77e6fe7aSGilbert Chen         0x18,                          // rangeFieldsupport
110*77e6fe7aSGilbert Chen         0,                             // nominalValue
111*77e6fe7aSGilbert Chen         0,                             // normalMax
112*77e6fe7aSGilbert Chen         0,                             // normalMin
113*77e6fe7aSGilbert Chen         WARNING_HIGH,                  // warningHigh
114*77e6fe7aSGilbert Chen         20,                            // warningLow
115*77e6fe7aSGilbert Chen         60,                            // criticalHigh
116*77e6fe7aSGilbert Chen         10,                            // criticalLow
117*77e6fe7aSGilbert Chen         0,                             // fatalHigh
118*77e6fe7aSGilbert Chen         0                              // fatalLow
119*77e6fe7aSGilbert Chen     };
120*77e6fe7aSGilbert Chen 
121*77e6fe7aSGilbert Chen     std::vector<uint8_t> pdr2{
122*77e6fe7aSGilbert Chen         0x1, 0x0, 0x0,
123*77e6fe7aSGilbert Chen         0x0,                             // record handle
124*77e6fe7aSGilbert Chen         0x1,                             // PDRHeaderVersion
125*77e6fe7aSGilbert Chen         PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType
126*77e6fe7aSGilbert Chen         0x1,
127*77e6fe7aSGilbert Chen         0x0,                             // recordChangeNumber
128*77e6fe7aSGilbert Chen         0x11,
129*77e6fe7aSGilbert Chen         0,                               // dataLength
130*77e6fe7aSGilbert Chen         /* Entity Auxiliary Names PDR Data*/
131*77e6fe7aSGilbert Chen         3,
132*77e6fe7aSGilbert Chen         0x80, // entityType system software
133*77e6fe7aSGilbert Chen         0x1,
134*77e6fe7aSGilbert Chen         0x0,  // Entity instance number =1
135*77e6fe7aSGilbert Chen         0,
136*77e6fe7aSGilbert Chen         0,    // Overal system
137*77e6fe7aSGilbert Chen         0,    // shared Name Count one name only
138*77e6fe7aSGilbert Chen         01,   // nameStringCount
139*77e6fe7aSGilbert Chen         0x65, 0x6e, 0x00,
140*77e6fe7aSGilbert Chen         0x00, // Language Tag "en"
141*77e6fe7aSGilbert Chen         0x53, 0x00, 0x30, 0x00,
142*77e6fe7aSGilbert Chen         0x00  // Entity Name "S0"
143*77e6fe7aSGilbert Chen     };
144*77e6fe7aSGilbert Chen 
145*77e6fe7aSGilbert Chen     // add dummy numeric sensor
146*77e6fe7aSGilbert Chen     termini[tid]->pdrs.emplace_back(pdr1);
147*77e6fe7aSGilbert Chen     termini[tid]->pdrs.emplace_back(pdr2);
148*77e6fe7aSGilbert Chen     termini[tid]->parseTerminusPDRs();
149*77e6fe7aSGilbert Chen     EXPECT_EQ(1, termini[tid]->numericSensors.size());
150*77e6fe7aSGilbert Chen 
151*77e6fe7aSGilbert Chen     uint8_t platformEventStatus = 0;
152*77e6fe7aSGilbert Chen 
153*77e6fe7aSGilbert Chen     std::vector<uint8_t> eventData{
154*77e6fe7aSGilbert Chen         0x1,
155*77e6fe7aSGilbert Chen         0x0, // sensor id
156*77e6fe7aSGilbert Chen         PLDM_NUMERIC_SENSOR_STATE,
157*77e6fe7aSGilbert Chen         PLDM_SENSOR_UPPERWARNING,
158*77e6fe7aSGilbert Chen         PLDM_SENSOR_NORMAL,
159*77e6fe7aSGilbert Chen         PLDM_SENSOR_DATA_SIZE_UINT8,
160*77e6fe7aSGilbert Chen         SENSOR_READING};
161*77e6fe7aSGilbert Chen     auto rc = eventManager.handlePlatformEvent(
162*77e6fe7aSGilbert Chen         tid, 0x00, PLDM_SENSOR_EVENT, eventData.data(), eventData.size());
163*77e6fe7aSGilbert Chen     EXPECT_EQ(PLDM_SUCCESS, rc);
164*77e6fe7aSGilbert Chen     EXPECT_EQ(PLDM_EVENT_NO_LOGGING, platformEventStatus);
165*77e6fe7aSGilbert Chen }
166*77e6fe7aSGilbert Chen 
167*77e6fe7aSGilbert Chen TEST_F(EventManagerTest, SetEventReceiverTest)
168*77e6fe7aSGilbert Chen {
169*77e6fe7aSGilbert Chen     // Add terminus
170*77e6fe7aSGilbert Chen     auto mappedTid = terminusManager.mapTid(pldm::MctpInfo(10, "", "", 1));
171*77e6fe7aSGilbert Chen     auto tid = mappedTid.value();
172*77e6fe7aSGilbert Chen     termini[tid] = std::make_shared<pldm::platform_mc::Terminus>(
173*77e6fe7aSGilbert Chen         tid, 1 << PLDM_BASE | 1 << PLDM_PLATFORM);
174*77e6fe7aSGilbert Chen     auto terminus = termini[tid];
175*77e6fe7aSGilbert Chen 
176*77e6fe7aSGilbert Chen     /* Set supported command by terminus */
177*77e6fe7aSGilbert Chen     auto size = PLDM_MAX_TYPES * (PLDM_MAX_CMDS_PER_TYPE / 8);
178*77e6fe7aSGilbert Chen     std::vector<uint8_t> pldmCmds(size);
179*77e6fe7aSGilbert Chen     uint8_t type = PLDM_PLATFORM;
180*77e6fe7aSGilbert Chen     uint8_t cmd = PLDM_GET_PDR_REPOSITORY_INFO;
181*77e6fe7aSGilbert Chen     auto idx = type * (PLDM_MAX_CMDS_PER_TYPE / 8) + (cmd / 8);
182*77e6fe7aSGilbert Chen     pldmCmds[idx] = pldmCmds[idx] | (1 << (cmd % 8));
183*77e6fe7aSGilbert Chen     cmd = PLDM_GET_PDR;
184*77e6fe7aSGilbert Chen     idx = type * (PLDM_MAX_CMDS_PER_TYPE / 8) + (cmd / 8);
185*77e6fe7aSGilbert Chen     pldmCmds[idx] = pldmCmds[idx] | (1 << (cmd % 8));
186*77e6fe7aSGilbert Chen     cmd = PLDM_EVENT_MESSAGE_SUPPORTED;
187*77e6fe7aSGilbert Chen     idx = type * (PLDM_MAX_CMDS_PER_TYPE / 8) + (cmd / 8);
188*77e6fe7aSGilbert Chen     pldmCmds[idx] = pldmCmds[idx] | (1 << (cmd % 8));
189*77e6fe7aSGilbert Chen     cmd = PLDM_EVENT_MESSAGE_BUFFER_SIZE;
190*77e6fe7aSGilbert Chen     idx = type * (PLDM_MAX_CMDS_PER_TYPE / 8) + (cmd / 8);
191*77e6fe7aSGilbert Chen     pldmCmds[idx] = pldmCmds[idx] | (1 << (cmd % 8));
192*77e6fe7aSGilbert Chen     cmd = PLDM_SET_EVENT_RECEIVER;
193*77e6fe7aSGilbert Chen     idx = type * (PLDM_MAX_CMDS_PER_TYPE / 8) + (cmd / 8);
194*77e6fe7aSGilbert Chen     pldmCmds[idx] = pldmCmds[idx] | (1 << (cmd % 8));
195*77e6fe7aSGilbert Chen     termini[tid]->setSupportedCommands(pldmCmds);
196*77e6fe7aSGilbert Chen 
197*77e6fe7aSGilbert Chen     EXPECT_EQ(true, termini[tid]->doesSupportCommand(PLDM_PLATFORM,
198*77e6fe7aSGilbert Chen                                                      PLDM_SET_EVENT_RECEIVER));
199*77e6fe7aSGilbert Chen     EXPECT_EQ(true, termini[tid]->doesSupportCommand(
200*77e6fe7aSGilbert Chen                         PLDM_PLATFORM, PLDM_EVENT_MESSAGE_BUFFER_SIZE));
201*77e6fe7aSGilbert Chen     EXPECT_EQ(true, termini[tid]->doesSupportCommand(
202*77e6fe7aSGilbert Chen                         PLDM_PLATFORM, PLDM_EVENT_MESSAGE_SUPPORTED));
203*77e6fe7aSGilbert Chen     EXPECT_EQ(true,
204*77e6fe7aSGilbert Chen               termini[tid]->doesSupportCommand(PLDM_PLATFORM, PLDM_GET_PDR));
205*77e6fe7aSGilbert Chen     EXPECT_EQ(true, termini[tid]->doesSupportCommand(
206*77e6fe7aSGilbert Chen                         PLDM_PLATFORM, PLDM_GET_PDR_REPOSITORY_INFO));
207*77e6fe7aSGilbert Chen 
208*77e6fe7aSGilbert Chen     // queue getPDRRepositoryInfo response
209*77e6fe7aSGilbert Chen     const size_t getPDRRepositoryInfoLen =
210*77e6fe7aSGilbert Chen         PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES;
211*77e6fe7aSGilbert Chen     std::array<uint8_t, sizeof(pldm_msg_hdr) + getPDRRepositoryInfoLen>
212*77e6fe7aSGilbert Chen         getPDRRepositoryInfoResp{
213*77e6fe7aSGilbert Chen             0x0, 0x02, 0x50, PLDM_SUCCESS,
214*77e6fe7aSGilbert Chen             0x0,                                     // repositoryState
215*77e6fe7aSGilbert Chen             0x0, 0x0,  0x0,  0x0,          0x0, 0x0, 0x0,
216*77e6fe7aSGilbert Chen             0x0, 0x0,  0x0,  0x0,          0x0, 0x0, // updateTime
217*77e6fe7aSGilbert Chen             0x0, 0x0,  0x0,  0x0,          0x0, 0x0, 0x0,
218*77e6fe7aSGilbert Chen             0x0, 0x0,  0x0,  0x0,          0x0, 0x0, // OEMUpdateTime
219*77e6fe7aSGilbert Chen             2,   0x0,  0x0,  0x0,                    // recordCount
220*77e6fe7aSGilbert Chen             0x0, 0x1,  0x0,  0x0,                    // repositorySize
221*77e6fe7aSGilbert Chen             59,  0x0,  0x0,  0x0,                    // largestRecordSize
222*77e6fe7aSGilbert Chen             0x0 // dataTransferHandleTimeout
223*77e6fe7aSGilbert Chen         };
224*77e6fe7aSGilbert Chen     auto rc = terminusManager.enqueueResponse(
225*77e6fe7aSGilbert Chen         reinterpret_cast<pldm_msg*>(getPDRRepositoryInfoResp.data()),
226*77e6fe7aSGilbert Chen         sizeof(getPDRRepositoryInfoResp));
227*77e6fe7aSGilbert Chen     EXPECT_EQ(rc, PLDM_SUCCESS);
228*77e6fe7aSGilbert Chen 
229*77e6fe7aSGilbert Chen     // queue getPDR responses
230*77e6fe7aSGilbert Chen     const size_t getPdrRespLen = 81;
231*77e6fe7aSGilbert Chen     std::array<uint8_t, sizeof(pldm_msg_hdr) + getPdrRespLen> getPdrResp{
232*77e6fe7aSGilbert Chen         0x0, 0x02, 0x51, PLDM_SUCCESS, 0x1, 0x0, 0x0, 0x0, // nextRecordHandle
233*77e6fe7aSGilbert Chen         0x0, 0x0, 0x0, 0x0, // nextDataTransferHandle
234*77e6fe7aSGilbert Chen         0x5,                // transferFlag
235*77e6fe7aSGilbert Chen         69, 0x0,            // responseCount
236*77e6fe7aSGilbert Chen         // numeric Sensor PDR
237*77e6fe7aSGilbert Chen         0x0, 0x0, 0x0,
238*77e6fe7aSGilbert Chen         0x0,                     // record handle
239*77e6fe7aSGilbert Chen         0x1,                     // PDRHeaderVersion
240*77e6fe7aSGilbert Chen         PLDM_NUMERIC_SENSOR_PDR, // PDRType
241*77e6fe7aSGilbert Chen         0x0,
242*77e6fe7aSGilbert Chen         0x0,                     // recordChangeNumber
243*77e6fe7aSGilbert Chen         PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
244*77e6fe7aSGilbert Chen             PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH +
245*77e6fe7aSGilbert Chen             PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH,
246*77e6fe7aSGilbert Chen         0,                             // dataLength
247*77e6fe7aSGilbert Chen         0,
248*77e6fe7aSGilbert Chen         0,                             // PLDMTerminusHandle
249*77e6fe7aSGilbert Chen         0x1,
250*77e6fe7aSGilbert Chen         0x0,                           // sensorID=1
251*77e6fe7aSGilbert Chen         120,
252*77e6fe7aSGilbert Chen         0,                             // entityType=Power Supply(120)
253*77e6fe7aSGilbert Chen         1,
254*77e6fe7aSGilbert Chen         0,                             // entityInstanceNumber
255*77e6fe7aSGilbert Chen         0x1,
256*77e6fe7aSGilbert Chen         0x0,                           // containerID=1
257*77e6fe7aSGilbert Chen         PLDM_NO_INIT,                  // sensorInit
258*77e6fe7aSGilbert Chen         false,                         // sensorAuxiliaryNamesPDR
259*77e6fe7aSGilbert Chen         PLDM_SENSOR_UNIT_DEGRESS_C,    // baseUint(2)=degrees C
260*77e6fe7aSGilbert Chen         1,                             // unitModifier = 1
261*77e6fe7aSGilbert Chen         0,                             // rateUnit
262*77e6fe7aSGilbert Chen         0,                             // baseOEMUnitHandle
263*77e6fe7aSGilbert Chen         0,                             // auxUnit
264*77e6fe7aSGilbert Chen         0,                             // auxUnitModifier
265*77e6fe7aSGilbert Chen         0,                             // auxRateUnit
266*77e6fe7aSGilbert Chen         0,                             // rel
267*77e6fe7aSGilbert Chen         0,                             // auxOEMUnitHandle
268*77e6fe7aSGilbert Chen         true,                          // isLinear
269*77e6fe7aSGilbert Chen         PLDM_SENSOR_DATA_SIZE_UINT8,   // sensorDataSize
270*77e6fe7aSGilbert Chen         0, 0, 0xc0,
271*77e6fe7aSGilbert Chen         0x3f,                          // resolution=1.5
272*77e6fe7aSGilbert Chen         0, 0, 0x80,
273*77e6fe7aSGilbert Chen         0x3f,                          // offset=1.0
274*77e6fe7aSGilbert Chen         0,
275*77e6fe7aSGilbert Chen         0,                             // accuracy
276*77e6fe7aSGilbert Chen         0,                             // plusTolerance
277*77e6fe7aSGilbert Chen         0,                             // minusTolerance
278*77e6fe7aSGilbert Chen         2,                             // hysteresis
279*77e6fe7aSGilbert Chen         0,                             // supportedThresholds
280*77e6fe7aSGilbert Chen         0,                             // thresholdAndHysteresisVolatility
281*77e6fe7aSGilbert Chen         0, 0, 0x80,
282*77e6fe7aSGilbert Chen         0x3f,                          // stateTransistionInterval=1.0
283*77e6fe7aSGilbert Chen         0, 0, 0x80,
284*77e6fe7aSGilbert Chen         0x3f,                          // updateInverval=1.0
285*77e6fe7aSGilbert Chen         255,                           // maxReadable
286*77e6fe7aSGilbert Chen         0,                             // minReadable
287*77e6fe7aSGilbert Chen         PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat
288*77e6fe7aSGilbert Chen         0,                             // rangeFieldsupport
289*77e6fe7aSGilbert Chen         0,                             // nominalValue
290*77e6fe7aSGilbert Chen         0,                             // normalMax
291*77e6fe7aSGilbert Chen         0,                             // normalMin
292*77e6fe7aSGilbert Chen         0,                             // warningHigh
293*77e6fe7aSGilbert Chen         0,                             // warningLow
294*77e6fe7aSGilbert Chen         0,                             // criticalHigh
295*77e6fe7aSGilbert Chen         0,                             // criticalLow
296*77e6fe7aSGilbert Chen         0,                             // fatalHigh
297*77e6fe7aSGilbert Chen         0                              // fatalLow
298*77e6fe7aSGilbert Chen     };
299*77e6fe7aSGilbert Chen     rc = terminusManager.enqueueResponse(
300*77e6fe7aSGilbert Chen         reinterpret_cast<pldm_msg*>(getPdrResp.data()), sizeof(getPdrResp));
301*77e6fe7aSGilbert Chen     EXPECT_EQ(rc, PLDM_SUCCESS);
302*77e6fe7aSGilbert Chen 
303*77e6fe7aSGilbert Chen     const size_t getPdrAuxNameRespLen = 39;
304*77e6fe7aSGilbert Chen     std::array<uint8_t, sizeof(pldm_msg_hdr) + getPdrAuxNameRespLen>
305*77e6fe7aSGilbert Chen         getPdrAuxNameResp{
306*77e6fe7aSGilbert Chen             0x0, 0x02, 0x51, PLDM_SUCCESS, 0x0, 0x0, 0x0,
307*77e6fe7aSGilbert Chen             0x0,                // nextRecordHandle
308*77e6fe7aSGilbert Chen             0x0, 0x0, 0x0, 0x0, // nextDataTransferHandle
309*77e6fe7aSGilbert Chen             0x5,                // transferFlag
310*77e6fe7aSGilbert Chen             0x1b, 0x0,          // responseCount
311*77e6fe7aSGilbert Chen             // Common PDR Header
312*77e6fe7aSGilbert Chen             0x1, 0x0, 0x0,
313*77e6fe7aSGilbert Chen             0x0,                             // record handle
314*77e6fe7aSGilbert Chen             0x1,                             // PDRHeaderVersion
315*77e6fe7aSGilbert Chen             PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType
316*77e6fe7aSGilbert Chen             0x1,
317*77e6fe7aSGilbert Chen             0x0,                             // recordChangeNumber
318*77e6fe7aSGilbert Chen             0x11,
319*77e6fe7aSGilbert Chen             0,                               // dataLength
320*77e6fe7aSGilbert Chen             /* Entity Auxiliary Names PDR Data*/
321*77e6fe7aSGilbert Chen             3,
322*77e6fe7aSGilbert Chen             0x80, // entityType system software
323*77e6fe7aSGilbert Chen             0x1,
324*77e6fe7aSGilbert Chen             0x0,  // Entity instance number =1
325*77e6fe7aSGilbert Chen             0,
326*77e6fe7aSGilbert Chen             0,    // Overal system
327*77e6fe7aSGilbert Chen             0,    // shared Name Count one name only
328*77e6fe7aSGilbert Chen             01,   // nameStringCount
329*77e6fe7aSGilbert Chen             0x65, 0x6e, 0x00,
330*77e6fe7aSGilbert Chen             0x00, // Language Tag "en"
331*77e6fe7aSGilbert Chen             0x53, 0x00, 0x30, 0x00,
332*77e6fe7aSGilbert Chen             0x00  // Entity Name "S0"
333*77e6fe7aSGilbert Chen         };
334*77e6fe7aSGilbert Chen     rc = terminusManager.enqueueResponse(
335*77e6fe7aSGilbert Chen         reinterpret_cast<pldm_msg*>(getPdrAuxNameResp.data()),
336*77e6fe7aSGilbert Chen         sizeof(getPdrAuxNameResp));
337*77e6fe7aSGilbert Chen     EXPECT_EQ(rc, PLDM_SUCCESS);
338*77e6fe7aSGilbert Chen 
339*77e6fe7aSGilbert Chen     // queue eventMessageBufferSize response(bufferSize=32)
340*77e6fe7aSGilbert Chen     const size_t eventMessageBufferSizeRespLen = 3;
341*77e6fe7aSGilbert Chen     std::array<uint8_t, sizeof(pldm_msg_hdr) + eventMessageBufferSizeRespLen>
342*77e6fe7aSGilbert Chen         eventMessageBufferSizeResp{0x0, 0x02, 0x0d, PLDM_SUCCESS, 32, 0};
343*77e6fe7aSGilbert Chen     rc = terminusManager.enqueueResponse(
344*77e6fe7aSGilbert Chen         reinterpret_cast<pldm_msg*>(eventMessageBufferSizeResp.data()),
345*77e6fe7aSGilbert Chen         sizeof(eventMessageBufferSizeResp));
346*77e6fe7aSGilbert Chen     EXPECT_EQ(rc, PLDM_SUCCESS);
347*77e6fe7aSGilbert Chen 
348*77e6fe7aSGilbert Chen     // queue eventMessageSupported response
349*77e6fe7aSGilbert Chen     const size_t eventMessageSupportedLen = 7;
350*77e6fe7aSGilbert Chen     PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES;
351*77e6fe7aSGilbert Chen     std::array<uint8_t, sizeof(pldm_msg_hdr) + eventMessageSupportedLen>
352*77e6fe7aSGilbert Chen         eventMessageSupportedResp{0x0,  0x02, 0x0c, PLDM_SUCCESS,
353*77e6fe7aSGilbert Chen                                   0x0,  // synchronyConfiguration
354*77e6fe7aSGilbert Chen                                   0x06, // synchronyConfigurationSupported
355*77e6fe7aSGilbert Chen                                   3,    // numberEventClassReturned
356*77e6fe7aSGilbert Chen                                   0x0,  0x5,  0xfa};
357*77e6fe7aSGilbert Chen     rc = terminusManager.enqueueResponse(
358*77e6fe7aSGilbert Chen         reinterpret_cast<pldm_msg*>(eventMessageSupportedResp.data()),
359*77e6fe7aSGilbert Chen         sizeof(eventMessageSupportedResp));
360*77e6fe7aSGilbert Chen     EXPECT_EQ(rc, PLDM_SUCCESS);
361*77e6fe7aSGilbert Chen 
362*77e6fe7aSGilbert Chen     // queue SetEventReceiver response
363*77e6fe7aSGilbert Chen     const size_t SetEventReceiverLen = 1;
364*77e6fe7aSGilbert Chen     PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES;
365*77e6fe7aSGilbert Chen     std::array<uint8_t, sizeof(pldm_msg_hdr) + SetEventReceiverLen>
366*77e6fe7aSGilbert Chen         SetEventReceiverResp{0x0, 0x02, 0x04, PLDM_SUCCESS};
367*77e6fe7aSGilbert Chen     rc = terminusManager.enqueueResponse(
368*77e6fe7aSGilbert Chen         reinterpret_cast<pldm_msg*>(SetEventReceiverResp.data()),
369*77e6fe7aSGilbert Chen         sizeof(SetEventReceiverResp));
370*77e6fe7aSGilbert Chen     EXPECT_EQ(rc, PLDM_SUCCESS);
371*77e6fe7aSGilbert Chen 
372*77e6fe7aSGilbert Chen     // should finish immediately
373*77e6fe7aSGilbert Chen     stdexec::sync_wait(platformManager.initTerminus());
374*77e6fe7aSGilbert Chen     EXPECT_EQ(true, terminus->initialized);
375*77e6fe7aSGilbert Chen     EXPECT_EQ(32, terminus->maxBufferSize);
376*77e6fe7aSGilbert Chen     EXPECT_EQ(0x06, terminus->synchronyConfigurationSupported.byte);
377*77e6fe7aSGilbert Chen     EXPECT_EQ(2, terminus->pdrs.size());
378*77e6fe7aSGilbert Chen     EXPECT_EQ(1, terminus->numericSensors.size());
379*77e6fe7aSGilbert Chen }
380*77e6fe7aSGilbert Chen 
381*77e6fe7aSGilbert Chen TEST_F(EventManagerTest, updateAvailableState)
382*77e6fe7aSGilbert Chen {
383*77e6fe7aSGilbert Chen     pldm_tid_t tid = 1;
384*77e6fe7aSGilbert Chen     eventManager.updateAvailableState(tid, true);
385*77e6fe7aSGilbert Chen     EXPECT_EQ(true, eventManager.getAvailableState(tid));
386*77e6fe7aSGilbert Chen     eventManager.updateAvailableState(tid, false);
387*77e6fe7aSGilbert Chen     EXPECT_EQ(false, eventManager.getAvailableState(tid));
388*77e6fe7aSGilbert Chen     eventManager.updateAvailableState(2, false);
389*77e6fe7aSGilbert Chen     EXPECT_EQ(false, eventManager.getAvailableState(tid));
390*77e6fe7aSGilbert Chen }
391