Fixed several bugs in WeakRungBuffer
[libcds.git] / test / unit / queue / vyukov_mpmc_queue.cpp
index 421e36f0a29fd054f510a5beca7528ce6912cc32..fb145024e537aeab46596fb2e535b03c6395da2c 100644 (file)
@@ -36,7 +36,43 @@ namespace {
     namespace cc = cds::container;
 
     class VyukovMPMCCycleQueue: public cds_test::bounded_queue
-    {};
+    {
+    public:
+        template <typename Queue>
+        void test_single_consumer( Queue& q )
+        {
+            typedef typename Queue::value_type value_type;
+
+            const size_t nSize = q.capacity();
+
+            ASSERT_TRUE( q.empty() );
+            ASSERT_CONTAINER_SIZE( q, 0 );
+
+            // enqueue/dequeue
+            for ( unsigned pass = 0; pass < 3; ++pass ) {
+                for ( size_t i = 0; i < nSize; ++i ) {
+                    ASSERT_TRUE( q.enqueue( static_cast<value_type>( i ) ) );
+                    ASSERT_CONTAINER_SIZE( q, i + 1 );
+                }
+                ASSERT_FALSE( q.empty() );
+                ASSERT_CONTAINER_SIZE( q, nSize );
+                ASSERT_FALSE( q.enqueue( static_cast<value_type>( nSize ) * 2 ) );
+
+                for ( size_t i = 0; i < nSize; ++i ) {
+                    value_type* fr = q.front();
+                    ASSERT_TRUE( fr != nullptr );
+                    ASSERT_EQ( *fr, static_cast<value_type>( i ) );
+                    ASSERT_TRUE( q.pop_front() );
+                    ASSERT_CONTAINER_SIZE( q, nSize - i - 1 );
+                }
+                ASSERT_TRUE( q.empty() );
+                ASSERT_CONTAINER_SIZE( q, 0 );
+
+                ASSERT_TRUE( q.front() == nullptr );
+                ASSERT_FALSE( q.pop_front() );
+            }
+        }
+    };
 
     TEST_F( VyukovMPMCCycleQueue, defaulted )
     {
@@ -130,5 +166,18 @@ namespace {
         test_string( q );
     }
 
+    TEST_F( VyukovMPMCCycleQueue, single_consumer )
+    {
+        struct traits: public cds::container::vyukov_queue::traits
+        {
+            enum: bool { single_consumer = true };
+        };
+        typedef cds::container::VyukovMPMCCycleQueue< int, traits > test_queue;
+
+        test_queue q( 128 );
+        test( q );
+        test_single_consumer( q );
+    }
+
 } // namespace