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]
