1f682b40dSMatt Spinler /**
2f682b40dSMatt Spinler * Copyright © 2019 IBM Corporation
3f682b40dSMatt Spinler *
4f682b40dSMatt Spinler * Licensed under the Apache License, Version 2.0 (the "License");
5f682b40dSMatt Spinler * you may not use this file except in compliance with the License.
6f682b40dSMatt Spinler * You may obtain a copy of the License at
7f682b40dSMatt Spinler *
8f682b40dSMatt Spinler * http://www.apache.org/licenses/LICENSE-2.0
9f682b40dSMatt Spinler *
10f682b40dSMatt Spinler * Unless required by applicable law or agreed to in writing, software
11f682b40dSMatt Spinler * distributed under the License is distributed on an "AS IS" BASIS,
12f682b40dSMatt Spinler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f682b40dSMatt Spinler * See the License for the specific language governing permissions and
14f682b40dSMatt Spinler * limitations under the License.
15f682b40dSMatt Spinler */
16f682b40dSMatt Spinler #include "extensions/openpower-pels/event_logger.hpp"
17f682b40dSMatt Spinler #include "log_manager.hpp"
18f682b40dSMatt Spinler
19f682b40dSMatt Spinler #include <gtest/gtest.h>
20f682b40dSMatt Spinler
21f682b40dSMatt Spinler using namespace openpower::pels;
22f682b40dSMatt Spinler using namespace phosphor::logging;
23f682b40dSMatt Spinler
24f682b40dSMatt Spinler class CreateHelper
25f682b40dSMatt Spinler {
26f682b40dSMatt Spinler public:
create(const std::string & name,Entry::Level level,const EventLogger::ADMap & ad)27f682b40dSMatt Spinler void create(const std::string& name, Entry::Level level,
28f682b40dSMatt Spinler const EventLogger::ADMap& ad)
29f682b40dSMatt Spinler {
30f682b40dSMatt Spinler _createCount++;
31f682b40dSMatt Spinler _prevName = name;
32f682b40dSMatt Spinler _prevLevel = level;
33f682b40dSMatt Spinler _prevAD = ad;
34f682b40dSMatt Spinler
35f682b40dSMatt Spinler // Try to create another event from within the creation
36f682b40dSMatt Spinler // function. Should never work or else we could get stuck
37f682b40dSMatt Spinler // infinitely creating events.
38f682b40dSMatt Spinler if (_eventLogger)
39f682b40dSMatt Spinler {
40f682b40dSMatt Spinler AdditionalData d;
41f682b40dSMatt Spinler _eventLogger->log(name, level, d);
42f682b40dSMatt Spinler }
43f682b40dSMatt Spinler }
44f682b40dSMatt Spinler
45f682b40dSMatt Spinler size_t _createCount = 0;
46f682b40dSMatt Spinler std::string _prevName;
47f682b40dSMatt Spinler Entry::Level _prevLevel;
48f682b40dSMatt Spinler EventLogger::ADMap _prevAD;
49f682b40dSMatt Spinler EventLogger* _eventLogger = nullptr;
50f682b40dSMatt Spinler };
51f682b40dSMatt Spinler
runEvents(sd_event * event,size_t numEvents)52f682b40dSMatt Spinler void runEvents(sd_event* event, size_t numEvents)
53f682b40dSMatt Spinler {
54f682b40dSMatt Spinler sdeventplus::Event e{event};
55f682b40dSMatt Spinler
56f682b40dSMatt Spinler for (size_t i = 0; i < numEvents; i++)
57f682b40dSMatt Spinler {
58f682b40dSMatt Spinler e.run(std::chrono::milliseconds(1));
59f682b40dSMatt Spinler }
60f682b40dSMatt Spinler }
61f682b40dSMatt Spinler
TEST(EventLoggerTest,TestCreateEvents)62f682b40dSMatt Spinler TEST(EventLoggerTest, TestCreateEvents)
63f682b40dSMatt Spinler {
64f682b40dSMatt Spinler sd_event* sdEvent = nullptr;
65f682b40dSMatt Spinler auto r = sd_event_default(&sdEvent);
66f682b40dSMatt Spinler ASSERT_TRUE(r >= 0);
67f682b40dSMatt Spinler
68f682b40dSMatt Spinler CreateHelper ch;
69f682b40dSMatt Spinler
70*104e9360SMatt Spinler EventLogger eventLogger(std::bind(
71*104e9360SMatt Spinler std::mem_fn(&CreateHelper::create), &ch, std::placeholders::_1,
72*104e9360SMatt Spinler std::placeholders::_2, std::placeholders::_3));
73f682b40dSMatt Spinler
74f682b40dSMatt Spinler ch._eventLogger = &eventLogger;
75f682b40dSMatt Spinler
76f682b40dSMatt Spinler AdditionalData ad;
77f682b40dSMatt Spinler ad.add("key1", "value1");
78f682b40dSMatt Spinler
79f682b40dSMatt Spinler eventLogger.log("one", Entry::Level::Error, ad);
80f682b40dSMatt Spinler EXPECT_EQ(eventLogger.queueSize(), 1);
81f682b40dSMatt Spinler
82f682b40dSMatt Spinler runEvents(sdEvent, 1);
83f682b40dSMatt Spinler
84f682b40dSMatt Spinler // Verify 1 event was created
85f682b40dSMatt Spinler EXPECT_EQ(eventLogger.queueSize(), 0);
86f682b40dSMatt Spinler EXPECT_EQ(ch._prevName, "one");
87f682b40dSMatt Spinler EXPECT_EQ(ch._prevLevel, Entry::Level::Error);
88f682b40dSMatt Spinler EXPECT_EQ(ch._prevAD, ad.getData());
89f682b40dSMatt Spinler EXPECT_EQ(ch._createCount, 1);
90f682b40dSMatt Spinler
91f682b40dSMatt Spinler // Create 2 more, and run 1 event loop at a time and check the results
92f682b40dSMatt Spinler eventLogger.log("two", Entry::Level::Error, ad);
93f682b40dSMatt Spinler eventLogger.log("three", Entry::Level::Error, ad);
94f682b40dSMatt Spinler
95f682b40dSMatt Spinler EXPECT_EQ(eventLogger.queueSize(), 2);
96f682b40dSMatt Spinler
97f682b40dSMatt Spinler runEvents(sdEvent, 1);
98f682b40dSMatt Spinler
99f682b40dSMatt Spinler EXPECT_EQ(ch._createCount, 2);
100f682b40dSMatt Spinler EXPECT_EQ(ch._prevName, "two");
101f682b40dSMatt Spinler EXPECT_EQ(eventLogger.queueSize(), 1);
102f682b40dSMatt Spinler
103f682b40dSMatt Spinler runEvents(sdEvent, 1);
104f682b40dSMatt Spinler EXPECT_EQ(ch._createCount, 3);
105f682b40dSMatt Spinler EXPECT_EQ(ch._prevName, "three");
106f682b40dSMatt Spinler EXPECT_EQ(eventLogger.queueSize(), 0);
107f682b40dSMatt Spinler
108f682b40dSMatt Spinler // Add them all again and run them all at once
109f682b40dSMatt Spinler eventLogger.log("three", Entry::Level::Error, ad);
110f682b40dSMatt Spinler eventLogger.log("two", Entry::Level::Error, ad);
111f682b40dSMatt Spinler eventLogger.log("one", Entry::Level::Error, ad);
112f682b40dSMatt Spinler runEvents(sdEvent, 3);
113f682b40dSMatt Spinler
114f682b40dSMatt Spinler EXPECT_EQ(ch._createCount, 6);
115f682b40dSMatt Spinler EXPECT_EQ(ch._prevName, "one");
116f682b40dSMatt Spinler EXPECT_EQ(eventLogger.queueSize(), 0);
117f682b40dSMatt Spinler
118f682b40dSMatt Spinler // Run extra events - doesn't do anything
119f682b40dSMatt Spinler runEvents(sdEvent, 1);
120f682b40dSMatt Spinler EXPECT_EQ(ch._createCount, 6);
121f682b40dSMatt Spinler EXPECT_EQ(ch._prevName, "one");
122f682b40dSMatt Spinler EXPECT_EQ(eventLogger.queueSize(), 0);
123f682b40dSMatt Spinler
124f682b40dSMatt Spinler sd_event_unref(sdEvent);
125f682b40dSMatt Spinler }
126