--- /dev/null
+#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