diff options
author | Thiago Marcos P. Santos <thiago@mapbox.com> | 2015-03-10 16:13:53 +0200 |
---|---|---|
committer | Thiago Marcos P. Santos <thiago@mapbox.com> | 2015-03-12 13:28:41 +0200 |
commit | 79f3149d9d973a31bcc5cf3ba1dbe77d90884ace (patch) | |
tree | a23ea65597fb0848f65850d1d65d2b31ba9275a3 | |
parent | 51bc265db341f1d98b4fd46be80241771f854eb5 (diff) | |
download | qtlocation-mapboxgl-79f3149d9d973a31bcc5cf3ba1dbe77d90884ace.tar.gz |
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.
-rw-r--r-- | include/mbgl/platform/log.hpp | 12 | ||||
-rw-r--r-- | src/mbgl/platform/log.cpp | 14 | ||||
-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 |
9 files changed, 152 insertions, 157 deletions
diff --git a/include/mbgl/platform/log.hpp b/include/mbgl/platform/log.hpp index e6b8f17b65..de7f131714 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> Observer); + private: template <typename T, size_t N> 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 4bbff8da5d..e9712f727c 100644 --- a/src/mbgl/platform/log.cpp +++ b/src/mbgl/platform/log.cpp @@ -4,6 +4,16 @@ namespace mbgl { +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); } @@ -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 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', |