aboutsummaryrefslogtreecommitdiff
path: root/thirdparty/spdlog/tests/test_mpmc_q.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2025-10-24 10:19:24 +0200
committerGitHub Enterprise <[email protected]>2025-10-24 10:19:24 +0200
commit0e21e0d57a5da36f2a4fbbd315254b22cd2fbf00 (patch)
treebe7c96101bf9c91615f04412c7bafe156a3d6ac8 /thirdparty/spdlog/tests/test_mpmc_q.cpp
parentchangelog (diff)
downloadzen-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.cpp114
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);
+}