diff options
-rw-r--r-- | Swiften/Base/Log.cpp | 28 | ||||
-rw-r--r-- | Swiften/Base/Log.h | 14 | ||||
-rw-r--r-- | Swiften/Base/UnitTest/LogTest.cpp | 49 | ||||
-rw-r--r-- | Swiften/SConscript | 1 |
4 files changed, 83 insertions, 9 deletions
diff --git a/Swiften/Base/Log.cpp b/Swiften/Base/Log.cpp index 9b16531..abfd2bc 100644 --- a/Swiften/Base/Log.cpp +++ b/Swiften/Base/Log.cpp @@ -19,2 +19,3 @@ static Log::Severity logLevel = Log::warning; std::unique_ptr<FILE, Log::LogFileClose> Log::logfile; +Log::Callback Log::logCallback; @@ -28,3 +29,6 @@ Log::~Log() { // Using stdio for thread safety (POSIX file i/o calls are guaranteed to be atomic) - if (logfile) { + if (logCallback) { + logCallback(severity_, std::move(file_), line_, std::move(function_), stream.str()); + } + else if (logfile) { fwrite(stream.str().c_str(), sizeof(char), stream.str().size(), logfile.get()); @@ -40,8 +44,16 @@ Log::~Log() { std::ostringstream& Log::getStream( - Severity /*severity*/, - const std::string& severityString, - const std::string& file, + Severity severity, + std::string severityString, + std::string file, int line, - const std::string& function) { - stream << "[" << severityString << "] " << file << ":" << line << " " << function << ": "; + std::string function) { + if (logCallback) { + severity_ = severity; + file_ = std::move(file); + line_ = line; + function_ = std::move(function); + } + else { + stream << "[" << severityString << "] " << file << ":" << line << " " << function << ": "; + } return stream; @@ -63,2 +75,6 @@ void Log::setLogFile(const std::string& fileName) { +void Log::setLogCallback(Callback callback) { + Log::logCallback = callback; +} + } diff --git a/Swiften/Base/Log.h b/Swiften/Base/Log.h index e3e04a5..255e478 100644 --- a/Swiften/Base/Log.h +++ b/Swiften/Base/Log.h @@ -9,2 +9,3 @@ #include <cstdio> +#include <functional> #include <memory> @@ -20,2 +21,3 @@ namespace Swift { }; + using Callback = std::function<void(Severity severity, std::string file, int line, std::string function, std::string message)>; @@ -26,6 +28,6 @@ namespace Swift { Severity severity, - const std::string& severityString, - const std::string& file, + std::string severityString, + std::string file, int line, - const std::string& function); + std::string function); @@ -34,2 +36,3 @@ namespace Swift { static void setLogFile(const std::string& fileName); + static void setLogCallback(Callback callback); @@ -45,2 +48,7 @@ namespace Swift { static std::unique_ptr<FILE, LogFileClose> logfile; + static Callback logCallback; + Severity severity_; + std::string file_; + int line_; + std::string function_; }; diff --git a/Swiften/Base/UnitTest/LogTest.cpp b/Swiften/Base/UnitTest/LogTest.cpp new file mode 100644 index 0000000..5d710db --- /dev/null +++ b/Swiften/Base/UnitTest/LogTest.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2019 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ + +#include <vector> + +#include <boost/algorithm/string/predicate.hpp> + +#include <gtest/gtest.h> + +#include <Swiften/Base/Log.h> + +using namespace Swift; + +struct LogEntry { + LogEntry(Log::Severity severity, std::string file, int line, std::string function, std::string message) : severity(severity), file(std::move(file)), line(line), function(std::move(function)), message(std::move(message)) {} + + Log::Severity severity; + std::string file; + int line; + std::string function; + std::string message; +}; + +// Helper class to set the logging callback. Using this class to set it will ensure the +// logCallback is reset to empty (its default state) after each test. +class LogCallbackSetter { +public: + LogCallbackSetter(Log::Callback callback) { + Log::setLogCallback(callback); + } + ~LogCallbackSetter() { + Log::setLogCallback({}); + } +}; + +TEST(LogTest, testCallback) { + std::vector<LogEntry> logEntries; + LogCallbackSetter callbackSetter = {[&](Log::Severity severity, const std::string& file, int line, const std::string& function, const std::string& message) { + logEntries.emplace_back(severity, file, line, function, message); + }}; + + SWIFT_LOG(error) << "An error"; + ASSERT_EQ(1, logEntries.size()); + ASSERT_EQ(Log::error, logEntries[0].severity); + ASSERT_EQ("An error", logEntries[0].message); +} diff --git a/Swiften/SConscript b/Swiften/SConscript index 5705113..7ea7355 100644 --- a/Swiften/SConscript +++ b/Swiften/SConscript @@ -385,2 +385,3 @@ if env["SCONS_STAGE"] == "build" : File("Base/UnitTest/IDGeneratorTest.cpp"), + File("Base/UnitTest/LogTest.cpp"), File("Base/UnitTest/LRUCacheTest.cpp"), |