1 // SPDX-License-Identifier: Apache-2.0 2 // SPDX-FileCopyrightText: Copyright 2019 IBM Corporation 3 4 #include "extensions/openpower-pels/event_logger.hpp" 5 6 #include <gtest/gtest.h> 7 8 using namespace openpower::pels; 9 using namespace phosphor::logging; 10 11 class 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 39 void 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 49 TEST(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 57 EventLogger eventLogger(std::bind( 58 std::mem_fn(&CreateHelper::create), &ch, std::placeholders::_1, 59 std::placeholders::_2, std::placeholders::_3)); 60 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 } 113