Repository: james-project
Updated Branches:
  refs/heads/master 9a5e1e51e -> 2bf850aed


JAMES-2541 Add concurrent testing for mail queue


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

Branch: refs/heads/master
Commit: d131ed06e67fb40b3067fd1d93867649cc283fd0
Parents: 264c29f
Author: Benoit Tellier <[email protected]>
Authored: Tue Sep 11 11:40:54 2018 +0700
Committer: Benoit Tellier <[email protected]>
Committed: Thu Oct 4 15:12:07 2018 +0700

----------------------------------------------------------------------
 .../james/queue/api/MailQueueContract.java      | 38 ++++++++++++++++++--
 1 file changed, 36 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/d131ed06/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 25c05f9..d55a986 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
@@ -31,6 +31,7 @@ import static 
org.assertj.core.api.Assertions.assertThatThrownBy;
 import java.io.Serializable;
 import java.util.Date;
 import java.util.Objects;
+import java.util.concurrent.ConcurrentLinkedDeque;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
@@ -41,6 +42,7 @@ import javax.mail.internet.MimeMessage;
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.james.junit.ExecutorExtension;
+import org.apache.james.util.concurrency.ConcurrentTestRunner;
 import org.apache.mailet.Mail;
 import org.apache.mailet.PerRecipientHeaders;
 import org.apache.mailet.base.test.FakeMail;
@@ -323,7 +325,7 @@ public interface MailQueueContract {
     }
 
     @Test
-    default void deQueueShouldBlockWhenNoMail(ExecutorService executorService) 
throws Exception {
+    default void deQueueShouldBlockWhenNoMail(ExecutorService executorService) 
{
         Future<?> future = executorService.submit(Throwing.runnable(() -> 
getMailQueue().deQueue()));
 
         assertThatThrownBy(() -> future.get(2, TimeUnit.SECONDS))
@@ -343,10 +345,42 @@ public interface MailQueueContract {
         assertThat(tryDequeue.get().getMail().getName()).isEqualTo("name");
     }
 
+    @Test
+    default void concurrentEnqueueDequeueShouldNotFail() throws Exception {
+        MailQueue testee = getMailQueue();
+
+        ConcurrentLinkedDeque<Mail> dequeuedMails = new 
ConcurrentLinkedDeque<>();
+
+        int threadCount = 10;
+        int operationCount = 100;
+        int totalDequeuedMessages = 500;
+        ConcurrentTestRunner.builder()
+            .operation((threadNumber, step) -> {
+                if (step % 2 == 0) {
+                    testee.enQueue(defaultMail()
+                        .name("name" + threadNumber + "-" + step)
+                        .build());
+                } else {
+                    MailQueue.MailQueueItem mailQueueItem = testee.deQueue();
+                    dequeuedMails.add(mailQueueItem.getMail());
+                    mailQueueItem.done(true);
+                }
+            })
+            .threadCount(threadCount)
+            .operationCount(operationCount)
+            .runSuccessfullyWithin(1, TimeUnit.MINUTES);
+
+        assertThat(
+            dequeuedMails.stream()
+                .map(Mail::getName)
+                .distinct())
+            .hasSize(totalDequeuedMessages);
+    }
+
     class SerializableAttribute implements Serializable {
         private final String value;
 
-        public SerializableAttribute(String value) {
+        SerializableAttribute(String value) {
             this.value = value;
         }
 


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

Reply via email to