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