From 0d5d8140ecc90dd95a5f885bca4ed710d00263e7 Mon Sep 17 00:00:00 2001 From: Gabi Melman Date: Sun, 6 Jul 2025 00:23:27 +0300 Subject: [PATCH] Expand ringbuffer sink tests --- include/spdlog/sinks/ringbuffer_sink.h | 6 +++- tests/CMakeLists.txt | 3 +- tests/test_ringbuffer.cpp | 50 ++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 tests/test_ringbuffer.cpp diff --git a/include/spdlog/sinks/ringbuffer_sink.h b/include/spdlog/sinks/ringbuffer_sink.h index 6156c6a5..bcdf0ffc 100644 --- a/include/spdlog/sinks/ringbuffer_sink.h +++ b/include/spdlog/sinks/ringbuffer_sink.h @@ -21,7 +21,11 @@ template class ringbuffer_sink final : public base_sink { public: explicit ringbuffer_sink(size_t n_items) - : q_{n_items} {} + : q_{n_items} { + if (n_items == 0) { + throw_spdlog_ex("ringbuffer_sink: n_items cannot be zero"); + } + } std::vector last_raw(size_t lim = 0) { std::lock_guard lock(base_sink::mutex_); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f6b17272..457504c3 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -49,7 +49,8 @@ set(SPDLOG_UTESTS_SOURCES test_time_point.cpp test_stopwatch.cpp test_circular_q.cpp - test_bin_to_hex.cpp) + test_bin_to_hex.cpp + test_ringbuffer.cpp) if(NOT SPDLOG_NO_EXCEPTIONS) list(APPEND SPDLOG_UTESTS_SOURCES test_errors.cpp) diff --git a/tests/test_ringbuffer.cpp b/tests/test_ringbuffer.cpp new file mode 100644 index 00000000..79e48de0 --- /dev/null +++ b/tests/test_ringbuffer.cpp @@ -0,0 +1,50 @@ +#include "includes.h" +#include "spdlog/sinks/ringbuffer_sink.h" + +TEST_CASE("ringbuffer invalid size", "[ringbuffer]") { + REQUIRE_THROWS_AS(spdlog::sinks::ringbuffer_sink_mt(0), spdlog::spdlog_ex); +} + +TEST_CASE("ringbuffer stores formatted messages", "[ringbuffer]") { + spdlog::sinks::ringbuffer_sink_st sink(3); + sink.set_pattern("%v"); + + sink.log(spdlog::details::log_msg{"test", spdlog::level::info, "msg1"}); + sink.log(spdlog::details::log_msg{"test", spdlog::level::info, "msg2"}); + sink.log(spdlog::details::log_msg{"test", spdlog::level::info, "msg3"}); + + auto formatted = sink.last_formatted(); + REQUIRE(formatted.size() == 3); + REQUIRE(formatted[0] == "msg1"); + REQUIRE(formatted[1] == "msg2"); + REQUIRE(formatted[2] == "msg3"); +} + +TEST_CASE("ringbuffer overrun keeps last items", "[ringbuffer]") { + spdlog::sinks::ringbuffer_sink_st sink(2); + sink.set_pattern("%v"); + + sink.log(spdlog::details::log_msg{"test", spdlog::level::info, "first"}); + sink.log(spdlog::details::log_msg{"test", spdlog::level::info, "second"}); + sink.log(spdlog::details::log_msg{"test", spdlog::level::info, "third"}); + + auto formatted = sink.last_formatted(); + REQUIRE(formatted.size() == 2); + REQUIRE(formatted[0] == "second"); + REQUIRE(formatted[1] == "third"); +} + +TEST_CASE("ringbuffer retrieval limit", "[ringbuffer]") { + spdlog::sinks::ringbuffer_sink_st sink(3); + sink.set_pattern("%v"); + + sink.log(spdlog::details::log_msg{"test", spdlog::level::info, "A"}); + sink.log(spdlog::details::log_msg{"test", spdlog::level::info, "B"}); + sink.log(spdlog::details::log_msg{"test", spdlog::level::info, "C"}); + + auto formatted = sink.last_formatted(2); + REQUIRE(formatted.size() == 2); + REQUIRE(formatted[0] == "B"); + REQUIRE(formatted[1] == "C"); +} +