+#include "common.h"
+#include <cds/misc/RigtorpMPMCQueue.h>
+#include <cds_test/stress_test.h>
+#include <ctime>
+#include <iostream>
+
+using namespace std;
+
+namespace {
+
+class rigtorpMPMCQueueTest : public cds_test::stress_fixture {
+protected:
+ static size_t s_nRigtorpMPMCQueuePassCount;
+ static size_t s_nRigtorpMPMCQueueEnqueueStride;
+ static size_t s_nRigtorpMPMCQueueCapacity;
+
+ static void SetUpTestCase() {
+ cds_test::config const &cfg = get_config("SequentialMisc");
+ GetConfigExpected(RigtorpMPMCQueuePassCount, 10000);
+ GetConfigExpected(RigtorpMPMCQueueEnqueueStride, 1024);
+ GetConfigExpected(RigtorpMPMCQueueCapacity, 2048);
+ if (s_nRigtorpMPMCQueueCapacity <= s_nRigtorpMPMCQueueEnqueueStride) {
+ s_nRigtorpMPMCQueueCapacity = 2 * s_nRigtorpMPMCQueueEnqueueStride;
+ }
+ }
+
+ void test() {
+ std::unique_ptr<rigtorp::MPMCQueue<size_t>> q(
+ new rigtorp::MPMCQueue<size_t>(s_nRigtorpMPMCQueueCapacity));
+ size_t nNo = 0;
+ size_t pop_sum = 0;
+
+ while (nNo < s_nRigtorpMPMCQueuePassCount) {
+ size_t curr_push_count = std::min(s_nRigtorpMPMCQueuePassCount - nNo,
+ s_nRigtorpMPMCQueueEnqueueStride);
+ for (size_t i = 0; i < curr_push_count; i++) {
+ q->push(nNo);
+ ++nNo;
+ }
+
+ for (size_t i = 0; i < curr_push_count; i++) {
+ size_t res;
+ q->pop(res);
+ pop_sum += res;
+ }
+ }
+
+ size_t supposed_sum =
+ s_nRigtorpMPMCQueuePassCount * (s_nRigtorpMPMCQueuePassCount - 1) / 2;
+ EXPECT_EQ(pop_sum, supposed_sum);
+ }
+};
+
+size_t rigtorpMPMCQueueTest::s_nRigtorpMPMCQueuePassCount;
+size_t rigtorpMPMCQueueTest::s_nRigtorpMPMCQueueEnqueueStride;
+size_t rigtorpMPMCQueueTest::s_nRigtorpMPMCQueueCapacity;
+
+TEST_F(rigtorpMPMCQueueTest, PushPop) {
+ test();
+}
+
+} // namespace