Create a class to store messages for event log
Create a Logger class that can store log messages along with their
timestamps. These messages will then be added to an event log when they
are created for missing fans, for debug purposes. Each message is also
logged to the journal.
The maximum number of entries to keep around is specified in the
constructor, and when full the oldest message will be purged when new
ones are added. This number comes from a configuration option which
defaults to 50.
A standalone getLogger() API was also added to give the new object
singleton behavior, so the same object can be accessed from all classes
in an application.
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: I8d5ac137acb67bfe78609d02aaf59a01b03c5c8b
diff --git a/test/logger_test.cpp b/test/logger_test.cpp
new file mode 100644
index 0000000..c234b4f
--- /dev/null
+++ b/test/logger_test.cpp
@@ -0,0 +1,59 @@
+#include "logger.hpp"
+
+#include <gtest/gtest.h>
+
+using namespace phosphor::fan;
+using namespace std::literals::string_literals;
+
+TEST(LoggerTest, Test)
+{
+ const auto logSize = 5;
+
+ Logger logger{logSize};
+
+ for (int i = 0; i < logSize; i++)
+ {
+ logger.log("Test Message "s + std::to_string(i));
+ }
+
+ auto messages = logger.getLogs();
+
+ ASSERT_EQ(messages.size(), logSize);
+
+ EXPECT_EQ((messages[0][1].get<std::string>()), "Test Message 0");
+ EXPECT_EQ((messages[1][1].get<std::string>()), "Test Message 1");
+ EXPECT_EQ((messages[2][1].get<std::string>()), "Test Message 2");
+ EXPECT_EQ((messages[3][1].get<std::string>()), "Test Message 3");
+ EXPECT_EQ((messages[4][1].get<std::string>()), "Test Message 4");
+
+ // There isn't really a way to verify the timestamp, but
+ // it can at least be printed.
+ for (const auto& msg : messages)
+ {
+ std::cout << "Timestamp: " << msg[0] << "\n";
+ }
+
+ // Add another message, it should purge the first one
+ logger.log("New Message");
+
+ messages = logger.getLogs();
+ ASSERT_EQ(messages.size(), logSize);
+
+ // Check the first and last
+ EXPECT_EQ((messages[0][1].get<std::string>()), "Test Message 1");
+ EXPECT_EQ((messages[4][1].get<std::string>()), "New Message");
+
+ auto path = logger.saveToTempFile();
+ ASSERT_TRUE(std::filesystem::exists(path));
+
+ std::ifstream file{path};
+
+ // check that valid JSON was written
+ auto newJSON = nlohmann::json::parse(file);
+ EXPECT_EQ(newJSON["Logs"].size(), logSize);
+ std::filesystem::remove(path);
+
+ logger.clear();
+ messages = logger.getLogs();
+ EXPECT_TRUE(messages.empty());
+}