From 2948e7d121343359b817d2fb0eb383e257ab84c8 Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Mon, 9 Mar 2015 15:42:11 +0200 Subject: [PATCH 1/3] Simplify the logging mechanism Move the implementation of the more specialized methods to the base class and let the platform implement only the most generic method that takes all the possible arguments. These specialized methods will then map to the generic implementation that must be provided by the platforms we support. --- include/mbgl/platform/darwin/log_nslog.hpp | 3 --- include/mbgl/platform/default/log_stderr.hpp | 5 +--- include/mbgl/platform/log.hpp | 8 +++--- platform/android/log_android.cpp | 26 -------------------- platform/darwin/log_nslog.mm | 26 -------------------- platform/default/log_stderr.cpp | 19 -------------- src/mbgl/platform/log.cpp | 20 +++++++++++++++ 7 files changed, 26 insertions(+), 81 deletions(-) diff --git a/include/mbgl/platform/darwin/log_nslog.hpp b/include/mbgl/platform/darwin/log_nslog.hpp index d40f96303..5b2ed0411 100644 --- a/include/mbgl/platform/darwin/log_nslog.hpp +++ b/include/mbgl/platform/darwin/log_nslog.hpp @@ -9,9 +9,6 @@ class NSLogBackend : public LogBackend { public: inline ~NSLogBackend() = default; - void record(EventSeverity severity, Event event, const std::string &msg); - void record(EventSeverity severity, Event event, const char* format, ...); - void record(EventSeverity severity, Event event, int64_t code); void record(EventSeverity severity, Event event, int64_t code, const std::string &msg); }; diff --git a/include/mbgl/platform/default/log_stderr.hpp b/include/mbgl/platform/default/log_stderr.hpp index 45f76f0d1..e07357593 100644 --- a/include/mbgl/platform/default/log_stderr.hpp +++ b/include/mbgl/platform/default/log_stderr.hpp @@ -9,10 +9,7 @@ class StderrLogBackend : public LogBackend { public: inline ~StderrLogBackend() = default; - void record(EventSeverity severity, Event event, const std::string &msg); - void record(EventSeverity severity, Event event, const char* format, ...); - void record(EventSeverity severity, Event event, int64_t code); - void record(EventSeverity severity, Event event, int64_t code, const std::string &msg); + void record(EventSeverity severity, Event event, int64_t code, const std::string &msg) override; }; diff --git a/include/mbgl/platform/log.hpp b/include/mbgl/platform/log.hpp index 8b58921bb..e5431a07c 100644 --- a/include/mbgl/platform/log.hpp +++ b/include/mbgl/platform/log.hpp @@ -13,9 +13,11 @@ namespace mbgl { class LogBackend { public: virtual inline ~LogBackend() = default; - virtual void record(EventSeverity severity, Event event, const std::string &msg) = 0; - virtual void record(EventSeverity severity, Event event, const char* format, ...) = 0; - virtual void record(EventSeverity severity, Event event, int64_t code) = 0; + + void record(EventSeverity severity, Event event, const std::string &msg); + void record(EventSeverity severity, Event event, const char* format, ...); + void record(EventSeverity severity, Event event, int64_t code); + virtual void record(EventSeverity severity, Event event, int64_t code, const std::string &msg) = 0; }; diff --git a/platform/android/log_android.cpp b/platform/android/log_android.cpp index 5e40ce33b..e1bec3e0c 100644 --- a/platform/android/log_android.cpp +++ b/platform/android/log_android.cpp @@ -1,7 +1,5 @@ #include -#include -#include #define __STDC_FORMAT_MACROS // NDK bug workaround: https://code.google.com/p/android/issues/detail?id=72349 #include @@ -28,30 +26,6 @@ int AndroidLogBackend::severityToPriority(EventSeverity severity) { } } -void AndroidLogBackend::record(EventSeverity severity, Event event, const std::string &msg) { - __android_log_print(severityToPriority(severity), EventClass(event).c_str(), "%s", msg.c_str()); -} - -void AndroidLogBackend::record(EventSeverity severity, Event event, const char* format, ...) { - va_list args; - va_start(args, format); - - const int len = vsnprintf(nullptr, 0, format, args) + 1; - char* buf = new char[len]; - vsnprintf(buf, len, format, args); - - va_end(args); - - __android_log_print(severityToPriority(severity), EventClass(event).c_str(), "%s", buf); - - delete buf; - buf = nullptr; -} - -void AndroidLogBackend::record(EventSeverity severity, Event event, int64_t code) { - __android_log_print(severityToPriority(severity), EventClass(event).c_str(), "(%" PRId64 ")", code); -} - void AndroidLogBackend::record(EventSeverity severity, Event event, int64_t code, const std::string &msg) { __android_log_print(severityToPriority(severity), EventClass(event).c_str(), "(%" PRId64 ") %s", code, msg.c_str()); } diff --git a/platform/darwin/log_nslog.mm b/platform/darwin/log_nslog.mm index a82d78a01..edcf41ebb 100644 --- a/platform/darwin/log_nslog.mm +++ b/platform/darwin/log_nslog.mm @@ -2,34 +2,8 @@ #import -#include - namespace mbgl { -void NSLogBackend::record(EventSeverity severity, Event event, const std::string &msg) { - NSString *message = - [[NSString alloc] initWithBytes:msg.data() length:msg.size() encoding:NSUTF8StringEncoding]; - NSLog(@"[%s] %s: %@", EventSeverityClass(severity).c_str(), EventClass(event).c_str(), message); -} - -void NSLogBackend::record(EventSeverity severity, Event event, const char *format, ...) { - va_list args; - va_start(args, format); - const size_t len = vsnprintf(NULL, 0, format, args); - va_end(args); - std::unique_ptr buffer(new char[len + 1]); - va_start(args, format); - vsnprintf(buffer.get(), len + 1, format, args); - va_end(args); - NSLog(@"[%s] %s: %s", EventSeverityClass(severity).c_str(), EventClass(event).c_str(), - buffer.get()); -} - -void NSLogBackend::record(EventSeverity severity, Event event, int64_t code) { - NSLog(@"[%s] %s: (%lld)", EventSeverityClass(severity).c_str(), EventClass(event).c_str(), - code); -} - void NSLogBackend::record(EventSeverity severity, Event event, int64_t code, const std::string &msg) { NSString *message = diff --git a/platform/default/log_stderr.cpp b/platform/default/log_stderr.cpp index 62938b6d6..891bfd57f 100644 --- a/platform/default/log_stderr.cpp +++ b/platform/default/log_stderr.cpp @@ -1,30 +1,11 @@ #include #include -#include namespace mbgl { -void StderrLogBackend::record(EventSeverity severity, Event event, const std::string &msg) { - std::cerr << "[" << severity << "] " << event << ": " << msg << std::endl; -} - -void StderrLogBackend::record(EventSeverity severity, Event event, const char* format, ...) { - std::cerr << "[" << severity << "] " << event << ": "; - va_list args; - va_start(args, format); - vfprintf(stderr, format, args); - va_end(args); - std::cerr << std::endl; -} - -void StderrLogBackend::record(EventSeverity severity, Event event, int64_t code) { - std::cerr << "[" << severity << "] " << event << ": (" << code << ")" << std::endl; -} - void StderrLogBackend::record(EventSeverity severity, Event event, int64_t code, const std::string &msg) { std::cerr << "[" << severity << "] " << event << ": (" << code << ") " << msg << std::endl; - } } diff --git a/src/mbgl/platform/log.cpp b/src/mbgl/platform/log.cpp index b83c7a932..71463dc2f 100644 --- a/src/mbgl/platform/log.cpp +++ b/src/mbgl/platform/log.cpp @@ -1,7 +1,27 @@ #include +#include + namespace mbgl { std::unique_ptr Log::Backend; +void LogBackend::record(EventSeverity severity, Event event, const std::string &msg) { + record(severity, event, -1, msg); +} + +void LogBackend::record(EventSeverity severity, Event event, const char* format, ...) { + va_list args; + va_start(args, format); + char msg[4096]; + vsnprintf(msg, sizeof(msg), format, args); + va_end(args); + + record(severity, event, -1, msg); +} + +void LogBackend::record(EventSeverity severity, Event event, int64_t code) { + record(severity, event, code, std::string()); +} + } From 51bc265db341f1d98b4fd46be80241771f854eb5 Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Mon, 9 Mar 2015 16:15:18 +0200 Subject: [PATCH 2/3] Make the logging system static No initialization is needed anymore and we can use the logging functions safely at any point of the code (threading is not handled though, so you might get multiplexed messages if you log from two threads simultaneously). --- android/cpp/jni.cpp | 3 -- bin/render.cpp | 14 +-------- include/mbgl/platform/android/log_android.hpp | 24 -------------- include/mbgl/platform/darwin/log_nslog.hpp | 18 ----------- include/mbgl/platform/default/log_stderr.hpp | 18 ----------- include/mbgl/platform/log.hpp | 31 ++++++------------- linux/main.cpp | 4 +-- macosx/main.mm | 4 +-- platform/android/log_android.cpp | 10 ++++-- platform/darwin/log_nslog.mm | 6 ++-- platform/default/log_stderr.cpp | 4 +-- platform/ios/MGLMapView.mm | 6 +--- src/mbgl/platform/log.cpp | 12 ++++--- 13 files changed, 33 insertions(+), 121 deletions(-) delete mode 100644 include/mbgl/platform/android/log_android.hpp delete mode 100644 include/mbgl/platform/darwin/log_nslog.hpp delete mode 100644 include/mbgl/platform/default/log_stderr.hpp diff --git a/android/cpp/jni.cpp b/android/cpp/jni.cpp index 1163c33b5..62e153e9b 100644 --- a/android/cpp/jni.cpp +++ b/android/cpp/jni.cpp @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include @@ -827,8 +826,6 @@ jobject JNICALL nativeLatLngForPixel(JNIEnv *env, jobject obj, jlong nativeMapVi extern "C" { extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { - mbgl::Log::Set(); - mbgl::Log::Debug(mbgl::Event::JNI, "JNI_OnLoad"); JNIEnv *env = nullptr; diff --git a/bin/render.cpp b/bin/render.cpp index 71981b9d9..01f692909 100644 --- a/bin/render.cpp +++ b/bin/render.cpp @@ -5,15 +5,10 @@ #include #include +#include #include #include -#if __APPLE__ -#include -#else -#include -#endif - #pragma GCC diagnostic push #ifndef __clang__ #pragma GCC diagnostic ignored "-Wunused-local-typedefs" @@ -71,13 +66,6 @@ int main(int argc, char *argv[]) { using namespace mbgl; - -#if __APPLE__ - Log::Set(); -#else - Log::Set(); -#endif - mbgl::SQLiteCache cache(cache_file); mbgl::DefaultFileSource fileSource(&cache); diff --git a/include/mbgl/platform/android/log_android.hpp b/include/mbgl/platform/android/log_android.hpp deleted file mode 100644 index 94d90a9b3..000000000 --- a/include/mbgl/platform/android/log_android.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef MBGL_PLATFORM_ANDROID_LOG_ANDROID -#define MBGL_PLATFORM_ANDROID_LOG_ANDROID - -#include - -namespace mbgl { - -class AndroidLogBackend : public LogBackend { -private: - int severityToPriority(EventSeverity severity); - -public: - inline ~AndroidLogBackend() = default; - - void record(EventSeverity severity, Event event, const std::string &msg); - void record(EventSeverity severity, Event event, const char* format, ...); - void record(EventSeverity severity, Event event, int64_t code); - void record(EventSeverity severity, Event event, int64_t code, const std::string &msg); -}; - - -} - -#endif diff --git a/include/mbgl/platform/darwin/log_nslog.hpp b/include/mbgl/platform/darwin/log_nslog.hpp deleted file mode 100644 index 5b2ed0411..000000000 --- a/include/mbgl/platform/darwin/log_nslog.hpp +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef MBGL_COMMON_NSLOG_LOG -#define MBGL_COMMON_NSLOG_LOG - -#include - -namespace mbgl { - -class NSLogBackend : public LogBackend { -public: - inline ~NSLogBackend() = default; - - void record(EventSeverity severity, Event event, int64_t code, const std::string &msg); -}; - - -} - -#endif diff --git a/include/mbgl/platform/default/log_stderr.hpp b/include/mbgl/platform/default/log_stderr.hpp deleted file mode 100644 index e07357593..000000000 --- a/include/mbgl/platform/default/log_stderr.hpp +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef MBGL_COMMON_STDERR_LOG -#define MBGL_COMMON_STDERR_LOG - -#include - -namespace mbgl { - -class StderrLogBackend : public LogBackend { -public: - inline ~StderrLogBackend() = default; - - void record(EventSeverity severity, Event event, int64_t code, const std::string &msg) override; -}; - - -} - -#endif diff --git a/include/mbgl/platform/log.hpp b/include/mbgl/platform/log.hpp index e5431a07c..e6b8f17b6 100644 --- a/include/mbgl/platform/log.hpp +++ b/include/mbgl/platform/log.hpp @@ -10,17 +10,6 @@ namespace mbgl { -class LogBackend { -public: - virtual inline ~LogBackend() = default; - - void record(EventSeverity severity, Event event, const std::string &msg); - void record(EventSeverity severity, Event event, const char* format, ...); - void record(EventSeverity severity, Event event, int64_t code); - - virtual void record(EventSeverity severity, Event event, int64_t code, const std::string &msg) = 0; -}; - class Log { private: template @@ -54,20 +43,20 @@ public: if (!includes(severity, disabledEventSeverities) && !includes(event, disabledEvents) && !includes({ severity, event }, disabledEventPermutations)) { - if (Backend) { - Backend->record(severity, event, ::std::forward(args)...); - } + record(severity, event, ::std::forward(args)...); } } - template - static inline const T &Set(Args&& ...args) { - Backend = util::make_unique(::std::forward(args)...); - return *reinterpret_cast(Backend.get()); - } - private: - static std::unique_ptr Backend; + static void record(EventSeverity severity, Event event, const std::string &msg); + static void record(EventSeverity severity, Event event, const char* format, ...); + static void record(EventSeverity severity, Event event, int64_t code); + static void record(EventSeverity severity, Event event, int64_t code, const std::string &msg); + + // This method is the data sink that must be implemented by each platform we + // support. It should ideally output the error message in a human readable + // format to the developer. + static void platformRecord(EventSeverity severity, Event event, int64_t code, const std::string &msg); }; } diff --git a/linux/main.cpp b/linux/main.cpp index 6688905ea..6a2be43d7 100644 --- a/linux/main.cpp +++ b/linux/main.cpp @@ -1,9 +1,9 @@ #include #include +#include #include #include #include -#include #include #include @@ -26,8 +26,6 @@ void quit_handler(int) { } int main(int argc, char *argv[]) { - mbgl::Log::Set(); - int fullscreen_flag = 0; std::string style; diff --git a/macosx/main.mm b/macosx/main.mm index f59fbda6a..087544f7c 100644 --- a/macosx/main.mm +++ b/macosx/main.mm @@ -1,6 +1,6 @@ +#include #include #include -#include #include #include #include @@ -101,8 +101,6 @@ const std::string &defaultCacheDatabase() { } int main() { - mbgl::Log::Set(); - GLFWView view; mbgl::SQLiteCache cache(defaultCacheDatabase()); diff --git a/platform/android/log_android.cpp b/platform/android/log_android.cpp index e1bec3e0c..9de8232ba 100644 --- a/platform/android/log_android.cpp +++ b/platform/android/log_android.cpp @@ -1,4 +1,4 @@ -#include +#include #define __STDC_FORMAT_MACROS // NDK bug workaround: https://code.google.com/p/android/issues/detail?id=72349 #include @@ -7,7 +7,9 @@ namespace mbgl { -int AndroidLogBackend::severityToPriority(EventSeverity severity) { +namespace { + +int severityToPriority(EventSeverity severity) { switch(severity) { case EventSeverity::Debug: return ANDROID_LOG_DEBUG; @@ -26,7 +28,9 @@ int AndroidLogBackend::severityToPriority(EventSeverity severity) { } } -void AndroidLogBackend::record(EventSeverity severity, Event event, int64_t code, const std::string &msg) { +} // namespace + +void Log::platformRecord(EventSeverity severity, Event event, int64_t code, const std::string &msg) { __android_log_print(severityToPriority(severity), EventClass(event).c_str(), "(%" PRId64 ") %s", code, msg.c_str()); } diff --git a/platform/darwin/log_nslog.mm b/platform/darwin/log_nslog.mm index edcf41ebb..5d53ed812 100644 --- a/platform/darwin/log_nslog.mm +++ b/platform/darwin/log_nslog.mm @@ -1,11 +1,11 @@ -#include +#include #import namespace mbgl { -void NSLogBackend::record(EventSeverity severity, Event event, int64_t code, - const std::string &msg) { +void Log::platformRecord(EventSeverity severity, Event event, int64_t code, + const std::string &msg) { NSString *message = [[NSString alloc] initWithBytes:msg.data() length:msg.size() encoding:NSUTF8StringEncoding]; NSLog(@"[%s] %s: (%lld) %@", EventSeverityClass(severity).c_str(), EventClass(event).c_str(), diff --git a/platform/default/log_stderr.cpp b/platform/default/log_stderr.cpp index 891bfd57f..3305176d9 100644 --- a/platform/default/log_stderr.cpp +++ b/platform/default/log_stderr.cpp @@ -1,10 +1,10 @@ -#include +#include #include namespace mbgl { -void StderrLogBackend::record(EventSeverity severity, Event event, int64_t code, const std::string &msg) { +void Log::platformRecord(EventSeverity severity, Event event, int64_t code, const std::string &msg) { std::cerr << "[" << severity << "] " << event << ": (" << code << ") " << msg << std::endl; } diff --git a/platform/ios/MGLMapView.mm b/platform/ios/MGLMapView.mm index 1ab1afcbb..f60d3a05f 100644 --- a/platform/ios/MGLMapView.mm +++ b/platform/ios/MGLMapView.mm @@ -1,6 +1,6 @@ #import "MGLMapView.h" -#import +#import #import #import @@ -181,10 +181,6 @@ mbgl::DefaultFileSource *mbglFileSource = nullptr; - (BOOL)commonInit { - // set logging backend - // - mbgl::Log::Set(); - // create context // _context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; diff --git a/src/mbgl/platform/log.cpp b/src/mbgl/platform/log.cpp index 71463dc2f..4bbff8da5 100644 --- a/src/mbgl/platform/log.cpp +++ b/src/mbgl/platform/log.cpp @@ -4,13 +4,11 @@ namespace mbgl { -std::unique_ptr Log::Backend; - -void LogBackend::record(EventSeverity severity, Event event, const std::string &msg) { +void Log::record(EventSeverity severity, Event event, const std::string &msg) { record(severity, event, -1, msg); } -void LogBackend::record(EventSeverity severity, Event event, const char* format, ...) { +void Log::record(EventSeverity severity, Event event, const char* format, ...) { va_list args; va_start(args, format); char msg[4096]; @@ -20,8 +18,12 @@ void LogBackend::record(EventSeverity severity, Event event, const char* format, record(severity, event, -1, msg); } -void LogBackend::record(EventSeverity severity, Event event, int64_t code) { +void Log::record(EventSeverity severity, Event event, int64_t code) { record(severity, event, code, std::string()); } +void Log::record(EventSeverity severity, Event event, int64_t code, const std::string &msg) { + platformRecord(severity, event, code, msg); +} + } From 79f3149d9d973a31bcc5cf3ba1dbe77d90884ace Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Tue, 10 Mar 2015 16:13:53 +0200 Subject: [PATCH 3/3] Update the FixtureLog Now the FixtureLog is an Log::Observer instead of a backend. The observer can sniff and filter log messages, that can be used for fail a test if it emits a warning for example. --- include/mbgl/platform/log.hpp | 12 ++++ src/mbgl/platform/log.cpp | 14 ++++ test/fixtures/fixture_log.cpp | 96 -------------------------- test/fixtures/fixture_log.hpp | 52 -------------- test/fixtures/fixture_log_observer.cpp | 68 ++++++++++++++++++ test/fixtures/fixture_log_observer.hpp | 47 +++++++++++++ test/headless/headless.cpp | 4 +- test/miscellaneous/style_parser.cpp | 12 ++-- test/test.gyp | 4 +- 9 files changed, 152 insertions(+), 157 deletions(-) delete mode 100644 test/fixtures/fixture_log.cpp delete mode 100644 test/fixtures/fixture_log.hpp create mode 100644 test/fixtures/fixture_log_observer.cpp create mode 100644 test/fixtures/fixture_log_observer.hpp diff --git a/include/mbgl/platform/log.hpp b/include/mbgl/platform/log.hpp index e6b8f17b6..de7f13171 100644 --- a/include/mbgl/platform/log.hpp +++ b/include/mbgl/platform/log.hpp @@ -11,6 +11,18 @@ namespace mbgl { class Log { +public: + class Observer { + public: + virtual ~Observer() = default; + + // When an observer is set, this function will be called for every log + // message. Returning true will consume the message. + virtual bool onRecord(EventSeverity severity, Event event, int64_t code, const std::string &msg) = 0; + }; + + static void setObserver(std::unique_ptr Observer); + private: template constexpr static bool includes(const T e, const T (&l)[N], const size_t i = 0) { diff --git a/src/mbgl/platform/log.cpp b/src/mbgl/platform/log.cpp index 4bbff8da5..e9712f727 100644 --- a/src/mbgl/platform/log.cpp +++ b/src/mbgl/platform/log.cpp @@ -4,6 +4,16 @@ namespace mbgl { +namespace { + +static std::unique_ptr currentObserver; + +} + +void Log::setObserver(std::unique_ptr observer) { + currentObserver = std::move(observer); +} + void Log::record(EventSeverity severity, Event event, const std::string &msg) { record(severity, event, -1, msg); } @@ -23,6 +33,10 @@ void Log::record(EventSeverity severity, Event event, int64_t code) { } void Log::record(EventSeverity severity, Event event, int64_t code, const std::string &msg) { + if (currentObserver && currentObserver->onRecord(severity, event, code, msg)) { + return; + } + platformRecord(severity, event, code, msg); } diff --git a/test/fixtures/fixture_log.cpp b/test/fixtures/fixture_log.cpp deleted file mode 100644 index 02715fd43..000000000 --- a/test/fixtures/fixture_log.cpp +++ /dev/null @@ -1,96 +0,0 @@ -#include "fixture_log.hpp" - -namespace mbgl { - -FixtureLogBackend::LogMessage::LogMessage(EventSeverity severity_, Event event_, int64_t code_, - const std::string &msg_) - : severity(severity_), event(event_), code(code_), msg(msg_) { -} -FixtureLogBackend::LogMessage::LogMessage(EventSeverity severity_, Event event_, int64_t code_) - : severity(severity_), event(event_), code(code_), msg() { -} -FixtureLogBackend::LogMessage::LogMessage(EventSeverity severity_, Event event_, - const std::string &msg_) - : severity(severity_), event(event_), code(), msg(msg_) { -} - -FixtureLogBackend::LogMessage::LogMessage(EventSeverity severity_, Event event_) - : severity(severity_), event(event_), code(), msg() { -} - -bool FixtureLogBackend::LogMessage::operator==(const LogMessage &rhs) const { - return (!severity || !rhs.severity || severity.get() == rhs.severity.get()) && - (!event || !rhs.event || event.get() == rhs.event.get()) && - (!code || !rhs.code || code.get() == rhs.code.get()) && - (!msg || !rhs.msg || msg.get() == rhs.msg.get()); -} - -FixtureLogBackend::~FixtureLogBackend() { - std::cerr << unchecked(); -} - -void FixtureLogBackend::record(EventSeverity severity, Event event, const std::string &msg) { - messages.emplace_back(severity, event, msg); -} - -void FixtureLogBackend::record(EventSeverity severity, Event event, const char *format, ...) { - va_list args; - va_start(args, format); - const size_t len = vsnprintf(NULL, 0, format, args); - va_end(args); - std::unique_ptr buffer(new char[len + 1]); - va_start(args, format); - vsnprintf(buffer.get(), len + 1, format, args); - va_end(args); - messages.emplace_back(severity, event, std::string{ buffer.get(), len }); -} - -void FixtureLogBackend::record(EventSeverity severity, Event event, int64_t code) { - messages.emplace_back(severity, event, code); -} - -void FixtureLogBackend::record(EventSeverity severity, Event event, int64_t code, - const std::string &msg) { - messages.emplace_back(severity, event, code, msg); -} - -size_t FixtureLogBackend::count(const LogMessage &message) const { - size_t message_count = 0; - for (const LogMessage &msg : messages) { - if (msg == message) { - message_count++; - msg.checked = true; - } - } - return message_count; -} - -std::vector FixtureLogBackend::unchecked() const { - std::vector unchecked_messages; - for (const LogMessage &msg : messages) { - if (!msg.checked) { - unchecked_messages.push_back(msg); - msg.checked = true; - } - } - return unchecked_messages; -} - -::std::ostream &operator<<(::std::ostream &os, - const std::vector &messages) { - for (const FixtureLogBackend::LogMessage &message : messages) { - os << "- " << message; - } - return os; -} - -::std::ostream &operator<<(::std::ostream &os, const FixtureLogBackend::LogMessage &message) { - os << "[\"" << message.severity.get() << "\", \"" << message.event.get() << "\""; - if (message.code) - os << ", " << message.code.get(); - if (message.msg) - os << ", \"" << message.msg.get() << "\""; - return os << "]" << std::endl; -} - -} \ No newline at end of file diff --git a/test/fixtures/fixture_log.hpp b/test/fixtures/fixture_log.hpp deleted file mode 100644 index bc7c9fab3..000000000 --- a/test/fixtures/fixture_log.hpp +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef MBGL_TEST_FIXTURE_LOG -#define MBGL_TEST_FIXTURE_LOG - -#include -#include -#include - -#include -#include -#include - -namespace mbgl { - -class FixtureLogBackend : public LogBackend, private util::noncopyable { -public: - struct LogMessage { - LogMessage(EventSeverity severity_, Event event_, int64_t code_, const std::string &msg_); - LogMessage(EventSeverity severity_, Event event_, int64_t code_); - LogMessage(EventSeverity severity_, Event event_, const std::string &msg_); - LogMessage(EventSeverity severity_, Event event_); - - bool operator==(const LogMessage &rhs) const; - - const mapbox::util::optional severity; - const mapbox::util::optional event; - const mapbox::util::optional code; - const mapbox::util::optional msg; - - mutable bool checked = false; - }; - - ~FixtureLogBackend(); - - inline void record(EventSeverity severity, Event event, const std::string &msg); - inline void record(EventSeverity severity, Event event, const char *format, ...); - inline void record(EventSeverity severity, Event event, int64_t code); - inline void record(EventSeverity severity, Event event, int64_t code, const std::string &msg); - - size_t count(const LogMessage &message) const; - std::vector unchecked() const; - -public: - std::vector messages; -}; - -::std::ostream &operator<<(::std::ostream &os, - const std::vector &messages); -::std::ostream &operator<<(::std::ostream &os, const FixtureLogBackend::LogMessage &message); - -} - -#endif diff --git a/test/fixtures/fixture_log_observer.cpp b/test/fixtures/fixture_log_observer.cpp new file mode 100644 index 000000000..08a641564 --- /dev/null +++ b/test/fixtures/fixture_log_observer.cpp @@ -0,0 +1,68 @@ +#include "fixture_log_observer.hpp" +#include "../fixtures/util.hpp" + +namespace mbgl { + +FixtureLogObserver::LogMessage::LogMessage(EventSeverity severity_, Event event_, int64_t code_, + const std::string &msg_) + : severity(severity_), event(event_), code(code_), msg(msg_) { +} + +bool FixtureLogObserver::LogMessage::operator==(const LogMessage &rhs) const { + return (!severity || !rhs.severity || severity.get() == rhs.severity.get()) && + (!event || !rhs.event || event.get() == rhs.event.get()) && + (!code || !rhs.code || code.get() == rhs.code.get()) && + (!msg || !rhs.msg || msg.get() == rhs.msg.get()); +} + +FixtureLogObserver::~FixtureLogObserver() { + std::cerr << unchecked(); +} + +bool FixtureLogObserver::onRecord(EventSeverity severity, Event event, int64_t code, + const std::string &msg) { + messages.emplace_back(severity, event, code, msg); + + return true; +} + +size_t FixtureLogObserver::count(const LogMessage &message) const { + size_t message_count = 0; + for (const LogMessage &msg : messages) { + if (msg == message) { + message_count++; + msg.checked = true; + } + } + return message_count; +} + +std::vector FixtureLogObserver::unchecked() const { + std::vector unchecked_messages; + for (const LogMessage &msg : messages) { + if (!msg.checked) { + unchecked_messages.push_back(msg); + msg.checked = true; + } + } + return unchecked_messages; +} + +::std::ostream &operator<<(::std::ostream &os, + const std::vector &messages) { + for (const FixtureLogObserver::LogMessage &message : messages) { + os << "- " << message; + } + return os; +} + +::std::ostream &operator<<(::std::ostream &os, const FixtureLogObserver::LogMessage &message) { + os << "[\"" << message.severity.get() << "\", \"" << message.event.get() << "\""; + if (message.code) + os << ", " << message.code.get(); + if (message.msg) + os << ", \"" << message.msg.get() << "\""; + return os << "]" << std::endl; +} + +} diff --git a/test/fixtures/fixture_log_observer.hpp b/test/fixtures/fixture_log_observer.hpp new file mode 100644 index 000000000..bdb7ea2ca --- /dev/null +++ b/test/fixtures/fixture_log_observer.hpp @@ -0,0 +1,47 @@ +#ifndef MBGL_TEST_FIXTURE_LOG_OBSERVER +#define MBGL_TEST_FIXTURE_LOG_OBSERVER + +#include +#include +#include + +#include +#include +#include + +namespace mbgl { + +class FixtureLogObserver : public Log::Observer, private util::noncopyable { +public: + struct LogMessage { + LogMessage(EventSeverity severity_, Event event_, int64_t code_, const std::string &msg_); + + bool operator==(const LogMessage &rhs) const; + + const mapbox::util::optional severity; + const mapbox::util::optional event; + const mapbox::util::optional code; + const mapbox::util::optional msg; + + mutable bool checked = false; + }; + + ~FixtureLogObserver(); + + // Log::Observer implementation + virtual bool onRecord(EventSeverity severity, Event event, int64_t code, const std::string &msg) override; + + size_t count(const LogMessage &message) const; + std::vector unchecked() const; + +public: + std::vector messages; +}; + +::std::ostream &operator<<(::std::ostream &os, + const std::vector &messages); +::std::ostream &operator<<(::std::ostream &os, const FixtureLogObserver::LogMessage &message); + +} + +#endif diff --git a/test/headless/headless.cpp b/test/headless/headless.cpp index bf04cbcb4..c47b9349a 100644 --- a/test/headless/headless.cpp +++ b/test/headless/headless.cpp @@ -1,5 +1,5 @@ #include "../fixtures/util.hpp" -#include "../fixtures/fixture_log.hpp" +#include "../fixtures/fixture_log_observer.hpp" #include #include @@ -101,7 +101,7 @@ TEST_P(HeadlessTest, render) { ASSERT_FALSE(infoDoc.HasParseError()); ASSERT_TRUE(infoDoc.IsObject()); - Log::Set(); + Log::setObserver(util::make_unique()); Log::Info(Event::General, "test fixture %s", base.c_str()); diff --git a/test/miscellaneous/style_parser.cpp b/test/miscellaneous/style_parser.cpp index 2cb305620..f5b9bb7e6 100644 --- a/test/miscellaneous/style_parser.cpp +++ b/test/miscellaneous/style_parser.cpp @@ -5,7 +5,7 @@ #include -#include "../fixtures/fixture_log.hpp" +#include "../fixtures/fixture_log_observer.hpp" #include #include @@ -36,7 +36,8 @@ TEST_P(StyleParserTest, ParseStyle) { std::stringstream stylejson; stylejson << stylefile.rdbuf(); - const FixtureLogBackend &log = Log::Set(); + FixtureLogObserver* observer = new FixtureLogObserver(); + Log::setObserver(std::unique_ptr(observer)); Style style; style.loadJSON((const uint8_t *)stylejson.str().c_str()); @@ -54,17 +55,18 @@ TEST_P(StyleParserTest, ParseStyle) { ASSERT_EQ(true, js_entry.IsArray()); const uint32_t count = js_entry[rapidjson::SizeType(0)].GetUint(); - const FixtureLogBackend::LogMessage message { + const FixtureLogObserver::LogMessage message { EventSeverityClass(js_entry[rapidjson::SizeType(1)].GetString()), EventClass(js_entry[rapidjson::SizeType(2)].GetString()), + int64_t(-1), js_entry[rapidjson::SizeType(3)].GetString() }; - EXPECT_EQ(count, log.count(message)) << "Message: " << message << std::endl; + EXPECT_EQ(count, observer->count(message)) << "Message: " << message << std::endl; } } - const auto &unchecked = log.unchecked(); + const auto &unchecked = observer->unchecked(); if (unchecked.size()) { std::cerr << "Unchecked Log Messages (" << base << "/" << name << "): " << std::endl << unchecked; } diff --git a/test/test.gyp b/test/test.gyp index bee2f4c4e..9e542aec2 100644 --- a/test/test.gyp +++ b/test/test.gyp @@ -32,8 +32,8 @@ 'fixtures/main.cpp', 'fixtures/util.hpp', 'fixtures/util.cpp', - 'fixtures/fixture_log.hpp', - 'fixtures/fixture_log.cpp', + 'fixtures/fixture_log_observer.hpp', + 'fixtures/fixture_log_observer.cpp', 'headless/headless.cpp',