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