diff options
Diffstat (limited to 'thirdparty/spdlog/tests/test_sink.h')
| -rw-r--r-- | thirdparty/spdlog/tests/test_sink.h | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/thirdparty/spdlog/tests/test_sink.h b/thirdparty/spdlog/tests/test_sink.h new file mode 100644 index 000000000..9c0945232 --- /dev/null +++ b/thirdparty/spdlog/tests/test_sink.h @@ -0,0 +1,70 @@ +// +// Copyright(c) 2018 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include "spdlog/details/null_mutex.h" +#include "spdlog/sinks/base_sink.h" +#include "spdlog/fmt/fmt.h" +#include <chrono> +#include <mutex> +#include <thread> + +namespace spdlog { +namespace sinks { + +template <class Mutex> +class test_sink : public base_sink<Mutex> { + const size_t lines_to_save = 100; + +public: + size_t msg_counter() { + std::lock_guard<Mutex> lock(base_sink<Mutex>::mutex_); + return msg_counter_; + } + + size_t flush_counter() { + std::lock_guard<Mutex> lock(base_sink<Mutex>::mutex_); + return flush_counter_; + } + + void set_delay(std::chrono::milliseconds delay) { + std::lock_guard<Mutex> lock(base_sink<Mutex>::mutex_); + delay_ = delay; + } + + // return last output without the eol + std::vector<std::string> lines() { + std::lock_guard<Mutex> lock(base_sink<Mutex>::mutex_); + return lines_; + } + +protected: + void sink_it_(const details::log_msg &msg) override { + memory_buf_t formatted; + base_sink<Mutex>::formatter_->format(msg, formatted); + // save the line without the eol + auto eol_len = strlen(details::os::default_eol); + using diff_t = typename std::iterator_traits<decltype(formatted.end())>::difference_type; + if (lines_.size() < lines_to_save) { + lines_.emplace_back(formatted.begin(), formatted.end() - static_cast<diff_t>(eol_len)); + } + msg_counter_++; + std::this_thread::sleep_for(delay_); + } + + void flush_() override { flush_counter_++; } + + size_t msg_counter_{0}; + size_t flush_counter_{0}; + std::chrono::milliseconds delay_{std::chrono::milliseconds::zero()}; + std::vector<std::string> lines_; +}; + +using test_sink_mt = test_sink<std::mutex>; +using test_sink_st = test_sink<details::null_mutex>; + +} // namespace sinks +} // namespace spdlog |