diff options
author | Thiago Marcos P. Santos <tmpsantos@gmail.com> | 2015-03-12 14:18:25 +0200 |
---|---|---|
committer | Thiago Marcos P. Santos <tmpsantos@gmail.com> | 2015-03-12 14:18:25 +0200 |
commit | 2b6afe6a549284a862d0231653d2183d57a5b496 (patch) | |
tree | 715182b2fc50edd793b6a945950b68c7b135ec8d | |
parent | 4e8036311d434db9bb1bd41b65bd39e2891e17d0 (diff) | |
parent | 79f3149d9d973a31bcc5cf3ba1dbe77d90884ace (diff) | |
download | qtlocation-mapboxgl-2b6afe6a549284a862d0231653d2183d57a5b496.tar.gz |
Merge pull request #972 from mapbox/log_cleanup
Refactoring of the log system
-rw-r--r-- | android/cpp/jni.cpp | 3 | ||||
-rw-r--r-- | bin/render.cpp | 14 | ||||
-rw-r--r-- | include/mbgl/platform/android/log_android.hpp | 24 | ||||
-rw-r--r-- | include/mbgl/platform/darwin/log_nslog.hpp | 21 | ||||
-rw-r--r-- | include/mbgl/platform/default/log_stderr.hpp | 21 | ||||
-rw-r--r-- | include/mbgl/platform/log.hpp | 39 | ||||
-rw-r--r-- | linux/main.cpp | 4 | ||||
-rw-r--r-- | macosx/main.mm | 4 | ||||
-rw-r--r-- | platform/android/log_android.cpp | 34 | ||||
-rw-r--r-- | platform/darwin/log_nslog.mm | 32 | ||||
-rw-r--r-- | platform/default/log_stderr.cpp | 23 | ||||
-rw-r--r-- | platform/ios/MGLMapView.mm | 6 | ||||
-rw-r--r-- | src/mbgl/platform/log.cpp | 38 | ||||
-rw-r--r-- | test/fixtures/fixture_log.cpp | 96 | ||||
-rw-r--r-- | test/fixtures/fixture_log.hpp | 52 | ||||
-rw-r--r-- | test/fixtures/fixture_log_observer.cpp | 68 | ||||
-rw-r--r-- | test/fixtures/fixture_log_observer.hpp | 47 | ||||
-rw-r--r-- | test/headless/headless.cpp | 4 | ||||
-rw-r--r-- | test/miscellaneous/style_parser.cpp | 12 | ||||
-rw-r--r-- | test/test.gyp | 4 |
20 files changed, 199 insertions, 347 deletions
diff --git a/android/cpp/jni.cpp b/android/cpp/jni.cpp index 8a67c0e876..9cde5d385d 100644 --- a/android/cpp/jni.cpp +++ b/android/cpp/jni.cpp @@ -15,7 +15,6 @@ #include <mbgl/android/jni.hpp> #include <mbgl/android/native_map_view.hpp> #include <mbgl/map/map.hpp> -#include <mbgl/platform/android/log_android.hpp> #include <mbgl/platform/event.hpp> #include <mbgl/platform/log.hpp> #include <mbgl/storage/network_status.hpp> @@ -806,8 +805,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::AndroidLogBackend>(); - mbgl::Log::Debug(mbgl::Event::JNI, "JNI_OnLoad"); JNIEnv *env = nullptr; diff --git a/bin/render.cpp b/bin/render.cpp index 71981b9d96..01f6929092 100644 --- a/bin/render.cpp +++ b/bin/render.cpp @@ -5,15 +5,10 @@ #include <mbgl/platform/default/headless_view.hpp> #include <mbgl/platform/default/headless_display.hpp> +#include <mbgl/platform/log.hpp> #include <mbgl/storage/default_file_source.hpp> #include <mbgl/storage/default/sqlite_cache.hpp> -#if __APPLE__ -#include <mbgl/platform/darwin/log_nslog.hpp> -#else -#include <mbgl/platform/default/log_stderr.hpp> -#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<NSLogBackend>(); -#else - Log::Set<StderrLogBackend>(); -#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 94d90a9b36..0000000000 --- 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 <mbgl/platform/log.hpp> - -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 d40f963036..0000000000 --- a/include/mbgl/platform/darwin/log_nslog.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef MBGL_COMMON_NSLOG_LOG -#define MBGL_COMMON_NSLOG_LOG - -#include <mbgl/platform/log.hpp> - -namespace mbgl { - -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); -}; - - -} - -#endif diff --git a/include/mbgl/platform/default/log_stderr.hpp b/include/mbgl/platform/default/log_stderr.hpp deleted file mode 100644 index 45f76f0d1a..0000000000 --- a/include/mbgl/platform/default/log_stderr.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef MBGL_COMMON_STDERR_LOG -#define MBGL_COMMON_STDERR_LOG - -#include <mbgl/platform/log.hpp> - -namespace mbgl { - -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); -}; - - -} - -#endif diff --git a/include/mbgl/platform/log.hpp b/include/mbgl/platform/log.hpp index 8b58921bbe..de7f131714 100644 --- a/include/mbgl/platform/log.hpp +++ b/include/mbgl/platform/log.hpp @@ -10,16 +10,19 @@ namespace mbgl { -class LogBackend { +class Log { 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; - virtual void record(EventSeverity severity, Event event, int64_t code, const std::string &msg) = 0; -}; + 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> Observer); -class Log { private: template <typename T, size_t N> constexpr static bool includes(const T e, const T (&l)[N], const size_t i = 0) { @@ -52,20 +55,20 @@ public: if (!includes(severity, disabledEventSeverities) && !includes(event, disabledEvents) && !includes({ severity, event }, disabledEventPermutations)) { - if (Backend) { - Backend->record(severity, event, ::std::forward<Args>(args)...); - } + record(severity, event, ::std::forward<Args>(args)...); } } - template<typename T, typename ...Args> - static inline const T &Set(Args&& ...args) { - Backend = util::make_unique<T>(::std::forward<Args>(args)...); - return *reinterpret_cast<T *>(Backend.get()); - } - private: - static std::unique_ptr<LogBackend> 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 6688905ea9..6a2be43d7c 100644 --- a/linux/main.cpp +++ b/linux/main.cpp @@ -1,9 +1,9 @@ #include <mbgl/mbgl.hpp> #include <mbgl/util/uv.hpp> +#include <mbgl/platform/log.hpp> #include <mbgl/platform/platform.hpp> #include <mbgl/platform/default/settings_json.hpp> #include <mbgl/platform/default/glfw_view.hpp> -#include <mbgl/platform/default/log_stderr.hpp> #include <mbgl/storage/default_file_source.hpp> #include <mbgl/storage/default/sqlite_cache.hpp> @@ -26,8 +26,6 @@ void quit_handler(int) { } int main(int argc, char *argv[]) { - mbgl::Log::Set<mbgl::StderrLogBackend>(); - int fullscreen_flag = 0; std::string style; diff --git a/macosx/main.mm b/macosx/main.mm index f59fbda6a8..087544f7c4 100644 --- a/macosx/main.mm +++ b/macosx/main.mm @@ -1,6 +1,6 @@ +#include <mbgl/platform/log.hpp> #include <mbgl/platform/platform.hpp> #include <mbgl/platform/darwin/settings_nsuserdefaults.hpp> -#include <mbgl/platform/darwin/log_nslog.hpp> #include <mbgl/platform/darwin/Reachability.h> #include <mbgl/platform/default/glfw_view.hpp> #include <mbgl/storage/default_file_source.hpp> @@ -101,8 +101,6 @@ const std::string &defaultCacheDatabase() { } int main() { - mbgl::Log::Set<mbgl::NSLogBackend>(); - GLFWView view; mbgl::SQLiteCache cache(defaultCacheDatabase()); diff --git a/platform/android/log_android.cpp b/platform/android/log_android.cpp index 5e40ce33bd..9de8232bac 100644 --- a/platform/android/log_android.cpp +++ b/platform/android/log_android.cpp @@ -1,7 +1,5 @@ -#include <mbgl/platform/android/log_android.hpp> +#include <mbgl/platform/log.hpp> -#include <iostream> -#include <cstdarg> #define __STDC_FORMAT_MACROS // NDK bug workaround: https://code.google.com/p/android/issues/detail?id=72349 #include <cinttypes> @@ -9,7 +7,9 @@ namespace mbgl { -int AndroidLogBackend::severityToPriority(EventSeverity severity) { +namespace { + +int severityToPriority(EventSeverity severity) { switch(severity) { case EventSeverity::Debug: return ANDROID_LOG_DEBUG; @@ -28,31 +28,9 @@ 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); -} +} // namespace -void AndroidLogBackend::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) { __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 a82d78a01f..5d53ed812f 100644 --- a/platform/darwin/log_nslog.mm +++ b/platform/darwin/log_nslog.mm @@ -1,37 +1,11 @@ -#include <mbgl/platform/darwin/log_nslog.hpp> +#include <mbgl/platform/log.hpp> #import <Foundation/Foundation.h> -#include <cstdarg> - 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<char[]> 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) { +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 62938b6d63..3305176d96 100644 --- a/platform/default/log_stderr.cpp +++ b/platform/default/log_stderr.cpp @@ -1,30 +1,11 @@ -#include <mbgl/platform/default/log_stderr.hpp> +#include <mbgl/platform/log.hpp> #include <iostream> -#include <cstdarg> 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) { +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 3629430263..57760717d9 100644 --- a/platform/ios/MGLMapView.mm +++ b/platform/ios/MGLMapView.mm @@ -1,6 +1,6 @@ #import "MGLMapView.h" -#import <mbgl/platform/darwin/log_nslog.hpp> +#import <mbgl/platform/log.hpp> #import <mbgl/platform/gl.hpp> #import <GLKit/GLKit.h> @@ -181,10 +181,6 @@ mbgl::DefaultFileSource *mbglFileSource = nullptr; - (BOOL)commonInit { - // set logging backend - // - mbgl::Log::Set<mbgl::NSLogBackend>(); - // create context // _context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; diff --git a/src/mbgl/platform/log.cpp b/src/mbgl/platform/log.cpp index b83c7a9322..e9712f727c 100644 --- a/src/mbgl/platform/log.cpp +++ b/src/mbgl/platform/log.cpp @@ -1,7 +1,43 @@ #include <mbgl/platform/log.hpp> +#include <cstdarg> + namespace mbgl { -std::unique_ptr<LogBackend> Log::Backend; +namespace { + +static std::unique_ptr<Log::Observer> currentObserver; + +} + +void Log::setObserver(std::unique_ptr<Observer> observer) { + currentObserver = std::move(observer); +} + +void Log::record(EventSeverity severity, Event event, const std::string &msg) { + record(severity, event, -1, msg); +} + +void Log::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 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) { + 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 02715fd43d..0000000000 --- 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<char[]> 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::LogMessage> FixtureLogBackend::unchecked() const { - std::vector<LogMessage> 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<FixtureLogBackend::LogMessage> &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 bc7c9fab31..0000000000 --- a/test/fixtures/fixture_log.hpp +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef MBGL_TEST_FIXTURE_LOG -#define MBGL_TEST_FIXTURE_LOG - -#include <mbgl/platform/log.hpp> -#include <mbgl/util/noncopyable.hpp> -#include <mbgl/util/optional.hpp> - -#include <vector> -#include <cstdarg> -#include <iostream> - -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<EventSeverity> severity; - const mapbox::util::optional<Event> event; - const mapbox::util::optional<int64_t> code; - const mapbox::util::optional<std::string> 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<LogMessage> unchecked() const; - -public: - std::vector<LogMessage> messages; -}; - -::std::ostream &operator<<(::std::ostream &os, - const std::vector<FixtureLogBackend::LogMessage> &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 0000000000..08a6415643 --- /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::LogMessage> FixtureLogObserver::unchecked() const { + std::vector<LogMessage> 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<FixtureLogObserver::LogMessage> &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 0000000000..bdb7ea2ca3 --- /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 <mbgl/platform/log.hpp> +#include <mbgl/util/noncopyable.hpp> +#include <mbgl/util/optional.hpp> + +#include <vector> +#include <cstdarg> +#include <iostream> + +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<EventSeverity> severity; + const mapbox::util::optional<Event> event; + const mapbox::util::optional<int64_t> code; + const mapbox::util::optional<std::string> 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<LogMessage> unchecked() const; + +public: + std::vector<LogMessage> messages; +}; + +::std::ostream &operator<<(::std::ostream &os, + const std::vector<FixtureLogObserver::LogMessage> &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 bf04cbcb4b..c47b9349a8 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 <mbgl/map/map.hpp> #include <mbgl/util/image.hpp> @@ -101,7 +101,7 @@ TEST_P(HeadlessTest, render) { ASSERT_FALSE(infoDoc.HasParseError()); ASSERT_TRUE(infoDoc.IsObject()); - Log::Set<FixtureLogBackend>(); + Log::setObserver(util::make_unique<FixtureLogObserver>()); 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 2cb3056204..f5b9bb7e63 100644 --- a/test/miscellaneous/style_parser.cpp +++ b/test/miscellaneous/style_parser.cpp @@ -5,7 +5,7 @@ #include <rapidjson/document.h> -#include "../fixtures/fixture_log.hpp" +#include "../fixtures/fixture_log_observer.hpp" #include <iostream> #include <fstream> @@ -36,7 +36,8 @@ TEST_P(StyleParserTest, ParseStyle) { std::stringstream stylejson; stylejson << stylefile.rdbuf(); - const FixtureLogBackend &log = Log::Set<FixtureLogBackend>(); + FixtureLogObserver* observer = new FixtureLogObserver(); + Log::setObserver(std::unique_ptr<Log::Observer>(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 bee2f4c4ef..9e542aec2f 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', |