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 2020/06/24 10:57:21 UTC

[james-project] 06/07: JAMES-3029 add test to check that mail is well received by all recipients

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 <rk...@linagora.com>
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("bob@apache.org", JAMES_USER, uniqueMessage);
     }
+
+    default void sendUniqueMessageToTwoUsers(SMTPMessageSender sender, String message) throws IOException {
+        String uniqueMessage = message.replace("banana", "UUID " + UUID.randomUUID().toString());
+        sender.sendMessageWithHeaders("bob@apache.org", 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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org