JAMES-2363 Copy Mime message in SentMail

This allows uncoupling mime message from previous existing ones and avoids 
unexpected test failures.


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

Branch: refs/heads/master
Commit: d24020b3e10cbaef1c89998c8fce9cae05c8fa37
Parents: f03eece
Author: benwa <[email protected]>
Authored: Mon Mar 26 09:47:17 2018 +0700
Committer: benwa <[email protected]>
Committed: Thu Mar 29 16:42:52 2018 +0700

----------------------------------------------------------------------
 .../mailet/base/test/FakeMailContext.java       | 19 ++++++++++---
 .../james/transport/mailets/DSNBounceTest.java  | 29 +++++++++++++-------
 2 files changed, 34 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/d24020b3/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailContext.java
----------------------------------------------------------------------
diff --git 
a/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailContext.java 
b/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailContext.java
index 5621104..687b996 100644
--- a/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailContext.java
+++ b/mailet/base/src/test/java/org/apache/mailet/base/test/FakeMailContext.java
@@ -36,12 +36,15 @@ import javax.mail.internet.MimeMessage;
 
 import org.apache.james.core.Domain;
 import org.apache.james.core.MailAddress;
+import org.apache.james.core.builder.MimeMessageWrapper;
 import org.apache.mailet.HostAddress;
 import org.apache.mailet.LookupException;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailetContext;
 import org.slf4j.Logger;
 
+import com.github.fge.lambdas.Throwing;
+import com.github.fge.lambdas.functions.ThrowingFunction;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -108,6 +111,14 @@ public class FakeMailContext implements MailetContext {
 
     public static class SentMail {
 
+        private static MimeMessage tryCopyMimeMessage(MimeMessage msg) throws 
MessagingException {
+            ThrowingFunction<MimeMessage, MimeMessage> throwingFunction = 
MimeMessageWrapper::wrap;
+
+            return Optional.ofNullable(msg)
+                .map(Throwing.function(throwingFunction).sneakyThrow())
+                .orElse(null);
+        }
+
         public static class Builder {
             private MailAddress sender;
             private Optional<Collection<MailAddress>> recipients = 
Optional.empty();
@@ -176,7 +187,7 @@ public class FakeMailContext implements MailetContext {
                 return this;
             }
 
-            public SentMail build() {
+            public SentMail build() throws MessagingException {
                 if (fromMailet.orElse(false)) {
                     this.attribute(Mail.SENT_BY_MAILET, "true");
                 }
@@ -193,10 +204,10 @@ public class FakeMailContext implements MailetContext {
         private final String state;
         private final Optional<Delay> delay;
 
-        private SentMail(MailAddress sender, Collection<MailAddress> 
recipients, MimeMessage msg, Map<String, Serializable> attributes, String 
state, Optional<Delay> delay) {
+        private SentMail(MailAddress sender, Collection<MailAddress> 
recipients, MimeMessage msg, Map<String, Serializable> attributes, String 
state, Optional<Delay> delay) throws MessagingException {
             this.sender = sender;
             this.recipients = ImmutableList.copyOf(recipients);
-            this.msg = msg;
+            this.msg = tryCopyMimeMessage(msg);
             this.subject = getSubject(msg);
             this.attributes = ImmutableMap.copyOf(attributes);
             this.state = state;
@@ -311,7 +322,7 @@ public class FakeMailContext implements MailetContext {
             this.bouncer = bouncer;
         }
 
-        public BouncedMail(SentMail.Builder sentMail, String message, 
Optional<MailAddress> bouncer) {
+        public BouncedMail(SentMail.Builder sentMail, String message, 
Optional<MailAddress> bouncer) throws MessagingException {
             this(sentMail.build(), message, bouncer);
         }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/d24020b3/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/DSNBounceTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/DSNBounceTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/DSNBounceTest.java
index fd4a233..9e0cf7e 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/DSNBounceTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/DSNBounceTest.java
@@ -25,22 +25,26 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import java.net.InetAddress;
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.TimeZone;
 
 import javax.mail.BodyPart;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+import javax.mail.util.SharedByteArrayInputStream;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.transport.mailets.redirect.SpecialAddress;
+import org.apache.james.util.MimeMessageUtil;
 import org.apache.mailet.Mail;
 import org.apache.mailet.base.DateFormats;
 import org.apache.mailet.base.MailAddressFixture;
 import org.apache.mailet.base.RFC2822Headers;
-import org.apache.mailet.base.mail.MimeMultipartReport;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailContext;
 import org.apache.mailet.base.test.FakeMailContext.SentMail;
@@ -176,7 +180,7 @@ public class DSNBounceTest {
         assertThat(sentMails).hasSize(1);
         SentMail sentMail = sentMails.get(0);
         MimeMessage sentMessage = sentMail.getMsg();
-        MimeMultipartReport content = (MimeMultipartReport) 
sentMessage.getContent();
+        MimeMultipart content = (MimeMultipart) sentMessage.getContent();
         BodyPart bodyPart = content.getBodyPart(0);
         assertThat(bodyPart.getContentType()).isEqualTo("text/plain; 
charset=us-ascii");
         assertThat(bodyPart.getContent()).isEqualTo(expectedContent);
@@ -216,7 +220,7 @@ public class DSNBounceTest {
         assertThat(sentMails).hasSize(1);
         SentMail sentMail = sentMails.get(0);
         MimeMessage sentMessage = sentMail.getMsg();
-        MimeMultipartReport content = (MimeMultipartReport) 
sentMessage.getContent();
+        MimeMultipart content = (MimeMultipart) sentMessage.getContent();
         BodyPart bodyPart = content.getBodyPart(0);
         assertThat(bodyPart.getContentType()).isEqualTo("text/plain; 
charset=us-ascii");
         assertThat(bodyPart.getContent()).isEqualTo(expectedContent);
@@ -257,8 +261,9 @@ public class DSNBounceTest {
         assertThat(sentMails).hasSize(1);
         SentMail sentMail = sentMails.get(0);
         MimeMessage sentMessage = sentMail.getMsg();
-        MimeMultipartReport content = (MimeMultipartReport) 
sentMessage.getContent();
-        
assertThat(content.getBodyPart(1).getContent()).isEqualTo(expectedContent);
+        MimeMultipart content = (MimeMultipart) sentMessage.getContent();
+        SharedByteArrayInputStream actualContent = 
(SharedByteArrayInputStream) content.getBodyPart(1).getContent();
+        assertThat(IOUtils.toString(actualContent, 
StandardCharsets.UTF_8)).isEqualTo(expectedContent);
     }
 
     @Test
@@ -359,7 +364,7 @@ public class DSNBounceTest {
         assertThat(sentMail.getSender()).isNull();
         assertThat(sentMail.getRecipients()).containsOnly(senderMailAddress);
         MimeMessage sentMessage = sentMail.getMsg();
-        MimeMultipartReport content = (MimeMultipartReport) 
sentMessage.getContent();
+        MimeMultipart content = (MimeMultipart) sentMessage.getContent();
         assertThat(content.getCount()).isEqualTo(2);
     }
 
@@ -392,8 +397,11 @@ public class DSNBounceTest {
         assertThat(sentMail.getSender()).isNull();
         assertThat(sentMail.getRecipients()).containsOnly(senderMailAddress);
         MimeMessage sentMessage = sentMail.getMsg();
-        MimeMultipartReport content = (MimeMultipartReport) 
sentMessage.getContent();
-        assertThat(content.getBodyPart(2).getContent()).isEqualTo(mimeMessage);
+        MimeMultipart content = (MimeMultipart) sentMessage.getContent();
+
+        
assertThat(sentMail.getMsg().getContentType()).startsWith("multipart/report;");
+        assertThat(MimeMessageUtil.asString((MimeMessage) 
content.getBodyPart(2).getContent()))
+            .isEqualTo(MimeMessageUtil.asString(mimeMessage));
     }
 
     @Test
@@ -425,9 +433,10 @@ public class DSNBounceTest {
         assertThat(sentMail.getSender()).isNull();
         assertThat(sentMail.getRecipients()).containsOnly(senderMailAddress);
         MimeMessage sentMessage = sentMail.getMsg();
-        MimeMultipartReport content = (MimeMultipartReport) 
sentMessage.getContent();
+        MimeMultipart content = (MimeMultipart) sentMessage.getContent();
         BodyPart bodyPart = content.getBodyPart(2);
-        assertThat((String) bodyPart.getContent())
+        SharedByteArrayInputStream actualContent = 
(SharedByteArrayInputStream) bodyPart.getContent();
+        assertThat(IOUtils.toString(actualContent, StandardCharsets.UTF_8))
             .contains("Subject: mySubject")
             .contains("myHeader: myValue");
         assertThat(bodyPart.getContentType()).isEqualTo("text/rfc822-headers; 
name=mySubject");


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

Reply via email to