177e6fe7aSGilbert Chen #include "libpldm/base.h"
277e6fe7aSGilbert Chen #include "libpldm/entity.h"
377e6fe7aSGilbert Chen #include "libpldm/platform.h"
477e6fe7aSGilbert Chen 
577e6fe7aSGilbert Chen #include "common/instance_id.hpp"
677e6fe7aSGilbert Chen #include "common/types.hpp"
777e6fe7aSGilbert Chen #include "mock_event_manager.hpp"
877e6fe7aSGilbert Chen #include "mock_terminus_manager.hpp"
977e6fe7aSGilbert Chen #include "platform-mc/platform_manager.hpp"
1077e6fe7aSGilbert Chen #include "platform-mc/terminus_manager.hpp"
1177e6fe7aSGilbert Chen #include "test/test_instance_id.hpp"
1277e6fe7aSGilbert Chen 
1377e6fe7aSGilbert Chen #include <gtest/gtest.h>
1477e6fe7aSGilbert Chen 
1577e6fe7aSGilbert Chen using ::testing::_;
1677e6fe7aSGilbert Chen using ::testing::Return;
1777e6fe7aSGilbert Chen 
1877e6fe7aSGilbert Chen class EventManagerTest : public testing::Test
1977e6fe7aSGilbert Chen {
2077e6fe7aSGilbert Chen   protected:
EventManagerTest()2177e6fe7aSGilbert Chen     EventManagerTest() :
2277e6fe7aSGilbert Chen         bus(pldm::utils::DBusHandler::getBus()),
2377e6fe7aSGilbert Chen         event(sdeventplus::Event::get_default()), instanceIdDb(),
2477e6fe7aSGilbert Chen         reqHandler(pldmTransport, event, instanceIdDb, false,
2577e6fe7aSGilbert Chen                    std::chrono::seconds(1), 2, std::chrono::milliseconds(100)),
2677e6fe7aSGilbert Chen         terminusManager(event, reqHandler, instanceIdDb, termini, nullptr),
2777e6fe7aSGilbert Chen         eventManager(terminusManager, termini),
2877e6fe7aSGilbert Chen         platformManager(terminusManager, termini)
2977e6fe7aSGilbert Chen     {}
3077e6fe7aSGilbert Chen 
3177e6fe7aSGilbert Chen     PldmTransport* pldmTransport = nullptr;
32*39a0e71aSPatrick Williams     sdbusplus::bus_t& bus;
3377e6fe7aSGilbert Chen     sdeventplus::Event event;
3477e6fe7aSGilbert Chen     TestInstanceIdDb instanceIdDb;
3577e6fe7aSGilbert Chen     pldm::requester::Handler<pldm::requester::Request> reqHandler;
3677e6fe7aSGilbert Chen     pldm::platform_mc::MockTerminusManager terminusManager;
3777e6fe7aSGilbert Chen     pldm::platform_mc::MockEventManager eventManager;
3877e6fe7aSGilbert Chen     pldm::platform_mc::PlatformManager platformManager;
3977e6fe7aSGilbert Chen     pldm::platform_mc::TerminiMapper termini{};
4077e6fe7aSGilbert Chen };
4177e6fe7aSGilbert Chen 
TEST_F(EventManagerTest,processNumericSensorEventTest)4277e6fe7aSGilbert Chen TEST_F(EventManagerTest, processNumericSensorEventTest)
4377e6fe7aSGilbert Chen {
4477e6fe7aSGilbert Chen #define SENSOR_READING 50
4577e6fe7aSGilbert Chen #define WARNING_HIGH 45
4677e6fe7aSGilbert Chen     pldm_tid_t tid = 1;
4777e6fe7aSGilbert Chen     termini[tid] = std::make_shared<pldm::platform_mc::Terminus>(
4877e6fe7aSGilbert Chen         tid, 1 << PLDM_BASE | 1 << PLDM_PLATFORM);
4977e6fe7aSGilbert Chen     std::vector<uint8_t> pdr1{
5077e6fe7aSGilbert Chen         0x1,
5177e6fe7aSGilbert Chen         0x0,
5277e6fe7aSGilbert Chen         0x0,
5377e6fe7aSGilbert Chen         0x0,                         // record handle
5477e6fe7aSGilbert Chen         0x1,                         // PDRHeaderVersion
5577e6fe7aSGilbert Chen         PLDM_NUMERIC_SENSOR_PDR,     // PDRType
5677e6fe7aSGilbert Chen         0x0,
5777e6fe7aSGilbert Chen         0x0,                         // recordChangeNumber
5877e6fe7aSGilbert Chen         PLDM_PDR_NUMERIC_SENSOR_PDR_MIN_LENGTH,
5977e6fe7aSGilbert Chen         0,                           // dataLength
6077e6fe7aSGilbert Chen         0,
6177e6fe7aSGilbert Chen         0,                           // PLDMTerminusHandle
6277e6fe7aSGilbert Chen         0x1,
6377e6fe7aSGilbert Chen         0x0,                         // sensorID=1
6477e6fe7aSGilbert Chen         PLDM_ENTITY_POWER_SUPPLY,
6577e6fe7aSGilbert Chen         0,                           // entityType=Power Supply(120)
6677e6fe7aSGilbert Chen         1,
6777e6fe7aSGilbert Chen         0,                           // entityInstanceNumber
6877e6fe7aSGilbert Chen         1,
6977e6fe7aSGilbert Chen         0,                           // containerID=1
7077e6fe7aSGilbert Chen         PLDM_NO_INIT,                // sensorInit
7177e6fe7aSGilbert Chen         false,                       // sensorAuxiliaryNamesPDR
7277e6fe7aSGilbert Chen         PLDM_SENSOR_UNIT_DEGRESS_C,  // baseUint(2)=degrees C
7377e6fe7aSGilbert Chen         0,                           // unitModifier = 0
7477e6fe7aSGilbert Chen         0,                           // rateUnit
7577e6fe7aSGilbert Chen         0,                           // baseOEMUnitHandle
7677e6fe7aSGilbert Chen         0,                           // auxUnit
7777e6fe7aSGilbert Chen         0,                           // auxUnitModifier
7877e6fe7aSGilbert Chen         0,                           // auxRateUnit
7977e6fe7aSGilbert Chen         0,                           // rel
8077e6fe7aSGilbert Chen         0,                           // auxOEMUnitHandle
8177e6fe7aSGilbert Chen         true,                        // isLinear
8277e6fe7aSGilbert Chen         PLDM_SENSOR_DATA_SIZE_UINT8, // sensorDataSize
8377e6fe7aSGilbert Chen         0,
8477e6fe7aSGilbert Chen         0,
8577e6fe7aSGilbert Chen         0x80,
8677e6fe7aSGilbert Chen         0x3f, // resolution=1.0
8777e6fe7aSGilbert Chen         0,
8877e6fe7aSGilbert Chen         0,
8977e6fe7aSGilbert Chen         0,
9077e6fe7aSGilbert Chen         0,    // offset=0
9177e6fe7aSGilbert Chen         0,
9277e6fe7aSGilbert Chen         0,    // accuracy
9377e6fe7aSGilbert Chen         0,    // plusTolerance
9477e6fe7aSGilbert Chen         0,    // minusTolerance
9577e6fe7aSGilbert Chen         2,    // hysteresis = 2
9677e6fe7aSGilbert Chen         0x1b, // supportedThresholds
9777e6fe7aSGilbert Chen         0,    // thresholdAndHysteresisVolatility
9877e6fe7aSGilbert Chen         0,
9977e6fe7aSGilbert Chen         0,
10077e6fe7aSGilbert Chen         0x80,
10177e6fe7aSGilbert Chen         0x3f, // stateTransistionInterval=1.0
10277e6fe7aSGilbert Chen         0,
10377e6fe7aSGilbert Chen         0,
10477e6fe7aSGilbert Chen         0x80,
10577e6fe7aSGilbert Chen         0x3f,                          // updateInverval=1.0
10677e6fe7aSGilbert Chen         255,                           // maxReadable
10777e6fe7aSGilbert Chen         0,                             // minReadable
10877e6fe7aSGilbert Chen         PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat
10977e6fe7aSGilbert Chen         0x18,                          // rangeFieldsupport
11077e6fe7aSGilbert Chen         0,                             // nominalValue
11177e6fe7aSGilbert Chen         0,                             // normalMax
11277e6fe7aSGilbert Chen         0,                             // normalMin
11377e6fe7aSGilbert Chen         WARNING_HIGH,                  // warningHigh
11477e6fe7aSGilbert Chen         20,                            // warningLow
11577e6fe7aSGilbert Chen         60,                            // criticalHigh
11677e6fe7aSGilbert Chen         10,                            // criticalLow
11777e6fe7aSGilbert Chen         0,                             // fatalHigh
11877e6fe7aSGilbert Chen         0                              // fatalLow
11977e6fe7aSGilbert Chen     };
12077e6fe7aSGilbert Chen 
12177e6fe7aSGilbert Chen     std::vector<uint8_t> pdr2{
12277e6fe7aSGilbert Chen         0x1, 0x0, 0x0,
12377e6fe7aSGilbert Chen         0x0,                             // record handle
12477e6fe7aSGilbert Chen         0x1,                             // PDRHeaderVersion
12577e6fe7aSGilbert Chen         PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType
12677e6fe7aSGilbert Chen         0x1,
12777e6fe7aSGilbert Chen         0x0,                             // recordChangeNumber
12877e6fe7aSGilbert Chen         0x11,
12977e6fe7aSGilbert Chen         0,                               // dataLength
13077e6fe7aSGilbert Chen         /* Entity Auxiliary Names PDR Data*/
13177e6fe7aSGilbert Chen         3,
13277e6fe7aSGilbert Chen         0x80, // entityType system software
13377e6fe7aSGilbert Chen         0x1,
13477e6fe7aSGilbert Chen         0x0,  // Entity instance number =1
13577e6fe7aSGilbert Chen         0,
13677e6fe7aSGilbert Chen         0,    // Overal system
13777e6fe7aSGilbert Chen         0,    // shared Name Count one name only
13877e6fe7aSGilbert Chen         01,   // nameStringCount
13977e6fe7aSGilbert Chen         0x65, 0x6e, 0x00,
14077e6fe7aSGilbert Chen         0x00, // Language Tag "en"
14177e6fe7aSGilbert Chen         0x53, 0x00, 0x30, 0x00,
14277e6fe7aSGilbert Chen         0x00  // Entity Name "S0"
14377e6fe7aSGilbert Chen     };
14477e6fe7aSGilbert Chen 
14577e6fe7aSGilbert Chen     // add dummy numeric sensor
14677e6fe7aSGilbert Chen     termini[tid]->pdrs.emplace_back(pdr1);
14777e6fe7aSGilbert Chen     termini[tid]->pdrs.emplace_back(pdr2);
14877e6fe7aSGilbert Chen     termini[tid]->parseTerminusPDRs();
14977e6fe7aSGilbert Chen     EXPECT_EQ(1, termini[tid]->numericSensors.size());
15077e6fe7aSGilbert Chen 
15177e6fe7aSGilbert Chen     uint8_t platformEventStatus = 0;
15277e6fe7aSGilbert Chen 
15377e6fe7aSGilbert Chen     std::vector<uint8_t> eventData{
15477e6fe7aSGilbert Chen         0x1,
15577e6fe7aSGilbert Chen         0x0, // sensor id
15677e6fe7aSGilbert Chen         PLDM_NUMERIC_SENSOR_STATE,
15777e6fe7aSGilbert Chen         PLDM_SENSOR_UPPERWARNING,
15877e6fe7aSGilbert Chen         PLDM_SENSOR_NORMAL,
15977e6fe7aSGilbert Chen         PLDM_SENSOR_DATA_SIZE_UINT8,
16077e6fe7aSGilbert Chen         SENSOR_READING};
16177e6fe7aSGilbert Chen     auto rc = eventManager.handlePlatformEvent(
16277e6fe7aSGilbert Chen         tid, 0x00, PLDM_SENSOR_EVENT, eventData.data(), eventData.size());
16377e6fe7aSGilbert Chen     EXPECT_EQ(PLDM_SUCCESS, rc);
16477e6fe7aSGilbert Chen     EXPECT_EQ(PLDM_EVENT_NO_LOGGING, platformEventStatus);
16577e6fe7aSGilbert Chen }
16677e6fe7aSGilbert Chen 
TEST_F(EventManagerTest,SetEventReceiverTest)16777e6fe7aSGilbert Chen TEST_F(EventManagerTest, SetEventReceiverTest)
16877e6fe7aSGilbert Chen {
16977e6fe7aSGilbert Chen     // Add terminus
17077e6fe7aSGilbert Chen     auto mappedTid = terminusManager.mapTid(pldm::MctpInfo(10, "", "", 1));
17177e6fe7aSGilbert Chen     auto tid = mappedTid.value();
17277e6fe7aSGilbert Chen     termini[tid] = std::make_shared<pldm::platform_mc::Terminus>(
17377e6fe7aSGilbert Chen         tid, 1 << PLDM_BASE | 1 << PLDM_PLATFORM);
17477e6fe7aSGilbert Chen     auto terminus = termini[tid];
17577e6fe7aSGilbert Chen 
17677e6fe7aSGilbert Chen     /* Set supported command by terminus */
17777e6fe7aSGilbert Chen     auto size = PLDM_MAX_TYPES * (PLDM_MAX_CMDS_PER_TYPE / 8);
17877e6fe7aSGilbert Chen     std::vector<uint8_t> pldmCmds(size);
17977e6fe7aSGilbert Chen     uint8_t type = PLDM_PLATFORM;
18077e6fe7aSGilbert Chen     uint8_t cmd = PLDM_GET_PDR_REPOSITORY_INFO;
18177e6fe7aSGilbert Chen     auto idx = type * (PLDM_MAX_CMDS_PER_TYPE / 8) + (cmd / 8);
18277e6fe7aSGilbert Chen     pldmCmds[idx] = pldmCmds[idx] | (1 << (cmd % 8));
18377e6fe7aSGilbert Chen     cmd = PLDM_GET_PDR;
18477e6fe7aSGilbert Chen     idx = type * (PLDM_MAX_CMDS_PER_TYPE / 8) + (cmd / 8);
18577e6fe7aSGilbert Chen     pldmCmds[idx] = pldmCmds[idx] | (1 << (cmd % 8));
18677e6fe7aSGilbert Chen     cmd = PLDM_EVENT_MESSAGE_SUPPORTED;
18777e6fe7aSGilbert Chen     idx = type * (PLDM_MAX_CMDS_PER_TYPE / 8) + (cmd / 8);
18877e6fe7aSGilbert Chen     pldmCmds[idx] = pldmCmds[idx] | (1 << (cmd % 8));
18977e6fe7aSGilbert Chen     cmd = PLDM_EVENT_MESSAGE_BUFFER_SIZE;
19077e6fe7aSGilbert Chen     idx = type * (PLDM_MAX_CMDS_PER_TYPE / 8) + (cmd / 8);
19177e6fe7aSGilbert Chen     pldmCmds[idx] = pldmCmds[idx] | (1 << (cmd % 8));
19277e6fe7aSGilbert Chen     cmd = PLDM_SET_EVENT_RECEIVER;
19377e6fe7aSGilbert Chen     idx = type * (PLDM_MAX_CMDS_PER_TYPE / 8) + (cmd / 8);
19477e6fe7aSGilbert Chen     pldmCmds[idx] = pldmCmds[idx] | (1 << (cmd % 8));
19577e6fe7aSGilbert Chen     termini[tid]->setSupportedCommands(pldmCmds);
19677e6fe7aSGilbert Chen 
19777e6fe7aSGilbert Chen     EXPECT_EQ(true, termini[tid]->doesSupportCommand(PLDM_PLATFORM,
19877e6fe7aSGilbert Chen                                                      PLDM_SET_EVENT_RECEIVER));
19977e6fe7aSGilbert Chen     EXPECT_EQ(true, termini[tid]->doesSupportCommand(
20077e6fe7aSGilbert Chen                         PLDM_PLATFORM, PLDM_EVENT_MESSAGE_BUFFER_SIZE));
20177e6fe7aSGilbert Chen     EXPECT_EQ(true, termini[tid]->doesSupportCommand(
20277e6fe7aSGilbert Chen                         PLDM_PLATFORM, PLDM_EVENT_MESSAGE_SUPPORTED));
20377e6fe7aSGilbert Chen     EXPECT_EQ(true,
20477e6fe7aSGilbert Chen               termini[tid]->doesSupportCommand(PLDM_PLATFORM, PLDM_GET_PDR));
20577e6fe7aSGilbert Chen     EXPECT_EQ(true, termini[tid]->doesSupportCommand(
20677e6fe7aSGilbert Chen                         PLDM_PLATFORM, PLDM_GET_PDR_REPOSITORY_INFO));
20777e6fe7aSGilbert Chen 
20877e6fe7aSGilbert Chen     // queue getPDRRepositoryInfo response
20977e6fe7aSGilbert Chen     const size_t getPDRRepositoryInfoLen =
21077e6fe7aSGilbert Chen         PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES;
21177e6fe7aSGilbert Chen     std::array<uint8_t, sizeof(pldm_msg_hdr) + getPDRRepositoryInfoLen>
21277e6fe7aSGilbert Chen         getPDRRepositoryInfoResp{
21377e6fe7aSGilbert Chen             0x0, 0x02, 0x50, PLDM_SUCCESS,
21477e6fe7aSGilbert Chen             0x0,                                     // repositoryState
21577e6fe7aSGilbert Chen             0x0, 0x0,  0x0,  0x0,          0x0, 0x0, 0x0,
21677e6fe7aSGilbert Chen             0x0, 0x0,  0x0,  0x0,          0x0, 0x0, // updateTime
21777e6fe7aSGilbert Chen             0x0, 0x0,  0x0,  0x0,          0x0, 0x0, 0x0,
21877e6fe7aSGilbert Chen             0x0, 0x0,  0x0,  0x0,          0x0, 0x0, // OEMUpdateTime
21977e6fe7aSGilbert Chen             2,   0x0,  0x0,  0x0,                    // recordCount
22077e6fe7aSGilbert Chen             0x0, 0x1,  0x0,  0x0,                    // repositorySize
22177e6fe7aSGilbert Chen             59,  0x0,  0x0,  0x0,                    // largestRecordSize
22277e6fe7aSGilbert Chen             0x0 // dataTransferHandleTimeout
22377e6fe7aSGilbert Chen         };
22477e6fe7aSGilbert Chen     auto rc = terminusManager.enqueueResponse(
22577e6fe7aSGilbert Chen         reinterpret_cast<pldm_msg*>(getPDRRepositoryInfoResp.data()),
22677e6fe7aSGilbert Chen         sizeof(getPDRRepositoryInfoResp));
22777e6fe7aSGilbert Chen     EXPECT_EQ(rc, PLDM_SUCCESS);
22877e6fe7aSGilbert Chen 
22977e6fe7aSGilbert Chen     // queue getPDR responses
23077e6fe7aSGilbert Chen     const size_t getPdrRespLen = 81;
23177e6fe7aSGilbert Chen     std::array<uint8_t, sizeof(pldm_msg_hdr) + getPdrRespLen> getPdrResp{
23277e6fe7aSGilbert Chen         0x0, 0x02, 0x51, PLDM_SUCCESS, 0x1, 0x0, 0x0, 0x0, // nextRecordHandle
23377e6fe7aSGilbert Chen         0x0, 0x0, 0x0, 0x0, // nextDataTransferHandle
23477e6fe7aSGilbert Chen         0x5,                // transferFlag
23577e6fe7aSGilbert Chen         69, 0x0,            // responseCount
23677e6fe7aSGilbert Chen         // numeric Sensor PDR
23777e6fe7aSGilbert Chen         0x0, 0x0, 0x0,
23877e6fe7aSGilbert Chen         0x0,                     // record handle
23977e6fe7aSGilbert Chen         0x1,                     // PDRHeaderVersion
24077e6fe7aSGilbert Chen         PLDM_NUMERIC_SENSOR_PDR, // PDRType
24177e6fe7aSGilbert Chen         0x0,
24277e6fe7aSGilbert Chen         0x0,                     // recordChangeNumber
24377e6fe7aSGilbert Chen         PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
24477e6fe7aSGilbert Chen             PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH +
24577e6fe7aSGilbert Chen             PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH,
24677e6fe7aSGilbert Chen         0,                             // dataLength
24777e6fe7aSGilbert Chen         0,
24877e6fe7aSGilbert Chen         0,                             // PLDMTerminusHandle
24977e6fe7aSGilbert Chen         0x1,
25077e6fe7aSGilbert Chen         0x0,                           // sensorID=1
25177e6fe7aSGilbert Chen         120,
25277e6fe7aSGilbert Chen         0,                             // entityType=Power Supply(120)
25377e6fe7aSGilbert Chen         1,
25477e6fe7aSGilbert Chen         0,                             // entityInstanceNumber
25577e6fe7aSGilbert Chen         0x1,
25677e6fe7aSGilbert Chen         0x0,                           // containerID=1
25777e6fe7aSGilbert Chen         PLDM_NO_INIT,                  // sensorInit
25877e6fe7aSGilbert Chen         false,                         // sensorAuxiliaryNamesPDR
25977e6fe7aSGilbert Chen         PLDM_SENSOR_UNIT_DEGRESS_C,    // baseUint(2)=degrees C
26077e6fe7aSGilbert Chen         1,                             // unitModifier = 1
26177e6fe7aSGilbert Chen         0,                             // rateUnit
26277e6fe7aSGilbert Chen         0,                             // baseOEMUnitHandle
26377e6fe7aSGilbert Chen         0,                             // auxUnit
26477e6fe7aSGilbert Chen         0,                             // auxUnitModifier
26577e6fe7aSGilbert Chen         0,                             // auxRateUnit
26677e6fe7aSGilbert Chen         0,                             // rel
26777e6fe7aSGilbert Chen         0,                             // auxOEMUnitHandle
26877e6fe7aSGilbert Chen         true,                          // isLinear
26977e6fe7aSGilbert Chen         PLDM_SENSOR_DATA_SIZE_UINT8,   // sensorDataSize
27077e6fe7aSGilbert Chen         0, 0, 0xc0,
27177e6fe7aSGilbert Chen         0x3f,                          // resolution=1.5
27277e6fe7aSGilbert Chen         0, 0, 0x80,
27377e6fe7aSGilbert Chen         0x3f,                          // offset=1.0
27477e6fe7aSGilbert Chen         0,
27577e6fe7aSGilbert Chen         0,                             // accuracy
27677e6fe7aSGilbert Chen         0,                             // plusTolerance
27777e6fe7aSGilbert Chen         0,                             // minusTolerance
27877e6fe7aSGilbert Chen         2,                             // hysteresis
27977e6fe7aSGilbert Chen         0,                             // supportedThresholds
28077e6fe7aSGilbert Chen         0,                             // thresholdAndHysteresisVolatility
28177e6fe7aSGilbert Chen         0, 0, 0x80,
28277e6fe7aSGilbert Chen         0x3f,                          // stateTransistionInterval=1.0
28377e6fe7aSGilbert Chen         0, 0, 0x80,
28477e6fe7aSGilbert Chen         0x3f,                          // updateInverval=1.0
28577e6fe7aSGilbert Chen         255,                           // maxReadable
28677e6fe7aSGilbert Chen         0,                             // minReadable
28777e6fe7aSGilbert Chen         PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat
28877e6fe7aSGilbert Chen         0,                             // rangeFieldsupport
28977e6fe7aSGilbert Chen         0,                             // nominalValue
29077e6fe7aSGilbert Chen         0,                             // normalMax
29177e6fe7aSGilbert Chen         0,                             // normalMin
29277e6fe7aSGilbert Chen         0,                             // warningHigh
29377e6fe7aSGilbert Chen         0,                             // warningLow
29477e6fe7aSGilbert Chen         0,                             // criticalHigh
29577e6fe7aSGilbert Chen         0,                             // criticalLow
29677e6fe7aSGilbert Chen         0,                             // fatalHigh
29777e6fe7aSGilbert Chen         0                              // fatalLow
29877e6fe7aSGilbert Chen     };
29977e6fe7aSGilbert Chen     rc = terminusManager.enqueueResponse(
30077e6fe7aSGilbert Chen         reinterpret_cast<pldm_msg*>(getPdrResp.data()), sizeof(getPdrResp));
30177e6fe7aSGilbert Chen     EXPECT_EQ(rc, PLDM_SUCCESS);
30277e6fe7aSGilbert Chen 
30377e6fe7aSGilbert Chen     const size_t getPdrAuxNameRespLen = 39;
30477e6fe7aSGilbert Chen     std::array<uint8_t, sizeof(pldm_msg_hdr) + getPdrAuxNameRespLen>
30577e6fe7aSGilbert Chen         getPdrAuxNameResp{
30677e6fe7aSGilbert Chen             0x0, 0x02, 0x51, PLDM_SUCCESS, 0x0, 0x0, 0x0,
30777e6fe7aSGilbert Chen             0x0,                // nextRecordHandle
30877e6fe7aSGilbert Chen             0x0, 0x0, 0x0, 0x0, // nextDataTransferHandle
30977e6fe7aSGilbert Chen             0x5,                // transferFlag
31077e6fe7aSGilbert Chen             0x1b, 0x0,          // responseCount
31177e6fe7aSGilbert Chen             // Common PDR Header
31277e6fe7aSGilbert Chen             0x1, 0x0, 0x0,
31377e6fe7aSGilbert Chen             0x0,                             // record handle
31477e6fe7aSGilbert Chen             0x1,                             // PDRHeaderVersion
31577e6fe7aSGilbert Chen             PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType
31677e6fe7aSGilbert Chen             0x1,
31777e6fe7aSGilbert Chen             0x0,                             // recordChangeNumber
31877e6fe7aSGilbert Chen             0x11,
31977e6fe7aSGilbert Chen             0,                               // dataLength
32077e6fe7aSGilbert Chen             /* Entity Auxiliary Names PDR Data*/
32177e6fe7aSGilbert Chen             3,
32277e6fe7aSGilbert Chen             0x80, // entityType system software
32377e6fe7aSGilbert Chen             0x1,
32477e6fe7aSGilbert Chen             0x0,  // Entity instance number =1
32577e6fe7aSGilbert Chen             0,
32677e6fe7aSGilbert Chen             0,    // Overal system
32777e6fe7aSGilbert Chen             0,    // shared Name Count one name only
32877e6fe7aSGilbert Chen             01,   // nameStringCount
32977e6fe7aSGilbert Chen             0x65, 0x6e, 0x00,
33077e6fe7aSGilbert Chen             0x00, // Language Tag "en"
33177e6fe7aSGilbert Chen             0x53, 0x00, 0x30, 0x00,
33277e6fe7aSGilbert Chen             0x00  // Entity Name "S0"
33377e6fe7aSGilbert Chen         };
33477e6fe7aSGilbert Chen     rc = terminusManager.enqueueResponse(
33577e6fe7aSGilbert Chen         reinterpret_cast<pldm_msg*>(getPdrAuxNameResp.data()),
33677e6fe7aSGilbert Chen         sizeof(getPdrAuxNameResp));
33777e6fe7aSGilbert Chen     EXPECT_EQ(rc, PLDM_SUCCESS);
33877e6fe7aSGilbert Chen 
33977e6fe7aSGilbert Chen     // queue eventMessageBufferSize response(bufferSize=32)
34077e6fe7aSGilbert Chen     const size_t eventMessageBufferSizeRespLen = 3;
34177e6fe7aSGilbert Chen     std::array<uint8_t, sizeof(pldm_msg_hdr) + eventMessageBufferSizeRespLen>
34277e6fe7aSGilbert Chen         eventMessageBufferSizeResp{0x0, 0x02, 0x0d, PLDM_SUCCESS, 32, 0};
34377e6fe7aSGilbert Chen     rc = terminusManager.enqueueResponse(
34477e6fe7aSGilbert Chen         reinterpret_cast<pldm_msg*>(eventMessageBufferSizeResp.data()),
34577e6fe7aSGilbert Chen         sizeof(eventMessageBufferSizeResp));
34677e6fe7aSGilbert Chen     EXPECT_EQ(rc, PLDM_SUCCESS);
34777e6fe7aSGilbert Chen 
34877e6fe7aSGilbert Chen     // queue eventMessageSupported response
34977e6fe7aSGilbert Chen     const size_t eventMessageSupportedLen = 7;
35077e6fe7aSGilbert Chen     PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES;
35177e6fe7aSGilbert Chen     std::array<uint8_t, sizeof(pldm_msg_hdr) + eventMessageSupportedLen>
35277e6fe7aSGilbert Chen         eventMessageSupportedResp{0x0,  0x02, 0x0c, PLDM_SUCCESS,
35377e6fe7aSGilbert Chen                                   0x0,  // synchronyConfiguration
35477e6fe7aSGilbert Chen                                   0x06, // synchronyConfigurationSupported
35577e6fe7aSGilbert Chen                                   3,    // numberEventClassReturned
35677e6fe7aSGilbert Chen                                   0x0,  0x5,  0xfa};
35777e6fe7aSGilbert Chen     rc = terminusManager.enqueueResponse(
35877e6fe7aSGilbert Chen         reinterpret_cast<pldm_msg*>(eventMessageSupportedResp.data()),
35977e6fe7aSGilbert Chen         sizeof(eventMessageSupportedResp));
36077e6fe7aSGilbert Chen     EXPECT_EQ(rc, PLDM_SUCCESS);
36177e6fe7aSGilbert Chen 
36277e6fe7aSGilbert Chen     // queue SetEventReceiver response
36377e6fe7aSGilbert Chen     const size_t SetEventReceiverLen = 1;
36477e6fe7aSGilbert Chen     PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES;
36577e6fe7aSGilbert Chen     std::array<uint8_t, sizeof(pldm_msg_hdr) + SetEventReceiverLen>
36677e6fe7aSGilbert Chen         SetEventReceiverResp{0x0, 0x02, 0x04, PLDM_SUCCESS};
36777e6fe7aSGilbert Chen     rc = terminusManager.enqueueResponse(
36877e6fe7aSGilbert Chen         reinterpret_cast<pldm_msg*>(SetEventReceiverResp.data()),
36977e6fe7aSGilbert Chen         sizeof(SetEventReceiverResp));
37077e6fe7aSGilbert Chen     EXPECT_EQ(rc, PLDM_SUCCESS);
37177e6fe7aSGilbert Chen 
37277e6fe7aSGilbert Chen     // should finish immediately
37377e6fe7aSGilbert Chen     stdexec::sync_wait(platformManager.initTerminus());
37477e6fe7aSGilbert Chen     EXPECT_EQ(true, terminus->initialized);
37577e6fe7aSGilbert Chen     EXPECT_EQ(32, terminus->maxBufferSize);
37677e6fe7aSGilbert Chen     EXPECT_EQ(0x06, terminus->synchronyConfigurationSupported.byte);
37777e6fe7aSGilbert Chen     EXPECT_EQ(2, terminus->pdrs.size());
37877e6fe7aSGilbert Chen     EXPECT_EQ(1, terminus->numericSensors.size());
37977e6fe7aSGilbert Chen }
38077e6fe7aSGilbert Chen 
TEST_F(EventManagerTest,updateAvailableState)38177e6fe7aSGilbert Chen TEST_F(EventManagerTest, updateAvailableState)
38277e6fe7aSGilbert Chen {
38377e6fe7aSGilbert Chen     pldm_tid_t tid = 1;
38477e6fe7aSGilbert Chen     eventManager.updateAvailableState(tid, true);
38577e6fe7aSGilbert Chen     EXPECT_EQ(true, eventManager.getAvailableState(tid));
38677e6fe7aSGilbert Chen     eventManager.updateAvailableState(tid, false);
38777e6fe7aSGilbert Chen     EXPECT_EQ(false, eventManager.getAvailableState(tid));
38877e6fe7aSGilbert Chen     eventManager.updateAvailableState(2, false);
38977e6fe7aSGilbert Chen     EXPECT_EQ(false, eventManager.getAvailableState(tid));
39077e6fe7aSGilbert Chen }
391