xref: /openbmc/phosphor-logging/test/openpower-pels/event_logger_test.cpp (revision b05e07c8e72fe3a55101e35ffaf7a922e315a445)
1 // SPDX-License-Identifier: Apache-2.0
2 // SPDX-FileCopyrightText: Copyright 2019 IBM Corporation
3 
4 #include "extensions/openpower-pels/event_logger.hpp"
5 
6 #include <gtest/gtest.h>
7 
8 using namespace openpower::pels;
9 using namespace phosphor::logging;
10 
11 class CreateHelper
12 {
13   public:
14     void create(const std::string& name, Entry::Level level,
15                 const EventLogger::ADMap& ad)
16     {
17         _createCount++;
18         _prevName = name;
19         _prevLevel = level;
20         _prevAD = ad;
21 
22         // Try to create another event from within the creation
23         // function.  Should never work or else we could get stuck
24         // infinitely creating events.
25         if (_eventLogger)
26         {
27             AdditionalData d;
28             _eventLogger->log(name, level, d);
29         }
30     }
31 
32     size_t _createCount = 0;
33     std::string _prevName;
34     Entry::Level _prevLevel;
35     EventLogger::ADMap _prevAD;
36     EventLogger* _eventLogger = nullptr;
37 };
38 
39 void runEvents(sd_event* event, size_t numEvents)
40 {
41     sdeventplus::Event e{event};
42 
43     for (size_t i = 0; i < numEvents; i++)
44     {
45         e.run(std::chrono::milliseconds(1));
46     }
47 }
48 
49 TEST(EventLoggerTest, TestCreateEvents)
50 {
51     sd_event* sdEvent = nullptr;
52     auto r = sd_event_default(&sdEvent);
53     ASSERT_TRUE(r >= 0);
54 
55     CreateHelper ch;
56 
57     EventLogger eventLogger(std::bind(
58         std::mem_fn(&CreateHelper::create), &ch, std::placeholders::_1,
59         std::placeholders::_2, std::placeholders::_3));
60 
61     ch._eventLogger = &eventLogger;
62 
63     AdditionalData ad;
64     ad.add("key1", "value1");
65 
66     eventLogger.log("one", Entry::Level::Error, ad);
67     EXPECT_EQ(eventLogger.queueSize(), 1);
68 
69     runEvents(sdEvent, 1);
70 
71     // Verify 1 event was created
72     EXPECT_EQ(eventLogger.queueSize(), 0);
73     EXPECT_EQ(ch._prevName, "one");
74     EXPECT_EQ(ch._prevLevel, Entry::Level::Error);
75     EXPECT_EQ(ch._prevAD, ad.getData());
76     EXPECT_EQ(ch._createCount, 1);
77 
78     // Create 2 more, and run 1 event loop at a time and check the results
79     eventLogger.log("two", Entry::Level::Error, ad);
80     eventLogger.log("three", Entry::Level::Error, ad);
81 
82     EXPECT_EQ(eventLogger.queueSize(), 2);
83 
84     runEvents(sdEvent, 1);
85 
86     EXPECT_EQ(ch._createCount, 2);
87     EXPECT_EQ(ch._prevName, "two");
88     EXPECT_EQ(eventLogger.queueSize(), 1);
89 
90     runEvents(sdEvent, 1);
91     EXPECT_EQ(ch._createCount, 3);
92     EXPECT_EQ(ch._prevName, "three");
93     EXPECT_EQ(eventLogger.queueSize(), 0);
94 
95     // Add them all again and run them all at once
96     eventLogger.log("three", Entry::Level::Error, ad);
97     eventLogger.log("two", Entry::Level::Error, ad);
98     eventLogger.log("one", Entry::Level::Error, ad);
99     runEvents(sdEvent, 3);
100 
101     EXPECT_EQ(ch._createCount, 6);
102     EXPECT_EQ(ch._prevName, "one");
103     EXPECT_EQ(eventLogger.queueSize(), 0);
104 
105     // Run extra events - doesn't do anything
106     runEvents(sdEvent, 1);
107     EXPECT_EQ(ch._createCount, 6);
108     EXPECT_EQ(ch._prevName, "one");
109     EXPECT_EQ(eventLogger.queueSize(), 0);
110 
111     sd_event_unref(sdEvent);
112 }
113