You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2018/01/16 02:16:34 UTC

[08/11] james-project git commit: JAMES-2285 Provide a MailQueueContract run on top of JMS

JAMES-2285 Provide a MailQueueContract run on top of JMS


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

Branch: refs/heads/master
Commit: 9c13b922f6060f6652a5cd4019bf6d72df9d4bf9
Parents: 04f3c5b
Author: benwa <bt...@linagora.com>
Authored: Thu Jan 11 17:03:32 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Jan 16 09:04:28 2018 +0700

----------------------------------------------------------------------
 .../james/core/builder/MimeMessageBuilder.java  |  20 --
 .../apache/mailet/base/MailAddressFixture.java  |   5 +
 .../mailet/base/test/MimeMessageUtil.java       |  51 ++++
 .../transport/mailets/ICALToHeadersTest.java    |  17 +-
 .../mailets/ICALToJsonAttributeTest.java        |   3 +-
 .../transport/mailets/ContactExtractorTest.java |   9 +-
 .../mailets/UseHeaderRecipientsTest.java        |   5 +-
 .../james/transport/matchers/HasHeaderTest.java |   6 +-
 .../mailets/ICSAttachmentWorkflowTest.java      |   5 +-
 .../impl/JamesMailetContextTest.java            |  13 +-
 .../james/transport/mailets/BounceTest.java     |   4 +-
 .../mailets/delivery/MailDispatcherTest.java    |  19 +-
 .../mailets/delivery/SieveIntegrationTest.java  |   3 +-
 .../integration/SetMessagesMethodTest.java      |   3 +-
 .../TextCalendarBodyToAttachmentTest.java       |  14 +-
 server/queue/queue-api/pom.xml                  |  11 +-
 .../james/queue/api/MailQueueContract.java      | 289 +++++++++++++++++++
 .../java/org/apache/james/queue/api/Mails.java  |  51 ++++
 server/queue/queue-jms/pom.xml                  |  22 ++
 .../james/queue/jms/JMSMailQueueTest.java       | 104 +++++++
 20 files changed, 587 insertions(+), 67 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/core/src/main/java/org/apache/james/core/builder/MimeMessageBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/james/core/builder/MimeMessageBuilder.java b/core/src/main/java/org/apache/james/core/builder/MimeMessageBuilder.java
index 4c9cc79..1ca7380 100644
--- a/core/src/main/java/org/apache/james/core/builder/MimeMessageBuilder.java
+++ b/core/src/main/java/org/apache/james/core/builder/MimeMessageBuilder.java
@@ -20,9 +20,7 @@
 package org.apache.james.core.builder;
 
 import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.Collection;
@@ -52,12 +50,6 @@ import com.google.common.collect.ImmutableList;
 
 public class MimeMessageBuilder {
 
-    public static String asString(MimeMessage mimeMessage) throws Exception {
-        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-        mimeMessage.writeTo(byteArrayOutputStream);
-        return new String(byteArrayOutputStream.toByteArray(), StandardCharsets.UTF_8);
-    }
-
     public static class Header {
         private final String name;
         private final String value;
@@ -194,18 +186,6 @@ public class MimeMessageBuilder {
         }
     }
 
-    public static MimeMessage defaultMimeMessage() {
-        return new MimeMessage(Session.getDefaultInstance(new Properties()));
-    }
-
-    public static MimeMessage mimeMessageFromStream(InputStream inputStream) throws MessagingException {
-        return new MimeMessage(Session.getDefaultInstance(new Properties()), inputStream);
-    }
-
-    public static MimeMessage mimeMessageFromBytes(byte[] bytes) throws MessagingException {
-        return mimeMessageFromStream(new ByteArrayInputStream(bytes));
-    }
-
     public static MimeMessageBuilder mimeMessageBuilder() {
         return new MimeMessageBuilder();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/mailet/base/src/test/java/org/apache/mailet/base/MailAddressFixture.java
----------------------------------------------------------------------
diff --git a/mailet/base/src/test/java/org/apache/mailet/base/MailAddressFixture.java b/mailet/base/src/test/java/org/apache/mailet/base/MailAddressFixture.java
index b1a4883..fed98ba 100644
--- a/mailet/base/src/test/java/org/apache/mailet/base/MailAddressFixture.java
+++ b/mailet/base/src/test/java/org/apache/mailet/base/MailAddressFixture.java
@@ -30,6 +30,11 @@ public class MailAddressFixture {
     public static final String JAMES_APACHE_ORG = "james.apache.org";
     public static final String JAMES2_APACHE_ORG = "james2.apache.org";
 
+    public static final MailAddress SENDER = createMailAddress("sender@" + JAMES_LOCAL);
+    public static final MailAddress RECIPIENT1 = createMailAddress("recipient1@" + JAMES_LOCAL);
+    public static final MailAddress RECIPIENT2 = createMailAddress("recipient2@" + JAMES_LOCAL);
+    public static final MailAddress RECIPIENT3 = createMailAddress("recipient3@" + JAMES_LOCAL);
+
     public static final MailAddress ANY_AT_LOCAL = createMailAddress("any@" + JAMES_LOCAL);
     public static final MailAddress OTHER_AT_LOCAL = createMailAddress("other@" + JAMES_LOCAL);
     public static final MailAddress ANY_AT_JAMES = createMailAddress("any@" + JAMES_APACHE_ORG);

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/mailet/base/src/test/java/org/apache/mailet/base/test/MimeMessageUtil.java
----------------------------------------------------------------------
diff --git a/mailet/base/src/test/java/org/apache/mailet/base/test/MimeMessageUtil.java b/mailet/base/src/test/java/org/apache/mailet/base/test/MimeMessageUtil.java
new file mode 100644
index 0000000..e857dea
--- /dev/null
+++ b/mailet/base/src/test/java/org/apache/mailet/base/test/MimeMessageUtil.java
@@ -0,0 +1,51 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.mailet.base.test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Properties;
+
+import javax.mail.MessagingException;
+import javax.mail.Session;
+import javax.mail.internet.MimeMessage;
+
+public class MimeMessageUtil {
+
+    public static String asString(MimeMessage mimeMessage) throws Exception {
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+        mimeMessage.writeTo(byteArrayOutputStream);
+        return new String(byteArrayOutputStream.toByteArray(), StandardCharsets.UTF_8);
+    }
+
+    public static MimeMessage defaultMimeMessage() {
+        return new MimeMessage(Session.getDefaultInstance(new Properties()));
+    }
+
+    public static MimeMessage mimeMessageFromStream(InputStream inputStream) throws MessagingException {
+        return new MimeMessage(Session.getDefaultInstance(new Properties()), inputStream);
+    }
+
+    public static MimeMessage mimeMessageFromBytes(byte[] bytes) throws MessagingException {
+        return mimeMessageFromStream(new ByteArrayInputStream(bytes));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICALToHeadersTest.java
----------------------------------------------------------------------
diff --git a/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICALToHeadersTest.java b/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICALToHeadersTest.java
index fad4f66..f9a928b 100644
--- a/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICALToHeadersTest.java
+++ b/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICALToHeadersTest.java
@@ -23,16 +23,17 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import javax.mail.MessagingException;
 
-import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailetConfig;
+import org.apache.mailet.base.test.MimeMessageUtil;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 
 import com.google.common.collect.ImmutableMap;
+
 import net.fortuna.ical4j.data.CalendarBuilder;
 import net.fortuna.ical4j.model.Calendar;
 
@@ -87,7 +88,7 @@ public class ICALToHeadersTest {
     public void serviceShouldNotModifyMailsWithoutIcalAttribute() throws Exception {
         testee.init(FakeMailetConfig.builder().build());
         Mail mail = FakeMail.builder()
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .build();
 
         testee.service(mail);
@@ -99,7 +100,7 @@ public class ICALToHeadersTest {
     public void serviceShouldNotFailOnMailsWithWrongAttributeType() throws Exception {
         testee.init(FakeMailetConfig.builder().build());
         Mail mail = FakeMail.builder()
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .attribute(ICALToHeader.ATTRIBUTE_DEFAULT_NAME, "This is the wrong type")
             .build();
 
@@ -116,7 +117,7 @@ public class ICALToHeadersTest {
 
         testee.init(FakeMailetConfig.builder().build());
         Mail mail = FakeMail.builder()
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .attribute(ICALToHeader.ATTRIBUTE_DEFAULT_NAME, wrongParametrizedMap)
             .build();
 
@@ -134,7 +135,7 @@ public class ICALToHeadersTest {
 
         testee.init(FakeMailetConfig.builder().build());
         Mail mail = FakeMail.builder()
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .attribute(ICALToHeader.ATTRIBUTE_DEFAULT_NAME, icals)
             .build();
 
@@ -157,7 +158,7 @@ public class ICALToHeadersTest {
 
         testee.init(FakeMailetConfig.builder().build());
         Mail mail = FakeMail.builder()
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .attribute(ICALToHeader.ATTRIBUTE_DEFAULT_NAME, icals)
             .build();
 
@@ -182,7 +183,7 @@ public class ICALToHeadersTest {
 
         testee.init(FakeMailetConfig.builder().build());
         Mail mail = FakeMail.builder()
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .attribute(ICALToHeader.ATTRIBUTE_DEFAULT_NAME, icals)
             .build();
 
@@ -198,7 +199,7 @@ public class ICALToHeadersTest {
 
         testee.init(FakeMailetConfig.builder().build());
         Mail mail = FakeMail.builder()
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .attribute(ICALToHeader.ATTRIBUTE_DEFAULT_NAME, icals)
             .build();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICALToJsonAttributeTest.java
----------------------------------------------------------------------
diff --git a/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICALToJsonAttributeTest.java b/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICALToJsonAttributeTest.java
index 96bf1ab..dd84581 100644
--- a/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICALToJsonAttributeTest.java
+++ b/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICALToJsonAttributeTest.java
@@ -38,6 +38,7 @@ import org.apache.mailet.Mail;
 import org.apache.mailet.base.MailAddressFixture;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailetConfig;
+import org.apache.mailet.base.test.MimeMessageUtil;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -477,7 +478,7 @@ public class ICALToJsonAttributeTest {
         Mail mail = FakeMail.builder()
             .sender(SENDER)
             .recipient(recipient)
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .attribute(ICALToJsonAttribute.DEFAULT_SOURCE_ATTRIBUTE_NAME, icals)
             .attribute(ICALToJsonAttribute.DEFAULT_RAW_SOURCE_ATTRIBUTE_NAME, rawIcals)
             .build();

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/mailet/standard/src/test/java/org/apache/james/transport/mailets/ContactExtractorTest.java
----------------------------------------------------------------------
diff --git a/mailet/standard/src/test/java/org/apache/james/transport/mailets/ContactExtractorTest.java b/mailet/standard/src/test/java/org/apache/james/transport/mailets/ContactExtractorTest.java
index dbf02d8..6ac877b 100644
--- a/mailet/standard/src/test/java/org/apache/james/transport/mailets/ContactExtractorTest.java
+++ b/mailet/standard/src/test/java/org/apache/james/transport/mailets/ContactExtractorTest.java
@@ -34,6 +34,7 @@ import org.apache.mailet.MailetException;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailContext;
 import org.apache.mailet.base.test.FakeMailetConfig;
+import org.apache.mailet.base.test.MimeMessageUtil;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -85,7 +86,7 @@ public class ContactExtractorTest {
 
     @Test
     public void serviceShouldNotThrowWhenJsonProcessingFails() throws Exception {
-        FakeMail mail = FakeMail.builder().mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+        FakeMail mail = FakeMail.builder().mimeMessage(MimeMessageUtil.defaultMimeMessage())
                 .sender(SENDER)
                 .recipient(TO)
                 .build();
@@ -164,7 +165,7 @@ public class ContactExtractorTest {
             + "Subject: extract this recipient please\r\n"
             + "\r\n"
             + "Please!";
-        MimeMessage message = MimeMessageBuilder.mimeMessageFromBytes(rawMessage.getBytes());
+        MimeMessage message = MimeMessageUtil.mimeMessageFromBytes(rawMessage.getBytes());
         FakeMail mail = FakeMail.builder().mimeMessage(message)
             .sender(SENDER)
             .recipient("recipient@example.com")
@@ -184,7 +185,7 @@ public class ContactExtractorTest {
             + "Subject: extract this recipient please\r\n"
             + "\r\n"
             + "Please!";
-        MimeMessage message = MimeMessageBuilder.mimeMessageFromBytes(rawMessage.getBytes());
+        MimeMessage message = MimeMessageUtil.mimeMessageFromBytes(rawMessage.getBytes());
         FakeMail mail = FakeMail.builder().mimeMessage(message)
             .sender(SENDER)
             .recipient("recipient@example.com")
@@ -204,7 +205,7 @@ public class ContactExtractorTest {
             + "Subject: extract this recipient please\r\n"
             + "\r\n"
             + "Please!";
-        MimeMessage message = MimeMessageBuilder.mimeMessageFromBytes(rawMessage.getBytes());
+        MimeMessage message = MimeMessageUtil.mimeMessageFromBytes(rawMessage.getBytes());
         FakeMail mail = FakeMail.builder().mimeMessage(message)
             .sender(SENDER)
             .recipient("recipient@example.com")

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/mailet/standard/src/test/java/org/apache/james/transport/mailets/UseHeaderRecipientsTest.java
----------------------------------------------------------------------
diff --git a/mailet/standard/src/test/java/org/apache/james/transport/mailets/UseHeaderRecipientsTest.java b/mailet/standard/src/test/java/org/apache/james/transport/mailets/UseHeaderRecipientsTest.java
index 2e2cb4a..daed490 100644
--- a/mailet/standard/src/test/java/org/apache/james/transport/mailets/UseHeaderRecipientsTest.java
+++ b/mailet/standard/src/test/java/org/apache/james/transport/mailets/UseHeaderRecipientsTest.java
@@ -28,6 +28,7 @@ import org.apache.mailet.base.MailAddressFixture;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailContext;
 import org.apache.mailet.base.test.FakeMailetConfig;
+import org.apache.mailet.base.test.MimeMessageUtil;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -93,7 +94,7 @@ public class UseHeaderRecipientsTest {
 
         FakeMail fakeMail = FakeMail.builder()
             .recipients(MailAddressFixture.ANY_AT_JAMES)
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .build();
 
         testee.service(fakeMail);
@@ -106,7 +107,7 @@ public class UseHeaderRecipientsTest {
     public void serviceShouldGhostEmail() throws Exception {
         FakeMail fakeMail = FakeMail.builder()
             .recipients(MailAddressFixture.ANY_AT_JAMES)
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .build();
 
         testee.service(fakeMail);

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java
----------------------------------------------------------------------
diff --git a/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java b/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java
index a241675..d46daf8 100644
--- a/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java
+++ b/mailet/standard/src/test/java/org/apache/james/transport/matchers/HasHeaderTest.java
@@ -28,12 +28,12 @@ import javax.mail.MessagingException;
 import javax.mail.Session;
 import javax.mail.internet.MimeMessage;
 
-import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.mailet.Mail;
 import org.apache.mailet.Matcher;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMatcherConfig;
 import org.apache.mailet.base.test.MailUtil;
+import org.apache.mailet.base.test.MimeMessageUtil;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -139,7 +139,7 @@ public class HasHeaderTest {
             .build());
 
         Mail mail = MailUtil.createMockMail2Recipients(
-            MimeMessageBuilder.mimeMessageFromStream(
+                MimeMessageUtil.mimeMessageFromStream(
                 ClassLoader.getSystemResourceAsStream("mime/headerFolded.mime")));
 
         assertThat(matcher.match(mail)).containsAll(mail.getRecipients());
@@ -153,7 +153,7 @@ public class HasHeaderTest {
             .build());
 
         Mail mail = MailUtil.createMockMail2Recipients(
-            MimeMessageBuilder.mimeMessageFromStream(
+                MimeMessageUtil.mimeMessageFromStream(
                 ClassLoader.getSystemResourceAsStream("mime/gmail.mime")));
 
         assertThat(matcher.match(mail)).containsAll(mail.getRecipients());

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
index e023c04..a7d0a5e 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
@@ -49,6 +49,7 @@ import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.IMAPMessageReader;
 import org.apache.james.utils.SMTPMessageSender;
 import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.MimeMessageUtil;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
@@ -524,7 +525,7 @@ public class ICSAttachmentWorkflowTest {
             .setSubject("test")
             .build();
 
-        yahooInvitationMessage = MimeMessageBuilder.mimeMessageFromStream(ClassLoader.getSystemResourceAsStream("eml/yahooInvitation.eml"));
+        yahooInvitationMessage = MimeMessageUtil.mimeMessageFromStream(ClassLoader.getSystemResourceAsStream("eml/yahooInvitation.eml"));
 
         messageWithThreeICSAttached = MimeMessageBuilder.mimeMessageBuilder()
             .setMultipartWithBodyParts(
@@ -778,7 +779,7 @@ public class ICSAttachmentWorkflowTest {
 
     @Test
     public void mailShouldNotContainCalendarContentInTextBodyButAttachment() throws Exception {
-        MimeMessage calendarMessage = MimeMessageBuilder.mimeMessageFromStream(ClassLoader.getSystemResourceAsStream("eml/calendar.eml"));
+        MimeMessage calendarMessage = MimeMessageUtil.mimeMessageFromStream(ClassLoader.getSystemResourceAsStream("eml/calendar.eml"));
 
         messageSender.connect(LOCALHOST_IP, SMTP_PORT)
             .sendMessage(FakeMail.builder()

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java b/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java
index fc88507..a8c4391 100644
--- a/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java
+++ b/server/mailet/mailetcontainer-camel/src/test/java/org/apache/james/mailetcontainer/impl/JamesMailetContextTest.java
@@ -42,6 +42,7 @@ import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.server.core.MailImpl;
 import org.apache.james.user.memory.MemoryUsersRepository;
 import org.apache.mailet.Mail;
+import org.apache.mailet.base.test.MimeMessageUtil;
 import org.assertj.core.api.JUnitSoftAssertions;
 import org.junit.Before;
 import org.junit.Rule;
@@ -171,7 +172,7 @@ public class JamesMailetContextTest {
         MailImpl mail = new MailImpl();
         mail.setSender(mailAddress);
         mail.setRecipients(ImmutableList.of(mailAddress));
-        mail.setMessage(MimeMessageBuilder.defaultMimeMessage());
+        mail.setMessage(MimeMessageUtil.defaultMimeMessage());
         testee.bounce(mail, "message");
     }
 
@@ -180,7 +181,7 @@ public class JamesMailetContextTest {
         MailImpl mail = new MailImpl();
         mail.setSender(mailAddress);
         mail.setRecipients(ImmutableList.of(mailAddress));
-        mail.setMessage(MimeMessageBuilder.defaultMimeMessage());
+        mail.setMessage(MimeMessageUtil.defaultMimeMessage());
         testee.bounce(mail, "message");
 
         ArgumentCaptor<Mail> mailArgumentCaptor = ArgumentCaptor.forClass(Mail.class);
@@ -195,7 +196,7 @@ public class JamesMailetContextTest {
         MailImpl mail = new MailImpl();
         mail.setSender(mailAddress);
         mail.setRecipients(ImmutableList.of(mailAddress));
-        mail.setMessage(MimeMessageBuilder.defaultMimeMessage());
+        mail.setMessage(MimeMessageUtil.defaultMimeMessage());
         testee.sendMail(mail);
 
         ArgumentCaptor<Mail> mailArgumentCaptor = ArgumentCaptor.forClass(Mail.class);
@@ -210,7 +211,7 @@ public class JamesMailetContextTest {
         MailImpl mail = new MailImpl();
         mail.setSender(mailAddress);
         mail.setRecipients(ImmutableList.of(mailAddress));
-        mail.setMessage(MimeMessageBuilder.defaultMimeMessage());
+        mail.setMessage(MimeMessageUtil.defaultMimeMessage());
         String other = "other";
         testee.sendMail(mail, other);
 
@@ -226,7 +227,7 @@ public class JamesMailetContextTest {
         MailImpl mail = new MailImpl();
         mail.setSender(mailAddress);
         mail.setRecipients(ImmutableList.of(mailAddress));
-        mail.setMessage(MimeMessageBuilder.defaultMimeMessage());
+        mail.setMessage(MimeMessageUtil.defaultMimeMessage());
         testee.sendMail(mail, 5, TimeUnit.MINUTES);
 
         ArgumentCaptor<Mail> mailArgumentCaptor = ArgumentCaptor.forClass(Mail.class);
@@ -245,7 +246,7 @@ public class JamesMailetContextTest {
         MailImpl mail = new MailImpl();
         mail.setSender(mailAddress);
         mail.setRecipients(ImmutableList.of(mailAddress));
-        mail.setMessage(MimeMessageBuilder.defaultMimeMessage());
+        mail.setMessage(MimeMessageUtil.defaultMimeMessage());
         String other = "other";
         testee.sendMail(mail, other, 5, TimeUnit.MINUTES);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/BounceTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/BounceTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/BounceTest.java
index 8b42a9b..028b605 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/BounceTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/BounceTest.java
@@ -31,13 +31,13 @@ import javax.mail.Session;
 import javax.mail.internet.MimeMessage;
 
 import org.apache.james.core.MailAddress;
-import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.MailAddressFixture;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailContext;
 import org.apache.mailet.base.test.FakeMailetConfig;
+import org.apache.mailet.base.test.MimeMessageUtil;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -114,7 +114,7 @@ public class BounceTest {
                 .name(MAILET_NAME)
                 .recipient(MailAddressFixture.ANY_AT_JAMES)
                 .build();
-        MimeMessage mimeMessage = MimeMessageBuilder.defaultMimeMessage();
+        MimeMessage mimeMessage = MimeMessageUtil.defaultMimeMessage();
         mimeMessage.setText("My content");
         mail.setMessage(mimeMessage);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java
index 6b5ce76..14cf918 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/MailDispatcherTest.java
@@ -41,6 +41,7 @@ import org.apache.mailet.base.MailAddressFixture;
 import org.apache.mailet.base.RFC2822Headers;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailContext;
+import org.apache.mailet.base.test.MimeMessageUtil;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
@@ -75,7 +76,7 @@ public class MailDispatcherTest {
             .sender(MailAddressFixture.OTHER_AT_JAMES)
             .recipients(MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.ANY_AT_JAMES2)
             .state("state")
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .build();
         testee.dispatch(mail);
 
@@ -95,7 +96,7 @@ public class MailDispatcherTest {
         FakeMail mail = FakeMail.builder()
             .recipients(MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.ANY_AT_JAMES2)
             .state("state")
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .build();
         testee.dispatch(mail);
 
@@ -113,7 +114,7 @@ public class MailDispatcherTest {
         String state = "state";
         FakeMail mail = FakeMail.builder()
             .recipients(MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.ANY_AT_JAMES2)
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .state(state)
             .build();
         testee.dispatch(mail);
@@ -167,7 +168,7 @@ public class MailDispatcherTest {
         FakeMail mail = FakeMail.builder()
             .sender(MailAddressFixture.OTHER_AT_JAMES)
             .recipients(MailAddressFixture.ANY_AT_JAMES)
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .state("state")
             .build();
         testee.dispatch(mail);
@@ -191,7 +192,7 @@ public class MailDispatcherTest {
         FakeMail mail = FakeMail.builder()
             .sender(MailAddressFixture.OTHER_AT_JAMES)
             .recipients(MailAddressFixture.ANY_AT_JAMES)
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .state("state")
             .build();
         mail.addSpecificHeaderForRecipient(TEST_HEADER_USER2, MailAddressFixture.ANY_AT_JAMES2);
@@ -213,7 +214,7 @@ public class MailDispatcherTest {
         FakeMail mail = FakeMail.builder()
             .sender(MailAddressFixture.OTHER_AT_JAMES)
             .recipients(MailAddressFixture.ANY_AT_JAMES)
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .state("state")
             .build();
         mail.addSpecificHeaderForRecipient(TEST_HEADER_USER1, MailAddressFixture.ANY_AT_JAMES);
@@ -235,7 +236,7 @@ public class MailDispatcherTest {
         FakeMail mail = FakeMail.builder()
             .sender(MailAddressFixture.OTHER_AT_JAMES)
             .recipients(MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.ANY_AT_JAMES2)
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .state("state")
             .build();
         mail.addSpecificHeaderForRecipient(TEST_HEADER_USER1, MailAddressFixture.ANY_AT_JAMES);
@@ -259,7 +260,7 @@ public class MailDispatcherTest {
         FakeMail mail = FakeMail.builder()
             .sender(MailAddressFixture.OTHER_AT_JAMES)
             .recipients(MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.ANY_AT_JAMES2)
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .state("state")
             .build();
         mail.addSpecificHeaderForRecipient(TEST_HEADER_USER1, MailAddressFixture.ANY_AT_JAMES);
@@ -284,7 +285,7 @@ public class MailDispatcherTest {
         FakeMail mail = FakeMail.builder()
             .sender(MailAddressFixture.OTHER_AT_JAMES)
             .recipients(MailAddressFixture.ANY_AT_JAMES, MailAddressFixture.ANY_AT_JAMES2)
-            .mimeMessage(MimeMessageBuilder.defaultMimeMessage())
+            .mimeMessage(MimeMessageUtil.defaultMimeMessage())
             .state("state")
             .build();
         mail.addSpecificHeaderForRecipient(TEST_HEADER_USER1, MailAddressFixture.ANY_AT_JAMES);

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
index 1c77e9c..9b56dc3 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/SieveIntegrationTest.java
@@ -40,6 +40,7 @@ import org.apache.mailet.Mail;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailContext;
 import org.apache.mailet.base.test.FakeMailetConfig;
+import org.apache.mailet.base.test.MimeMessageUtil;
 import org.joda.time.DateTime;
 import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
@@ -268,7 +269,7 @@ public class SieveIntegrationTest {
         prepareTestUsingScript("org/apache/james/transport/mailets/delivery/headerEncodedFolded.script");
 
         FakeMail mail = FakeMail.builder()
-            .mimeMessage(MimeMessageBuilder.mimeMessageFromStream(
+            .mimeMessage(MimeMessageUtil.mimeMessageFromStream(
                 ClassLoader.getSystemResourceAsStream("eml/gmail.eml")))
             .state(Mail.DEFAULT)
             .recipient(RECEIVER_DOMAIN_COM)

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
index 51ff6fa..0aabe9f 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
@@ -87,6 +87,7 @@ import org.apache.james.utils.MessageIdProbe;
 import org.apache.james.utils.SMTPMessageSender;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.MimeMessageUtil;
 import org.hamcrest.Matcher;
 import org.hamcrest.Matchers;
 import org.junit.After;
@@ -4915,7 +4916,7 @@ public abstract class SetMessagesMethodTest {
 
     @Test
     public void textBodyOfMessageWithTextCalendarShouldBeConvertedToAttachment() throws Exception {
-        MimeMessage calendarMessage = MimeMessageBuilder.mimeMessageFromStream(ClassLoader.getSystemResourceAsStream("eml/calendar.eml"));
+        MimeMessage calendarMessage = MimeMessageUtil.mimeMessageFromStream(ClassLoader.getSystemResourceAsStream("eml/calendar.eml"));
         String fromAddress = USERNAME;
 
         Mail mail = FakeMail.builder()

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/server/protocols/jmap/src/test/java/org/apache/james/jmap/mailet/TextCalendarBodyToAttachmentTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/mailet/TextCalendarBodyToAttachmentTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/mailet/TextCalendarBodyToAttachmentTest.java
index 9f832e8..1ebd61c 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/mailet/TextCalendarBodyToAttachmentTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/mailet/TextCalendarBodyToAttachmentTest.java
@@ -32,10 +32,10 @@ import javax.mail.MessagingException;
 import javax.mail.Multipart;
 import javax.mail.internet.MimeMessage;
 
-import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailetConfig;
+import org.apache.mailet.base.test.MimeMessageUtil;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -55,7 +55,7 @@ public class TextCalendarBodyToAttachmentTest {
             .mailetName("TextCalendarBodyToAttachment")
             .build());
 
-        calendarMessage = MimeMessageBuilder.mimeMessageFromStream(ClassLoader.getSystemResourceAsStream("calendar.eml"));
+        calendarMessage = MimeMessageUtil.mimeMessageFromStream(ClassLoader.getSystemResourceAsStream("calendar.eml"));
     }
 
     @Test
@@ -91,7 +91,7 @@ public class TextCalendarBodyToAttachmentTest {
             "Content-transfer-encoding: 8BIT\n" +
             "\n" +
             "BEGIN:VCALENDAR";
-        MimeMessage message = MimeMessageBuilder.mimeMessageFromStream(new ByteArrayInputStream(messageContent.getBytes(StandardCharsets.US_ASCII)));
+        MimeMessage message = MimeMessageUtil.mimeMessageFromStream(new ByteArrayInputStream(messageContent.getBytes(StandardCharsets.US_ASCII)));
 
         Mail mail = FakeMail.builder()
             .mimeMessage(message)
@@ -109,7 +109,7 @@ public class TextCalendarBodyToAttachmentTest {
             "Content-transfer-encoding: 8BIT\n" +
             "\n" +
             "BEGIN:VCALENDAR";
-        MimeMessage message = MimeMessageBuilder.mimeMessageFromStream(new ByteArrayInputStream(messageContent.getBytes(StandardCharsets.US_ASCII)));
+        MimeMessage message = MimeMessageUtil.mimeMessageFromStream(new ByteArrayInputStream(messageContent.getBytes(StandardCharsets.US_ASCII)));
 
         Mail mail = FakeMail.builder()
             .mimeMessage(message)
@@ -128,7 +128,7 @@ public class TextCalendarBodyToAttachmentTest {
             "BEGIN:VCALENDAR\n" +
             "END:VEVENT\n" +
             "END:VCALENDAR";
-        MimeMessage message = MimeMessageBuilder.mimeMessageFromStream(new ByteArrayInputStream(messageContent.getBytes(StandardCharsets.US_ASCII)));
+        MimeMessage message = MimeMessageUtil.mimeMessageFromStream(new ByteArrayInputStream(messageContent.getBytes(StandardCharsets.US_ASCII)));
 
         Mail mail = FakeMail.builder()
             .mimeMessage(message)
@@ -207,7 +207,7 @@ public class TextCalendarBodyToAttachmentTest {
             "BEGIN:VCALENDAR\n" +
             "END:VEVENT\n" +
             "END:VCALENDAR";
-        MimeMessage message = MimeMessageBuilder.mimeMessageFromStream(new ByteArrayInputStream(messageContent.getBytes(StandardCharsets.US_ASCII)));
+        MimeMessage message = MimeMessageUtil.mimeMessageFromStream(new ByteArrayInputStream(messageContent.getBytes(StandardCharsets.US_ASCII)));
 
         Mail mail = FakeMail.builder()
             .mimeMessage(message)
@@ -226,7 +226,7 @@ public class TextCalendarBodyToAttachmentTest {
             "BEGIN:VCALENDAR\n" +
             "END:VEVENT\n" +
             "END:VCALENDAR";
-        MimeMessage message = MimeMessageBuilder.mimeMessageFromStream(new ByteArrayInputStream(messageContent.getBytes(StandardCharsets.US_ASCII)));
+        MimeMessage message = MimeMessageUtil.mimeMessageFromStream(new ByteArrayInputStream(messageContent.getBytes(StandardCharsets.US_ASCII)));
 
         Mail mail = FakeMail.builder()
             .mimeMessage(message)

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/server/queue/queue-api/pom.xml
----------------------------------------------------------------------
diff --git a/server/queue/queue-api/pom.xml b/server/queue/queue-api/pom.xml
index d9817d8..cb2f548 100644
--- a/server/queue/queue-api/pom.xml
+++ b/server/queue/queue-api/pom.xml
@@ -37,7 +37,12 @@
             <groupId>${project.groupId}</groupId>
             <artifactId>apache-mailet-api</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>apache-mailet-base</artifactId>
+            <scope>test</scope>
+            <type>test-jar</type>
+        </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>james-server-core</artifactId>
@@ -66,6 +71,10 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
             <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/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
new file mode 100644
index 0000000..90d8ce7
--- /dev/null
+++ b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueContract.java
@@ -0,0 +1,289 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.queue.api;
+
+import static org.apache.james.queue.api.Mails.createMimeMessage;
+import static org.apache.james.queue.api.Mails.defaultMail;
+import static org.apache.mailet.base.MailAddressFixture.RECIPIENT1;
+import static org.apache.mailet.base.MailAddressFixture.RECIPIENT2;
+import static org.apache.mailet.base.MailAddressFixture.SENDER;
+import static org.apache.mailet.base.test.MimeMessageUtil.asString;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.util.Date;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import javax.mail.internet.MimeMessage;
+
+import org.apache.mailet.Mail;
+import org.apache.mailet.PerRecipientHeaders;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import com.github.fge.lambdas.Throwing;
+
+@ExtendWith(ExecutorExtension.class)
+public interface MailQueueContract {
+
+    MailQueue getMailQueue();
+
+    @Test
+    default void queueShouldPreserveMailRecipients() throws Exception {
+        getMailQueue().enQueue(defaultMail()
+            .recipients(RECIPIENT1, RECIPIENT2)
+            .build());
+
+        MailQueue.MailQueueItem mailQueueItem = getMailQueue().deQueue();
+        assertThat(mailQueueItem.getMail().getRecipients())
+            .containsOnly(RECIPIENT1, RECIPIENT2);
+    }
+
+    @Test
+    default void queueShouldPreserveMailSender() throws Exception {
+        getMailQueue().enQueue(defaultMail()
+            .sender(SENDER)
+            .build());
+
+        MailQueue.MailQueueItem mailQueueItem = getMailQueue().deQueue();
+        assertThat(mailQueueItem.getMail().getSender())
+            .isEqualTo(SENDER);
+    }
+
+    @Test
+    default void queueShouldPreserveMimeMessage() throws Exception {
+        MimeMessage originalMimeMessage = createMimeMessage();
+        getMailQueue().enQueue(defaultMail()
+            .mimeMessage(originalMimeMessage)
+            .build());
+
+        MailQueue.MailQueueItem mailQueueItem = getMailQueue().deQueue();
+        assertThat(asString(mailQueueItem.getMail().getMessage()))
+            .isEqualTo(asString(originalMimeMessage));
+    }
+
+    @Test
+    default void queueShouldPreserveMailAttribute() throws Exception {
+        String attributeName = "any";
+        String attributeValue = "value";
+        getMailQueue().enQueue(defaultMail()
+            .attribute(attributeName, attributeValue)
+            .build());
+
+        MailQueue.MailQueueItem mailQueueItem = getMailQueue().deQueue();
+        assertThat(mailQueueItem.getMail().getAttribute(attributeName))
+            .isEqualTo(attributeValue);
+    }
+
+    @Test
+    default void queueShouldPreserveErrorMessage() throws Exception {
+        String errorMessage = "ErrorMessage";
+        getMailQueue().enQueue(defaultMail()
+            .errorMessage(errorMessage)
+            .build());
+
+        MailQueue.MailQueueItem mailQueueItem = getMailQueue().deQueue();
+        assertThat(mailQueueItem.getMail().getErrorMessage())
+            .isEqualTo(errorMessage);
+    }
+
+    @Test
+    default void queueShouldPreserveState() throws Exception {
+        String state = "state";
+        getMailQueue().enQueue(defaultMail()
+            .state(state)
+            .build());
+
+        MailQueue.MailQueueItem mailQueueItem = getMailQueue().deQueue();
+        assertThat(mailQueueItem.getMail().getState())
+            .isEqualTo(state);
+    }
+
+    @Test
+    default void queueShouldPreserveRemoteAddress() throws Exception {
+        String remoteAddress = "remote";
+        getMailQueue().enQueue(defaultMail()
+            .remoteAddr(remoteAddress)
+            .build());
+
+        MailQueue.MailQueueItem mailQueueItem = getMailQueue().deQueue();
+        assertThat(mailQueueItem.getMail().getRemoteAddr())
+            .isEqualTo(remoteAddress);
+    }
+
+    @Test
+    default void queueShouldPreserveRemoteHost() throws Exception {
+        String remoteHost = "remote";
+        getMailQueue().enQueue(defaultMail()
+            .remoteHost(remoteHost)
+            .build());
+
+        MailQueue.MailQueueItem mailQueueItem = getMailQueue().deQueue();
+        assertThat(mailQueueItem.getMail().getRemoteHost())
+            .isEqualTo(remoteHost);
+    }
+
+    @Test
+    default void queueShouldPreserveLastUpdated() throws Exception {
+        Date lastUpdated = new Date();
+        getMailQueue().enQueue(defaultMail()
+            .lastUpdated(lastUpdated)
+            .build());
+
+        MailQueue.MailQueueItem mailQueueItem = getMailQueue().deQueue();
+        assertThat(mailQueueItem.getMail().getLastUpdated())
+            .isEqualTo(lastUpdated);
+    }
+
+    @Test
+    default void queueShouldPreserveName() throws Exception {
+        String expectedName = "name";
+        getMailQueue().enQueue(defaultMail()
+            .name(expectedName)
+            .build());
+
+        MailQueue.MailQueueItem mailQueueItem = getMailQueue().deQueue();
+        assertThat(mailQueueItem.getMail().getName())
+            .isEqualTo(expectedName);
+    }
+
+    @Test
+    default void queueShouldPreservePerRecipientHeaders() throws Exception {
+        PerRecipientHeaders.Header header = PerRecipientHeaders.Header.builder()
+            .name("any")
+            .value("any")
+            .build();
+        getMailQueue().enQueue(defaultMail()
+            .addHeaderForRecipient(header, RECIPIENT1)
+            .build());
+
+        MailQueue.MailQueueItem mailQueueItem = getMailQueue().deQueue();
+        assertThat(mailQueueItem.getMail().getPerRecipientSpecificHeaders()
+            .getHeadersForRecipient(RECIPIENT1))
+            .containsOnly(header);
+    }
+
+    @Test
+    default void dequeueShouldBeFifo() throws Exception {
+        String firstExpectedName = "name1";
+        getMailQueue().enQueue(defaultMail()
+            .name(firstExpectedName)
+            .build());
+        String secondExpectedName = "name2";
+        getMailQueue().enQueue(defaultMail()
+            .name(secondExpectedName)
+            .build());
+
+        MailQueue.MailQueueItem mailQueueItem1 = getMailQueue().deQueue();
+        mailQueueItem1.done(true);
+        MailQueue.MailQueueItem mailQueueItem2 = getMailQueue().deQueue();
+        mailQueueItem2.done(true);
+        assertThat(mailQueueItem1.getMail().getName()).isEqualTo(firstExpectedName);
+        assertThat(mailQueueItem2.getMail().getName()).isEqualTo(secondExpectedName);
+    }
+
+    @Test
+    default void dequeueCanBeChainedBeforeAck() throws Exception {
+        getMailQueue().enQueue(defaultMail()
+            .name("name1")
+            .build());
+        getMailQueue().enQueue(defaultMail()
+            .name("name2")
+            .build());
+
+        MailQueue.MailQueueItem mailQueueItem1 = getMailQueue().deQueue();
+        MailQueue.MailQueueItem mailQueueItem2 = getMailQueue().deQueue();
+        mailQueueItem1.done(true);
+        mailQueueItem2.done(true);
+        assertThat(mailQueueItem1.getMail().getName()).isEqualTo("name1");
+        assertThat(mailQueueItem2.getMail().getName()).isEqualTo("name2");
+    }
+
+
+    @Test
+    default void dequeueCouldBeInterleavingWithOutOfOrderAck() throws Exception {
+        getMailQueue().enQueue(defaultMail()
+            .name("name1")
+            .build());
+        getMailQueue().enQueue(defaultMail()
+            .name("name2")
+            .build());
+
+        MailQueue.MailQueueItem mailQueueItem1 = getMailQueue().deQueue();
+        MailQueue.MailQueueItem mailQueueItem2 = getMailQueue().deQueue();
+        mailQueueItem2.done(true);
+        mailQueueItem1.done(true);
+        assertThat(mailQueueItem1.getMail().getName()).isEqualTo("name1");
+        assertThat(mailQueueItem2.getMail().getName()).isEqualTo("name2");
+    }
+
+    @Test
+    default void dequeueShouldAllowRetrieveFailItems() throws Exception {
+        getMailQueue().enQueue(defaultMail()
+            .name("name1")
+            .build());
+        getMailQueue().enQueue(defaultMail()
+            .name("name1")
+            .build());
+
+        MailQueue.MailQueueItem mailQueueItem1 = getMailQueue().deQueue();
+        mailQueueItem1.done(false);
+        MailQueue.MailQueueItem mailQueueItem2 = getMailQueue().deQueue();
+        mailQueueItem2.done(true);
+        assertThat(mailQueueItem1.getMail().getName()).isEqualTo("name1");
+        assertThat(mailQueueItem2.getMail().getName()).isEqualTo("name1");
+    }
+
+    @Test
+    default void dequeueShouldNotReturnInProcessingEmails(ExecutorService executorService) throws Exception {
+        getMailQueue().enQueue(defaultMail()
+            .name("name")
+            .build());
+
+        getMailQueue().deQueue();
+
+        Future<?> future = executorService.submit(Throwing.runnable(() -> getMailQueue().deQueue()));
+        assertThatThrownBy(() -> future.get(2, TimeUnit.SECONDS))
+            .isInstanceOf(TimeoutException.class);
+    }
+
+    @Test
+    default void deQueueShouldBlockWhenNoMail(ExecutorService executorService) throws Exception {
+        Future<?> future = executorService.submit(Throwing.runnable(() -> getMailQueue().deQueue()));
+
+        assertThatThrownBy(() -> future.get(2, TimeUnit.SECONDS))
+            .isInstanceOf(TimeoutException.class);
+    }
+
+    @Test
+    default void deQueueShouldWaitForAMailToBeEnqueued(ExecutorService executorService) throws Exception {
+        Mail mail = defaultMail()
+            .name("name")
+            .build();
+        Future<MailQueue.MailQueueItem> tryDequeue = executorService.submit(() -> getMailQueue().deQueue());
+        getMailQueue().enQueue(mail);
+
+        assertThat(tryDequeue.get().getMail().getName()).isEqualTo("name");
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/server/queue/queue-api/src/test/java/org/apache/james/queue/api/Mails.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/Mails.java b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/Mails.java
new file mode 100644
index 0000000..32e986b
--- /dev/null
+++ b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/Mails.java
@@ -0,0 +1,51 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.queue.api;
+
+import static org.apache.mailet.base.MailAddressFixture.RECIPIENT1;
+import static org.apache.mailet.base.MailAddressFixture.RECIPIENT2;
+import static org.apache.mailet.base.MailAddressFixture.SENDER;
+
+import java.util.Date;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+
+import org.apache.james.core.builder.MimeMessageBuilder;
+import org.apache.mailet.base.test.FakeMail;
+
+public interface Mails {
+
+    static FakeMail.Builder defaultMail() throws MessagingException {
+        return FakeMail.builder()
+            .name("name")
+            .mimeMessage(createMimeMessage())
+            .sender(SENDER)
+            .recipients(RECIPIENT1, RECIPIENT2)
+            .lastUpdated(new Date());
+    }
+
+    static MimeMessage createMimeMessage() throws MessagingException {
+        return MimeMessageBuilder.mimeMessageBuilder()
+            .setText("test")
+            .addHeader("testheader", "testvalue")
+            .build();
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/server/queue/queue-jms/pom.xml
----------------------------------------------------------------------
diff --git a/server/queue/queue-jms/pom.xml b/server/queue/queue-jms/pom.xml
index 9271792..7e99ce3 100644
--- a/server/queue/queue-jms/pom.xml
+++ b/server/queue/queue-jms/pom.xml
@@ -39,6 +39,12 @@
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
+            <artifactId>apache-mailet-base</artifactId>
+            <scope>test</scope>
+            <type>test-jar</type>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
             <artifactId>james-server-core</artifactId>
         </dependency>
         <dependency>
@@ -56,6 +62,12 @@
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
+            <artifactId>james-server-queue-api</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
             <artifactId>metrics-api</artifactId>
         </dependency>
         <dependency>
@@ -93,6 +105,16 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.platform</groupId>
+            <artifactId>junit-platform-launcher</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.junit.vintage</groupId>
             <artifactId>junit-vintage-engine</artifactId>
             <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/james-project/blob/9c13b922/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
new file mode 100644
index 0000000..a5708ce
--- /dev/null
+++ b/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSMailQueueTest.java
@@ -0,0 +1,104 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.queue.jms;
+
+import javax.jms.ConnectionFactory;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.activemq.broker.BrokerService;
+import org.apache.activemq.broker.region.policy.PolicyEntry;
+import org.apache.activemq.broker.region.policy.PolicyMap;
+import org.apache.james.metrics.api.NoopMetricFactory;
+import org.apache.james.queue.api.MailQueue;
+import org.apache.james.queue.api.MailQueueContract;
+import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import com.google.common.collect.ImmutableList;
+
+public class JMSMailQueueTest implements MailQueueContract {
+
+    private final static String QUEUE_NAME = "test";
+
+    private JMSMailQueue mailQueue;
+
+    private BrokerService broker;
+
+    @BeforeEach
+    public void setUp() throws Exception {
+        broker = createBroker();
+        broker.start();
+        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?create=false");
+        RawMailQueueItemDecoratorFactory mailQueueItemDecoratorFactory = new RawMailQueueItemDecoratorFactory();
+        NoopMetricFactory metricFactory = new NoopMetricFactory();
+        mailQueue = new JMSMailQueue(connectionFactory, mailQueueItemDecoratorFactory, QUEUE_NAME, metricFactory);
+    }
+
+    private BrokerService createBroker() throws Exception {
+        BrokerService aBroker = new BrokerService();
+        aBroker.setPersistent(false);
+        aBroker.setUseJmx(false);
+        aBroker.addConnector("tcp://127.0.0.1:61616");
+
+        // Enable priority support
+        PolicyMap pMap = new PolicyMap();
+        PolicyEntry entry = new PolicyEntry();
+        entry.setPrioritizedMessages(true);
+        entry.setQueue(QUEUE_NAME);
+        pMap.setPolicyEntries(ImmutableList.of(entry));
+        aBroker.setDestinationPolicy(pMap);
+
+        return aBroker;
+    }
+
+    @AfterEach
+    public void tearDown() throws Exception {
+        broker.stop();
+    }
+
+    @Override
+    public MailQueue getMailQueue() {
+        return mailQueue;
+    }
+
+    @Test
+    @Override
+    @Disabled("JAMES-2295 Disabled as test was dead-locking")
+    public void dequeueCanBeChainedBeforeAck() {
+
+    }
+
+    @Test
+    @Override
+    @Disabled("JAMES-2295 Disabled as test was dead-locking")
+    public void dequeueCouldBeInterleavingWithOutOfOrderAck() {
+
+    }
+
+    @Test
+    @Override
+    @Disabled("JAMES-2301 Per recipients headers are not attached to the message.")
+    public void queueShouldPreservePerRecipientHeaders() {
+
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org