xref: /openbmc/phosphor-event/test/utest.cpp (revision 74c0963269a6828c42d282b97bffa1afafc1b7d0)
1*74c09632SJosh King #include "message.hpp"
237fd9a65SJosh King #include <gtest/gtest.h>
3*74c09632SJosh King #include <stdlib.h>
437fd9a65SJosh King 
5*74c09632SJosh King namespace {
6*74c09632SJosh King     uint8_t p[] ={0x3, 0x32, 0x34, 0x36};
78761dbd8SJosh King 
build_event_record(const char * message,const char * severity,const char * association,const char * reportedby,const uint8_t * p,size_t n)8*74c09632SJosh King event_record_t build_event_record(
9*74c09632SJosh King         const char* message,
10*74c09632SJosh King         const char* severity,
11*74c09632SJosh King         const char* association,
12*74c09632SJosh King         const char* reportedby,
13*74c09632SJosh King         const uint8_t* p,
14*74c09632SJosh King         size_t n)
15*74c09632SJosh King {
16*74c09632SJosh King     return event_record_t{
17*74c09632SJosh King             const_cast<char*> (message),
18*74c09632SJosh King             const_cast<char*> (severity),
19*74c09632SJosh King             const_cast<char*> (association),
20*74c09632SJosh King             const_cast<char*> (reportedby),
21*74c09632SJosh King             const_cast<uint8_t*> (p),
22*74c09632SJosh King             n};
23*74c09632SJosh King 
24*74c09632SJosh King }
2537fd9a65SJosh King }
268761dbd8SJosh King 
27*74c09632SJosh King class TestEnv : public testing::Test
28*74c09632SJosh King {
29*74c09632SJosh King public:
30*74c09632SJosh King     char eventsDir[15] = "./eventsXXXXXX";
31*74c09632SJosh King     char *eventsDirPoint = nullptr;
TestEnv()32*74c09632SJosh King     TestEnv() {
33*74c09632SJosh King         eventsDirPoint = mkdtemp(eventsDir);
34*74c09632SJosh King         if(eventsDirPoint == NULL)
35*74c09632SJosh King         {
36*74c09632SJosh King             throw std::bad_alloc();
37*74c09632SJosh King         }
38*74c09632SJosh King         CreateEventPath();
39*74c09632SJosh King     }
~TestEnv()40*74c09632SJosh King     ~TestEnv() {
41*74c09632SJosh King         RemoveEventPath();
42*74c09632SJosh King     }
CreateEventPath()43*74c09632SJosh King     void CreateEventPath()
44*74c09632SJosh King     {
45*74c09632SJosh King         char *cmd = nullptr;
46*74c09632SJosh King         int resultAsp = 0;
47*74c09632SJosh King         int resultSys = 0;
48*74c09632SJosh King         resultAsp = asprintf(&cmd, "exec rm -r %s 2> /dev/null", eventsDir);
49*74c09632SJosh King         if(resultAsp == -1){
50*74c09632SJosh King            throw std::bad_alloc();
51*74c09632SJosh King         }
52*74c09632SJosh King         resultSys = system(cmd);
53*74c09632SJosh King         if(resultSys != 0){
54*74c09632SJosh King            throw std::system_error();
55*74c09632SJosh King         }
56*74c09632SJosh King         resultAsp = asprintf(&cmd, "exec mkdir  %s 2> /dev/null", eventsDir);
57*74c09632SJosh King         if(resultAsp == -1){
58*74c09632SJosh King             throw std::bad_alloc();
59*74c09632SJosh King         }
60*74c09632SJosh King         resultSys = system(cmd);
61*74c09632SJosh King         if(resultSys != 0){
62*74c09632SJosh King             throw std::system_error();
63*74c09632SJosh King         }
64*74c09632SJosh King         free(cmd);
65*74c09632SJosh King     }
RemoveEventPath()66*74c09632SJosh King     void RemoveEventPath()
67*74c09632SJosh King     {
68*74c09632SJosh King         char *cmd = nullptr;
69*74c09632SJosh King         int resultAsp = 0;
70*74c09632SJosh King         int resultSys = 0;
718761dbd8SJosh King 
72*74c09632SJosh King         resultAsp = asprintf(&cmd, "exec rm -r %s 2> /dev/null", eventsDir);
73*74c09632SJosh King         if(resultAsp == -1){
74*74c09632SJosh King             throw std::bad_alloc();
75*74c09632SJosh King         }
76*74c09632SJosh King         resultSys = system(cmd);
77*74c09632SJosh King         if(resultSys != 0){
78*74c09632SJosh King             throw std::system_error();
79*74c09632SJosh King         }
80*74c09632SJosh King         free(cmd);
81*74c09632SJosh King     }
82*74c09632SJosh King };
83*74c09632SJosh King 
84*74c09632SJosh King class TestEventManager : public TestEnv
85*74c09632SJosh King {
86*74c09632SJosh King public:
87*74c09632SJosh King     event_manager eventManager;
88*74c09632SJosh King 
TestEventManager()89*74c09632SJosh King     TestEventManager()
90*74c09632SJosh King       : eventManager(eventsDir, 0, 0)
91*74c09632SJosh King     {
92*74c09632SJosh King         // empty
93*74c09632SJosh King     }
prepareEventLog1()94*74c09632SJosh King     uint16_t prepareEventLog1() {
95*74c09632SJosh King         auto rec = build_event_record("Testing Message1", "Info",
96*74c09632SJosh King                            "Association", "Test", p, 4);
97*74c09632SJosh King         return eventManager.create(&rec);
98*74c09632SJosh King     }
prepareEventLog2()99*74c09632SJosh King     uint16_t prepareEventLog2() {
100*74c09632SJosh King         auto rec = build_event_record("Testing Message2", "Info",
101*74c09632SJosh King                             "Association", "Test", p, 4);
102*74c09632SJosh King         return eventManager.create(&rec);
103*74c09632SJosh King     }
104*74c09632SJosh King };
105*74c09632SJosh King 
TEST_F(TestEventManager,ConstructDestruct)106*74c09632SJosh King TEST_F(TestEventManager, ConstructDestruct)
107*74c09632SJosh King {
1088761dbd8SJosh King }
1098761dbd8SJosh King 
TEST_F(TestEventManager,BuildEventLogZero)110*74c09632SJosh King TEST_F(TestEventManager, BuildEventLogZero) {
111*74c09632SJosh King    EXPECT_EQ(0, eventManager.get_managed_size());
112*74c09632SJosh King    EXPECT_EQ(0, eventManager.next_log());
113*74c09632SJosh King    eventManager.next_log_refresh();
114*74c09632SJosh King    EXPECT_EQ(0, eventManager.next_log());
115*74c09632SJosh King    EXPECT_EQ(0, eventManager.latest_log_id());
116*74c09632SJosh King    EXPECT_EQ(0, eventManager.log_count());
1178761dbd8SJosh King }
1188761dbd8SJosh King 
TEST_F(TestEventManager,BuildEventLogOne)119*74c09632SJosh King TEST_F(TestEventManager, BuildEventLogOne) {
120*74c09632SJosh King    auto msgId = prepareEventLog1();
121*74c09632SJosh King    EXPECT_EQ(1,  msgId);
122*74c09632SJosh King    EXPECT_EQ(75, eventManager.get_managed_size());
123*74c09632SJosh King    EXPECT_EQ(1,  eventManager.log_count());
124*74c09632SJosh King    EXPECT_EQ(1,  eventManager.latest_log_id());
125*74c09632SJosh King    eventManager.next_log_refresh();
126*74c09632SJosh King    /* next_log() uses readdir which reads differently per
127*74c09632SJosh King       system so just make sure its not zero. */
128*74c09632SJosh King    EXPECT_NE(0,  eventManager.next_log());
129*74c09632SJosh King    eventManager.next_log_refresh();
1308761dbd8SJosh King }
1318761dbd8SJosh King 
TEST_F(TestEventManager,BuildEventLogTwo)132*74c09632SJosh King TEST_F(TestEventManager, BuildEventLogTwo) {
133*74c09632SJosh King    auto msgId = prepareEventLog1();
134*74c09632SJosh King    EXPECT_EQ(1, msgId);
135*74c09632SJosh King    msgId = prepareEventLog2();
136*74c09632SJosh King    EXPECT_EQ(2, msgId);
137*74c09632SJosh King    EXPECT_EQ(150, eventManager.get_managed_size());
138*74c09632SJosh King    EXPECT_EQ(2,   eventManager.log_count());
139*74c09632SJosh King    EXPECT_EQ(2,   eventManager.latest_log_id());
140*74c09632SJosh King    eventManager.next_log_refresh();
141*74c09632SJosh King    /* next_log() uses readdir which reads differently per
142*74c09632SJosh King       system so just make sure its not zero. */
143*74c09632SJosh King    EXPECT_NE(0,   eventManager.next_log());
144*74c09632SJosh King    EXPECT_NE(0,   eventManager.next_log());
1458761dbd8SJosh King }
1468761dbd8SJosh King 
147*74c09632SJosh King /* Read Log 1 and 2 */
TEST_F(TestEventManager,ReadLogs)148*74c09632SJosh King TEST_F(TestEventManager, ReadLogs) {
149*74c09632SJosh King    auto msgId = prepareEventLog1();
150*74c09632SJosh King    EXPECT_EQ(1, msgId);
151*74c09632SJosh King    msgId = prepareEventLog2();
152*74c09632SJosh King    EXPECT_EQ(2, msgId);
153*74c09632SJosh King    event_record_t *prec;
154*74c09632SJosh King 
155*74c09632SJosh King    EXPECT_EQ(1, eventManager.open(1, &prec));
156*74c09632SJosh King    EXPECT_STREQ("Testing Message1", prec->message);
157*74c09632SJosh King    eventManager.close(prec);
158*74c09632SJosh King 
159*74c09632SJosh King    EXPECT_EQ(2, eventManager.open(2, &prec));
160*74c09632SJosh King    EXPECT_STREQ("Testing Message2", prec->message);
161*74c09632SJosh King    eventManager.close(prec);
162*74c09632SJosh King }
1638761dbd8SJosh King 
1648761dbd8SJosh King /* Lets delete the earlier log, then create a new event manager
1658761dbd8SJosh King    the latest_log_id should still be 2 */
TEST_F(TestEventManager,DeleteLogOne)166*74c09632SJosh King TEST_F(TestEventManager, DeleteLogOne) {
167*74c09632SJosh King    auto msgId = prepareEventLog1();
168*74c09632SJosh King    EXPECT_EQ(1, msgId);
169*74c09632SJosh King    msgId = prepareEventLog2();
170*74c09632SJosh King    EXPECT_EQ(2, msgId);
171*74c09632SJosh King    EXPECT_EQ(0, eventManager.remove(1));
172*74c09632SJosh King    EXPECT_EQ(75, eventManager.get_managed_size());
1738761dbd8SJosh King 
174*74c09632SJosh King    event_manager eventq(eventsDir, 0, 0);
175*74c09632SJosh King    EXPECT_EQ(2, eventq.latest_log_id());
176*74c09632SJosh King    EXPECT_EQ(1, eventq.log_count());
177*74c09632SJosh King    eventManager.next_log_refresh();
178*74c09632SJosh King }
1798761dbd8SJosh King 
1808761dbd8SJosh King /* Travese log list stuff */
TEST_F(TestEventManager,TraverseLogListOne)181*74c09632SJosh King TEST_F(TestEventManager, TraverseLogListOne) {
182*74c09632SJosh King    event_manager eventa(eventsDir, 0, 0);
183*74c09632SJosh King    EXPECT_EQ(0, eventa.next_log());
184*74c09632SJosh King 
185*74c09632SJosh King    auto rec = build_event_record("Testing list", "Info",
186*74c09632SJosh King                             "Association", "Test", p, 4);
187*74c09632SJosh King    EXPECT_EQ(1, eventa.create(&rec));
188*74c09632SJosh King    EXPECT_EQ(2, eventa.create(&rec));
189*74c09632SJosh King 
190*74c09632SJosh King    event_manager eventb(eventsDir, 0, 0);
191*74c09632SJosh King    /* next_log() uses readdir which reads differently per
192*74c09632SJosh King       system so just make sure its not zero. */
193*74c09632SJosh King    EXPECT_NE(0, eventb.next_log());
1948761dbd8SJosh King }
1958761dbd8SJosh King 
TEST_F(TestEnv,MaxLimitSize76)196*74c09632SJosh King TEST_F(TestEnv, MaxLimitSize76) {
1978761dbd8SJosh King 
198*74c09632SJosh King    event_manager eventd(eventsDir, 75, 0);
199*74c09632SJosh King    auto rec = build_event_record("Testing Message1", "Info",
200*74c09632SJosh King                             "Association", "Test", p, 4);
201*74c09632SJosh King    EXPECT_EQ(0, eventd.create(&rec));
202*74c09632SJosh King 
203*74c09632SJosh King    event_manager evente(eventsDir, 76, 0);
204*74c09632SJosh King    rec = build_event_record("Testing Message1", "Info",
205*74c09632SJosh King                             "Association", "Test", p, 4);
206*74c09632SJosh King    EXPECT_EQ(1, evente.create(&rec));
2078761dbd8SJosh King }
2088761dbd8SJosh King 
TEST_F(TestEnv,MaxLimitSize149)209*74c09632SJosh King TEST_F(TestEnv, MaxLimitSize149) {
210*74c09632SJosh King    event_manager eventf(eventsDir, 149, 0);
211*74c09632SJosh King    auto rec = build_event_record("Testing Message1", "Info",
212*74c09632SJosh King                             "Association", "Test", p, 4);
213*74c09632SJosh King    EXPECT_EQ(1, eventf.create(&rec));
214*74c09632SJosh King    EXPECT_EQ(0, eventf.create(&rec));
2158761dbd8SJosh King }
2168761dbd8SJosh King 
TEST_F(TestEnv,MaxLimitLog1)217*74c09632SJosh King TEST_F(TestEnv, MaxLimitLog1) {
218*74c09632SJosh King    event_manager eventg(eventsDir, 300, 1);
219*74c09632SJosh King    auto rec = build_event_record("Testing Message1", "Info",
220*74c09632SJosh King                             "Association", "Test", p, 4);
221*74c09632SJosh King    EXPECT_EQ(1, eventg.create(&rec));
222*74c09632SJosh King    EXPECT_EQ(0, eventg.create(&rec));
223*74c09632SJosh King    EXPECT_EQ(1, eventg.log_count());
224*74c09632SJosh King }
225*74c09632SJosh King 
TEST_F(TestEnv,MaxLimitLog3)226*74c09632SJosh King TEST_F(TestEnv, MaxLimitLog3) {
227*74c09632SJosh King    event_manager eventh(eventsDir, 600, 3);
228*74c09632SJosh King    auto rec = build_event_record("Testing Message1", "Info",
229*74c09632SJosh King                             "Association", "Test", p, 4);
230*74c09632SJosh King    EXPECT_EQ(1, eventh.create(&rec));
231*74c09632SJosh King    EXPECT_EQ(2, eventh.create(&rec));
232*74c09632SJosh King    EXPECT_EQ(3, eventh.create(&rec));
233*74c09632SJosh King    EXPECT_EQ(0, eventh.create(&rec));
234*74c09632SJosh King    EXPECT_EQ(3, eventh.log_count());
235*74c09632SJosh King }
2368761dbd8SJosh King 
2378761dbd8SJosh King /* Create an abundence of logs, then restart with a limited set  */
2388761dbd8SJosh King /* You should not be able to create new logs until the log size  */
2398761dbd8SJosh King /* dips below the request number                                 */
TEST_F(TestEnv,CreateLogsRestartSetOne)240*74c09632SJosh King TEST_F(TestEnv, CreateLogsRestartSetOne) {
241*74c09632SJosh King    event_manager eventi(eventsDir, 600, 3);
242*74c09632SJosh King    auto rec = build_event_record("Testing Message1", "Info",
243*74c09632SJosh King                             "Association", "Test", p, 4);
244*74c09632SJosh King    EXPECT_EQ(1, eventi.create(&rec));
245*74c09632SJosh King    EXPECT_EQ(2, eventi.create(&rec));
246*74c09632SJosh King    EXPECT_EQ(3, eventi.create(&rec));
247*74c09632SJosh King    EXPECT_EQ(0, eventi.create(&rec));
248*74c09632SJosh King    EXPECT_EQ(3, eventi.log_count());
2498761dbd8SJosh King 
250*74c09632SJosh King    event_manager eventj(eventsDir, 600, 1);
251*74c09632SJosh King    EXPECT_EQ(3, eventj.log_count());
252*74c09632SJosh King    EXPECT_EQ(0, eventj.create(&rec));
253*74c09632SJosh King    EXPECT_EQ(3, eventj.log_count());
2548761dbd8SJosh King 
2558761dbd8SJosh King    /* Delete logs to dip below the requested limit */
256*74c09632SJosh King    EXPECT_EQ(0, eventj.remove(3));
257*74c09632SJosh King    EXPECT_EQ(2, eventj.log_count());
258*74c09632SJosh King    EXPECT_EQ(0, eventj.create(&rec));
259*74c09632SJosh King    EXPECT_EQ(0, eventj.remove(2));
260*74c09632SJosh King    EXPECT_EQ(1, eventj.log_count());
261*74c09632SJosh King    EXPECT_EQ(0, eventj.create(&rec));
262*74c09632SJosh King    EXPECT_EQ(0, eventj.remove(1));
263*74c09632SJosh King    EXPECT_EQ(0, eventj.log_count());
264*74c09632SJosh King    EXPECT_EQ(7, eventj.create(&rec));
2658761dbd8SJosh King }
2668761dbd8SJosh King 
2678761dbd8SJosh King /* Create an abundence of logs, then restart with a limited set  */
2688761dbd8SJosh King /* You should not be able to create new logs until the log size  */
2698761dbd8SJosh King /* dips below the request number                                 */
TEST_F(TestEnv,CreateLogsRestartSetTwo)270*74c09632SJosh King TEST_F(TestEnv, CreateLogsRestartSetTwo) {
271*74c09632SJosh King    event_manager eventk(eventsDir, 600, 100);
272*74c09632SJosh King    auto rec = build_event_record("Testing Message1", "Info",
273*74c09632SJosh King                             "Association", "Test", p, 4);
274*74c09632SJosh King    EXPECT_EQ(1, eventk.create(&rec));
275*74c09632SJosh King    EXPECT_EQ(2, eventk.create(&rec));
276*74c09632SJosh King    /* Now we have consumed 150 bytes */
277*74c09632SJosh King    event_manager eventl(eventsDir, 151, 100);
278*74c09632SJosh King    EXPECT_EQ(0, eventl.create(&rec));
279*74c09632SJosh King    EXPECT_EQ(0, eventl.remove(2));
280*74c09632SJosh King    EXPECT_EQ(4, eventl.create(&rec));
2818761dbd8SJosh King }
282