Adds parallel test organization (actual test cases are still sequential)
[libcds.git] / test / stress / parallel / parallel-misc / deque_driver.cpp
diff --git a/test/stress/parallel/parallel-misc/deque_driver.cpp b/test/stress/parallel/parallel-misc/deque_driver.cpp
new file mode 100644 (file)
index 0000000..a17484e
--- /dev/null
@@ -0,0 +1,73 @@
+#include "common.h"
+#include <cds/misc/chase-lev-deque.h>
+#include <cds_test/stress_test.h>
+#include <cstdlib>
+#include <ctime>
+#include <iostream>
+#include <memory>
+#include <thread>
+
+using namespace std;
+
+namespace {
+
+typedef cds_others::ChaseLevDeque Deque;
+static size_t s_nDequePassCount = 1000;
+static size_t s_nDequeStealerThreadCount = 5;
+static size_t s_nDequeMainPassCount = 100000000;
+
+class ChaseLevDequeTest : public cds_test::stress_fixture {
+protected:
+  static atomic_int terminate_stealer;
+  static ullong *sums;
+  static ullong *succ_counts;
+  static ullong push_sum;
+  static ullong push_count;
+
+  static void SetUpTestCase() {
+    cds_test::config const &cfg = get_config("SequentialMisc");
+    GetConfig(DequePassCount);
+    GetConfig(DequeStealerThreadCount);
+    GetConfig(DequeMainPassCount);
+  }
+};
+
+atomic_int ChaseLevDequeTest::terminate_stealer;
+ullong *ChaseLevDequeTest::sums;
+ullong *ChaseLevDequeTest::succ_counts;
+ullong ChaseLevDequeTest::push_count;
+ullong ChaseLevDequeTest::push_sum;
+
+TEST_F(ChaseLevDequeTest, ChaseLevDeque_push_take) {
+  std::unique_ptr<Deque> deque(new Deque());
+  size_t sum = 0;
+  int res;
+  for (size_t i = 0; i < s_nDequePassCount; ++i) {
+    deque->push(i);
+    res = deque->take();
+    sum += res;
+  }
+  size_t supposed_sum = s_nDequePassCount * (s_nDequePassCount - 1) / 2;
+  if (sum != supposed_sum) {
+    std::cout << "Sequential deque take sum: " << sum << " != " << supposed_sum
+              << "\n";
+  }
+}
+
+TEST_F(ChaseLevDequeTest, ChaseLevDeque_push_steal) {
+  std::unique_ptr<Deque> deque(new Deque());
+  size_t sum = 0;
+  int res;
+  for (size_t i = 0; i < s_nDequePassCount; ++i) {
+    deque->push(i);
+    res = deque->steal();
+    sum += res;
+  }
+  size_t supposed_sum = s_nDequePassCount * (s_nDequePassCount - 1) / 2;
+  if (sum != supposed_sum) {
+    std::cout << "Sequential deque steal sum: " << sum << " != " << supposed_sum
+              << "\n";
+  }
+}
+
+} // namespace