Adds parallel test organization (actual test cases are still sequential)
[libcds.git] / test / stress / parallel / parallel-misc / rigtorp_mpmc_driver.cpp
diff --git a/test/stress/parallel/parallel-misc/rigtorp_mpmc_driver.cpp b/test/stress/parallel/parallel-misc/rigtorp_mpmc_driver.cpp
new file mode 100644 (file)
index 0000000..0066f90
--- /dev/null
@@ -0,0 +1,62 @@
+#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