JAMES-2544 Add tests for concurrent ack/nack in MailQueueContract

Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/50822df4
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/50822df4
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/50822df4

Branch: refs/heads/master
Commit: 50822df49ee37d4b2c9b5f547054158abb10b942
Parents: d5a7cbf
Author: Benoit Tellier <[email protected]>
Authored: Thu Sep 27 18:16:49 2018 +0700
Committer: Benoit Tellier <[email protected]>
Committed: Thu Oct 4 15:12:08 2018 +0700

----------------------------------------------------------------------
 .../activemq/ActiveMQMailQueueBlobTest.java     |  7 ++++
 .../queue/activemq/ActiveMQMailQueueTest.java   |  7 ++++
 .../james/queue/api/MailQueueContract.java      | 37 ++++++++++++++++++++
 .../james/queue/file/FileMailQueueTest.java     |  7 ++++
 .../james/queue/jms/JMSMailQueueTest.java       | 14 ++++++++
 5 files changed, 72 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/50822df4/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java
----------------------------------------------------------------------
diff --git 
a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java
 
b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java
index 0c18d71..078db43 100644
--- 
a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java
+++ 
b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java
@@ -124,6 +124,13 @@ public class ActiveMQMailQueueBlobTest implements 
DelayedManageableMailQueueCont
     }
 
     @Test
+    @Override
+    @Disabled("JAMES-2544 Mixing concurrent ack/nack might lead to a deadlock")
+    public void concurrentEnqueueDequeueWithAckNackShouldNotFail() {
+
+    }
+
+    @Test
     void computeNextDeliveryTimestampShouldReturnLongMaxWhenOverflow() {
         long deliveryTimestamp = 
mailQueue.computeNextDeliveryTimestamp(Long.MAX_VALUE, TimeUnit.DAYS);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/50822df4/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java
----------------------------------------------------------------------
diff --git 
a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java
 
b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java
index 650eca2..d502177 100644
--- 
a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java
+++ 
b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java
@@ -126,4 +126,11 @@ public class ActiveMQMailQueueTest implements 
DelayedManageableMailQueueContract
     public void clearShouldRemoveAllElements() {
 
     }
+
+    @Test
+    @Override
+    @Disabled("JAMES-2544 Mixing concurrent ack/nack might lead to a deadlock")
+    public void concurrentEnqueueDequeueWithAckNackShouldNotFail() {
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/50822df4/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueContract.java
----------------------------------------------------------------------
diff --git 
a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueContract.java
 
b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueContract.java
index a2b6405..8c6418b 100644
--- 
a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueContract.java
+++ 
b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueContract.java
@@ -378,6 +378,43 @@ public interface MailQueueContract {
             .hasSize(totalDequeuedMessages);
     }
 
+    @Test
+    default void concurrentEnqueueDequeueWithAckNackShouldNotFail() throws 
Exception {
+        MailQueue testee = getMailQueue();
+
+        ConcurrentLinkedDeque<Mail> dequeuedMails = new 
ConcurrentLinkedDeque<>();
+
+        int threadCount = 10;
+        int operationCount = 150;
+        int totalDequeuedMessages = 500;
+        ConcurrentTestRunner.builder()
+            .operation((threadNumber, step) -> {
+                if (step % 3 == 0) {
+                    testee.enQueue(defaultMail()
+                        .name("name" + threadNumber + "-" + step)
+                        .build());
+                }
+                if (step % 3 == 1) {
+                    MailQueue.MailQueueItem mailQueueItem = testee.deQueue();
+                    mailQueueItem.done(false);
+                }
+                if (step % 3 == 2) {
+                    MailQueue.MailQueueItem mailQueueItem = testee.deQueue();
+                    dequeuedMails.add(mailQueueItem.getMail());
+                    mailQueueItem.done(true);
+                }
+            })
+            .threadCount(threadCount)
+            .operationCount(operationCount)
+            .runSuccessfullyWithin(Duration.ofMinutes(1));
+
+        assertThat(
+            dequeuedMails.stream()
+                .map(Mail::getName)
+                .distinct())
+            .hasSize(totalDequeuedMessages);
+    }
+
     class SerializableAttribute implements Serializable {
         private final String value;
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/50822df4/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileMailQueueTest.java
----------------------------------------------------------------------
diff --git 
a/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileMailQueueTest.java
 
b/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileMailQueueTest.java
index 4ad3753..217c85f 100644
--- 
a/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileMailQueueTest.java
+++ 
b/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileMailQueueTest.java
@@ -104,4 +104,11 @@ public class FileMailQueueTest implements 
DelayedManageableMailQueueContract {
     public void browseShouldReturnMailsWithMimeMessage() {
 
     }
+
+    @Test
+    @Override
+    @Disabled("JAMES-2544 Mixing concurent operation might lead to a deadlock 
and missing fiels")
+    public void concurrentEnqueueDequeueWithAckNackShouldNotFail() {
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/50822df4/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueTest.java
----------------------------------------------------------------------
diff --git 
a/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueTest.java
 
b/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueTest.java
index f483085..a39de8a 100644
--- 
a/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueTest.java
+++ 
b/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueTest.java
@@ -99,4 +99,18 @@ public class JMSMailQueueTest implements 
DelayedManageableMailQueueContract, Pri
     public void clearShouldRemoveAllElements() {
 
     }
+
+    @Test
+    @Override
+    @Disabled("JAMES-2544 Mixing concurrent operations might lead to a missing 
file and errors upon dequeue")
+    public void concurrentEnqueueDequeueShouldNotFail() {
+
+    }
+
+    @Test
+    @Override
+    @Disabled("JAMES-2544 Mixing concurrent operations might lead to a missing 
file and errors upon dequeue")
+    public void concurrentEnqueueDequeueWithAckNackShouldNotFail() {
+
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to