This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 1996931071e56850299ceda37623f060669486be Author: Rémi KOWALSKI <[email protected]> AuthorDate: Thu Jan 23 11:56:57 2020 +0100 JAMES-3029 add test to check that mail is well received by all recipients --- .../apache/james/MailsShouldBeWellReceived.java | 51 +++++++++++++++++++--- .../org/apache/james/utils/SMTPMessageSender.java | 30 +++++++------ 2 files changed, 60 insertions(+), 21 deletions(-) diff --git a/server/container/guice/guice-common/src/test/java/org/apache/james/MailsShouldBeWellReceived.java b/server/container/guice/guice-common/src/test/java/org/apache/james/MailsShouldBeWellReceived.java index 2ddecad..f119167 100644 --- a/server/container/guice/guice-common/src/test/java/org/apache/james/MailsShouldBeWellReceived.java +++ b/server/container/guice/guice-common/src/test/java/org/apache/james/MailsShouldBeWellReceived.java @@ -48,6 +48,7 @@ import org.awaitility.Awaitility; import org.awaitility.Duration; import org.awaitility.core.ConditionFactory; import org.junit.jupiter.api.Test; +import org.testcontainers.shaded.com.google.common.collect.ImmutableList; import com.github.fge.lambdas.Throwing; import com.google.common.io.Resources; @@ -60,7 +61,9 @@ interface MailsShouldBeWellReceived { String JAMES_SERVER_HOST = "127.0.0.1"; String DOMAIN = "apache.org"; String JAMES_USER = "james-user@" + DOMAIN; + String OTHER_USER = "other-user@" + DOMAIN; String PASSWORD = "secret"; + String PASSWORD_OTHER = "other-secret"; ConditionFactory CALMLY_AWAIT = Awaitility .with().pollInterval(Duration.ONE_HUNDRED_MILLISECONDS) .and().pollDelay(Duration.ONE_HUNDRED_MILLISECONDS) @@ -125,13 +128,8 @@ interface MailsShouldBeWellReceived { String message = Resources.toString(Resources.getResource("eml/htmlMail.eml"), StandardCharsets.UTF_8); try (SMTPMessageSender sender = new SMTPMessageSender(Domain.LOCALHOST.asString())) { - Mono.fromRunnable( - Throwing.runnable(() -> { - sender.connect(JAMES_SERVER_HOST, smtpPort); - sendUniqueMessage(sender, message); - })) - .subscribeOn(Schedulers.elastic()) - .block(); + sender.connect(JAMES_SERVER_HOST, smtpPort); + sendUniqueMessage(sender, message); } CALMLY_AWAIT.until(() -> server.getProbe(SpoolerProbe.class).processingFinished()); @@ -146,6 +144,40 @@ interface MailsShouldBeWellReceived { } @Test + default void mailsShouldBeWellReceivedByBothRecipient(GuiceJamesServer server) throws Exception { + server.getProbe(DataProbeImpl.class).fluent() + .addDomain(DOMAIN) + .addUser(JAMES_USER, PASSWORD) + .addUser(OTHER_USER, PASSWORD_OTHER); + + MailboxProbeImpl mailboxProbe = server.getProbe(MailboxProbeImpl.class); + mailboxProbe.createMailbox("#private", JAMES_USER, DefaultMailboxes.INBOX); + mailboxProbe.createMailbox("#private", OTHER_USER, DefaultMailboxes.INBOX); + + Port smtpPort = server.getProbe(SmtpGuiceProbe.class).getSmtpPort(); + String message = Resources.toString(Resources.getResource("eml/htmlMail.eml"), StandardCharsets.UTF_8); + + try (SMTPMessageSender sender = new SMTPMessageSender(Domain.LOCALHOST.asString())) { + sender.connect(JAMES_SERVER_HOST, smtpPort); + sendUniqueMessageToTwoUsers(sender, message); + } + + CALMLY_AWAIT.untilAsserted(() -> assertThat(server.getProbe(SpoolerProbe.class).processingFinished()).isTrue()); + + try (IMAPMessageReader reader = new IMAPMessageReader()) { + reader.connect(JAMES_SERVER_HOST, server.getProbe(ImapGuiceProbe.class).getImapPort()) + .login(JAMES_USER, PASSWORD) + .select(IMAPMessageReader.INBOX) + .awaitMessageCount(CALMLY_AWAIT, 1); + reader.connect(JAMES_SERVER_HOST, server.getProbe(ImapGuiceProbe.class).getImapPort()) + .login(OTHER_USER, PASSWORD_OTHER) + .select(IMAPMessageReader.INBOX) + .awaitMessageCount(CALMLY_AWAIT, 1); + } + + } + + @Test default void oneHundredMailsShouldBeWellReceived(GuiceJamesServer server) throws Exception { server.getProbe(DataProbeImpl.class).fluent() .addDomain(DOMAIN) @@ -184,4 +216,9 @@ interface MailsShouldBeWellReceived { String uniqueMessage = message.replace("banana", "UUID " + UUID.randomUUID().toString()); sender.sendMessageWithHeaders("[email protected]", JAMES_USER, uniqueMessage); } + + default void sendUniqueMessageToTwoUsers(SMTPMessageSender sender, String message) throws IOException { + String uniqueMessage = message.replace("banana", "UUID " + UUID.randomUUID().toString()); + sender.sendMessageWithHeaders("[email protected]", ImmutableList.of(JAMES_USER, OTHER_USER), uniqueMessage); + } } diff --git a/server/testing/src/main/java/org/apache/james/utils/SMTPMessageSender.java b/server/testing/src/main/java/org/apache/james/utils/SMTPMessageSender.java index fc699aa..655023b 100644 --- a/server/testing/src/main/java/org/apache/james/utils/SMTPMessageSender.java +++ b/server/testing/src/main/java/org/apache/james/utils/SMTPMessageSender.java @@ -26,6 +26,7 @@ import java.nio.charset.StandardCharsets; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; +import java.util.List; import javax.mail.Message; import javax.mail.MessagingException; @@ -40,6 +41,8 @@ import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.rules.ExternalResource; import com.github.fge.lambdas.Throwing; +import com.github.steveash.guavate.Guavate; +import com.google.common.collect.ImmutableList; public class SMTPMessageSender extends ExternalResource implements Closeable, AfterEachCallback { @@ -91,15 +94,12 @@ public class SMTPMessageSender extends ExternalResource implements Closeable, Af } public SMTPMessageSender sendMessage(String from, String recipient) throws IOException { - doHelo(); - doSetSender(from); - doRCPT("<" + recipient + ">"); - doData("FROM: " + from + "\r\n" + + String message = "FROM: " + from + "\r\n" + "subject: test\r\n" + "\r\n" + "content\r\n" + - ".\r\n"); - return this; + ".\r\n"; + return sendMessageWithHeaders(from, ImmutableList.of(recipient), message); } public SMTPMessageSender sendMessageNoBracket(String from, String recipient) throws IOException { @@ -115,22 +115,24 @@ public class SMTPMessageSender extends ExternalResource implements Closeable, Af } public SMTPMessageSender sendMessageWithHeaders(String from, String recipient, String message) throws IOException { + return sendMessageWithHeaders(from, ImmutableList.of(recipient), message); + } + + public SMTPMessageSender sendMessageWithHeaders(String from, List<String> recipients, String message) throws IOException { doHelo(); doSetSender(from); - doRCPT("<" + recipient + ">"); + recipients.forEach(Throwing.consumer(this::doAddRcpt).sneakyThrow()); doData(message); return this; } public SMTPMessageSender sendMessage(Mail mail) throws MessagingException, IOException { String from = mail.getMaybeSender().asString(); - doHelo(); - doSetSender(from); - mail.getRecipients().stream() - .map(MailAddress::asString) - .forEach(Throwing.consumer(this::doAddRcpt).sneakyThrow()); - doData(asString(mail.getMessage())); - return this; + ImmutableList<String> recipients = mail.getRecipients().stream() + .map(MailAddress::asString).collect(Guavate.toImmutableList()); + String message = asString(mail.getMessage()); + + return sendMessageWithHeaders(from, recipients, message); } public SMTPMessageSender sendMessage(FakeMail.Builder mail) throws MessagingException, IOException { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
