blob: 6a8f6e870a083fd504daca4c83ac575087b0dc82 [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"
5#include "log_manager.hpp"
6
7#include <gtest/gtest.h>
8
9using namespace openpower::pels;
10using namespace phosphor::logging;
11
12class 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
40void 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
50TEST(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
Matt Spinler104e9362020-04-02 09:34:41 -050058 EventLogger eventLogger(std::bind(
59 std::mem_fn(&CreateHelper::create), &ch, std::placeholders::_1,
60 std::placeholders::_2, std::placeholders::_3));
Matt Spinlerf682b402019-12-18 13:48:08 -060061
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}