diff options
| author | Stefan Boberg <[email protected]> | 2025-10-24 10:19:24 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2025-10-24 10:19:24 +0200 |
| commit | 0e21e0d57a5da36f2a4fbbd315254b22cd2fbf00 (patch) | |
| tree | be7c96101bf9c91615f04412c7bafe156a3d6ac8 /thirdparty/spdlog/tests/test_mpmc_q.cpp | |
| parent | changelog (diff) | |
| download | zen-0e21e0d57a5da36f2a4fbbd315254b22cd2fbf00.tar.xz zen-0e21e0d57a5da36f2a4fbbd315254b22cd2fbf00.zip | |
in-tree spdlog (#602)
move spdlog into the tree to remove dependency on vcpkg::spdlog, to allow diverging from the official version and evolve it to fit better with OTLP logging requirements
Diffstat (limited to 'thirdparty/spdlog/tests/test_mpmc_q.cpp')
| -rw-r--r-- | thirdparty/spdlog/tests/test_mpmc_q.cpp | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/thirdparty/spdlog/tests/test_mpmc_q.cpp b/thirdparty/spdlog/tests/test_mpmc_q.cpp new file mode 100644 index 000000000..bc7a37d9c --- /dev/null +++ b/thirdparty/spdlog/tests/test_mpmc_q.cpp @@ -0,0 +1,114 @@ +#include "includes.h" + +using std::chrono::milliseconds; +using test_clock = std::chrono::high_resolution_clock; + +static milliseconds millis_from(const test_clock::time_point &tp0) { + return std::chrono::duration_cast<milliseconds>(test_clock::now() - tp0); +} +TEST_CASE("dequeue-empty-nowait", "[mpmc_blocking_q]") { + size_t q_size = 100; + milliseconds tolerance_wait(20); + spdlog::details::mpmc_blocking_queue<int> q(q_size); + int popped_item = 0; + + auto start = test_clock::now(); + auto rv = q.dequeue_for(popped_item, milliseconds::zero()); + auto delta_ms = millis_from(start); + + REQUIRE(rv == false); + INFO("Delta " << delta_ms.count() << " millis"); + REQUIRE(delta_ms <= tolerance_wait); +} + +TEST_CASE("dequeue-empty-wait", "[mpmc_blocking_q]") { + size_t q_size = 100; + milliseconds wait_ms(250); + milliseconds tolerance_wait(250); + + spdlog::details::mpmc_blocking_queue<int> q(q_size); + int popped_item = 0; + auto start = test_clock::now(); + auto rv = q.dequeue_for(popped_item, wait_ms); + auto delta_ms = millis_from(start); + + REQUIRE(rv == false); + + INFO("Delta " << delta_ms.count() << " millis"); + REQUIRE(delta_ms >= wait_ms - tolerance_wait); + REQUIRE(delta_ms <= wait_ms + tolerance_wait); +} + +TEST_CASE("dequeue-full-nowait", "[mpmc_blocking_q]") { + spdlog::details::mpmc_blocking_queue<int> q(1); + q.enqueue(42); + + int item = 0; + q.dequeue_for(item, milliseconds::zero()); + REQUIRE(item == 42); +} + +TEST_CASE("dequeue-full-wait", "[mpmc_blocking_q]") { + spdlog::details::mpmc_blocking_queue<int> q(1); + q.enqueue(42); + + int item = 0; + q.dequeue(item); + REQUIRE(item == 42); +} + +TEST_CASE("enqueue_nowait", "[mpmc_blocking_q]") { + size_t q_size = 1; + spdlog::details::mpmc_blocking_queue<int> q(q_size); + milliseconds tolerance_wait(10); + + q.enqueue(1); + REQUIRE(q.overrun_counter() == 0); + + auto start = test_clock::now(); + q.enqueue_nowait(2); + auto delta_ms = millis_from(start); + + INFO("Delta " << delta_ms.count() << " millis"); + REQUIRE(delta_ms <= tolerance_wait); + REQUIRE(q.overrun_counter() == 1); +} + +TEST_CASE("bad_queue", "[mpmc_blocking_q]") { + size_t q_size = 0; + spdlog::details::mpmc_blocking_queue<int> q(q_size); + q.enqueue_nowait(1); + REQUIRE(q.overrun_counter() == 1); + int i = 0; + REQUIRE(q.dequeue_for(i, milliseconds(0)) == false); +} + +TEST_CASE("empty_queue", "[mpmc_blocking_q]") { + size_t q_size = 10; + spdlog::details::mpmc_blocking_queue<int> q(q_size); + int i = 0; + REQUIRE(q.dequeue_for(i, milliseconds(10)) == false); +} + +TEST_CASE("full_queue", "[mpmc_blocking_q]") { + size_t q_size = 100; + spdlog::details::mpmc_blocking_queue<int> q(q_size); + for (int i = 0; i < static_cast<int>(q_size); i++) { + q.enqueue(i + 0); // i+0 to force rvalue and avoid tidy warnings on the same time if we + // std::move(i) instead + } + + q.enqueue_nowait(123456); + REQUIRE(q.overrun_counter() == 1); + + for (int i = 1; i < static_cast<int>(q_size); i++) { + int item = -1; + q.dequeue(item); + REQUIRE(item == i); + } + + // last item pushed has overridden the oldest. + int item = -1; + q.dequeue(item); + REQUIRE(item == 123456); +} |