This is an automated email from the ASF dual-hosted git repository.

aboda pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git


The following commit(s) were added to refs/heads/master by this push:
     new 17414c9  MINIFICPP-1202 - Fix unstable failing test for 
MinifiConcurrentQueue
17414c9 is described below

commit 17414c9983754db484641eea39c64142945307ea
Author: Adam Hunyadi <hunyadi....@gmail.com>
AuthorDate: Thu May 14 13:52:31 2020 +0200

    MINIFICPP-1202 - Fix unstable failing test for MinifiConcurrentQueue
    
    It is a test ensuring that the consumers that put back failing elements to 
their queue can eventually get to read new elements (so the queue is FIFO). The 
test was interrupting the consumer by stopping the queue. However there was no 
guarantee that the
    consumer already finished reading the data out by this time.
    
    Signed-off-by: Arpad Boda <ab...@apache.org>
    
    This closes #785
---
 libminifi/test/unit/MinifiConcurrentQueueTests.cpp | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/libminifi/test/unit/MinifiConcurrentQueueTests.cpp 
b/libminifi/test/unit/MinifiConcurrentQueueTests.cpp
index 6855de2..8aa98d5 100644
--- a/libminifi/test/unit/MinifiConcurrentQueueTests.cpp
+++ b/libminifi/test/unit/MinifiConcurrentQueueTests.cpp
@@ -120,12 +120,13 @@ namespace MinifiConcurrentQueueTestProducersConsumers {
     });
   }
 
-  std::thread 
getReaddingDequeueConsumerThread(utils::ConditionConcurrentQueue<std::string>& 
queue, std::vector<std::string>& results) {
-    return std::thread([&queue, &results] {
+  std::thread 
getReaddingDequeueConsumerThread(utils::ConditionConcurrentQueue<std::string>& 
queue, std::vector<std::string>& results, std::atomic_int& results_size) {
+    return std::thread([&queue, &results, &results_size] {
       std::string s;
       while (queue.dequeueWait(s)) {
         if (!std::count(results.begin(), results.end(), s)) {
           results.push_back(s);
+          results_size = results.size();
         }
         // The consumer is busy enqueing so noone is waiting for this ;(
         queue.enqueue(std::move(s));
@@ -279,12 +280,16 @@ 
TEST_CASE("TestConditionConcurrentQueue::testProducerConsumer", "[TestConditionC
 
   /* The same test as above, but covering the ConditionConcurrentQueue */
   SECTION("with readd") {
-    std::thread consumer { getReaddingDequeueConsumerThread(queue, results) };
+    std::atomic_int results_size;
+    std::thread consumer { getReaddingDequeueConsumerThread(queue, results, 
results_size) };
     std::this_thread::sleep_for(std::chrono::milliseconds(1));
     std::thread producer { getSimpleProducerThread(queue) };
-    std::this_thread::sleep_for(std::chrono::milliseconds(10));
-    producer.join();
+    std::this_thread::sleep_for(std::chrono::milliseconds(9));
+    while (results_size < 3) {
+      std::this_thread::sleep_for(std::chrono::milliseconds(1));
+    }
     queue.stop();
+    producer.join();
     consumer.join();
 
     REQUIRE(utils::StringUtils::join("-", results) == "ba-dum-tss");

Reply via email to