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