blob: 97fe434a83239edf4b5adda630fc39eeb7674320 [file] [log] [blame]
Alexander Hansen40fb5492025-10-28 17:56:12 +01001// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright 2019 IBM Corporation
3
Matt Spinlerf682b402019-12-18 13:48:08 -06004#include "extensions/openpower-pels/event_logger.hpp"
Matt Spinlerf682b402019-12-18 13:48:08 -06005
6#include <gtest/gtest.h>
7
8using namespace openpower::pels;
9using namespace phosphor::logging;
10
11class 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
39void 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
49TEST(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
Matt Spinler104e9362020-04-02 09:34:41 -050057 EventLogger eventLogger(std::bind(
58 std::mem_fn(&CreateHelper::create), &ch, std::placeholders::_1,
59 std::placeholders::_2, std::placeholders::_3));
Matt Spinlerf682b402019-12-18 13:48:08 -060060
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}