MAILET-135 Add a simple test on sending an email

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

Branch: refs/heads/master
Commit: cd6fe9cbd4ce369378e8b450e8e8adf005872997
Parents: 4dd77f9
Author: Antoine Duprat <adup...@linagora.com>
Authored: Wed Sep 21 15:49:15 2016 +0200
Committer: Antoine Duprat <adup...@linagora.com>
Committed: Tue Oct 4 18:41:44 2016 +0200

----------------------------------------------------------------------
 .../modules/server/MemoryMailQueueFactory.java  | 11 ++-
 .../mailets/CommonMailetConfigurationTest.java  | 80 +++++++++++++++++++-
 .../james/mailets/TemporaryJamesServer.java     |  5 ++
 .../src/test/resources/logback.xml              | 21 +++++
 .../src/test/resources/usersrepository.xml      | 25 ++++++
 5 files changed, 140 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/cd6fe9cb/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/server/MemoryMailQueueFactory.java
----------------------------------------------------------------------
diff --git 
a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/server/MemoryMailQueueFactory.java
 
b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/server/MemoryMailQueueFactory.java
index c1f92b1..eebc896 100644
--- 
a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/server/MemoryMailQueueFactory.java
+++ 
b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/server/MemoryMailQueueFactory.java
@@ -25,6 +25,7 @@ import java.util.concurrent.LinkedBlockingDeque;
 import java.util.concurrent.TimeUnit;
 
 import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
 
 import org.apache.james.core.MailImpl;
 import org.apache.james.queue.api.MailQueue;
@@ -32,6 +33,7 @@ import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.queue.api.MailQueueItemDecoratorFactory;
 import org.apache.mailet.Mail;
 
+import com.github.fge.lambdas.Throwing;
 import com.google.common.base.Objects;
 import com.google.inject.Inject;
 
@@ -78,12 +80,19 @@ public class MemoryMailQueueFactory implements 
MailQueueFactory {
         @Override
         public void enQueue(Mail mail) throws MailQueueException {
             try {
-                mailItems.addFirst(new MemoryMailQueueItem(new 
MailImpl(mail)));
+                mailItems.addFirst(new MemoryMailQueueItem(cloneMail(mail)));
             } catch (MessagingException e) {
                 throw new MailQueueException("Error while copying mail " + 
mail.getName(), e);
             }
         }
 
+        private Mail cloneMail(Mail mail) throws MessagingException {
+            MailImpl mailImpl = new MailImpl(mail);
+            Optional.ofNullable(mail.getMessage())
+                    .ifPresent(Throwing.consumer(message -> 
mailImpl.setMessage(new MimeMessage(message))));
+            return mailImpl;
+        }
+
         @Override
         public MailQueueItem deQueue() throws MailQueueException, 
InterruptedException {
             while (true) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/cd6fe9cb/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/CommonMailetConfigurationTest.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/CommonMailetConfigurationTest.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/CommonMailetConfigurationTest.java
index 3d785aa..d8a8cad 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/CommonMailetConfigurationTest.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/CommonMailetConfigurationTest.java
@@ -19,6 +19,12 @@
 
 package org.apache.james.mailets;
 
+import java.io.IOException;
+import java.nio.channels.SocketChannel;
+
+import org.apache.commons.net.imap.IMAPClient;
+import org.apache.commons.net.smtp.SMTPClient;
+import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailets.configuration.CommonProcessors;
 import org.apache.james.mailets.configuration.MailetContainer;
 import org.junit.After;
@@ -27,14 +33,24 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 
+import com.google.common.base.Throwables;
+import com.jayway.awaitility.Awaitility;
+import com.jayway.awaitility.Duration;
+import com.jayway.awaitility.core.ConditionFactory;
+
 public class CommonMailetConfigurationTest {
 
     private static final String DEFAULT_DOMAIN = "james.org";
+    private static final String LOCALHOST_IP = "127.0.0.1";
+    private static final int IMAP_PORT = 1143;
+    private static final int SMTP_PORT = 1025;
+    private static final String PASSWORD = "secret";
 
     @Rule
     public TemporaryFolder temporaryFolder = new TemporaryFolder();
 
     private TemporaryJamesServer jamesServer;
+    private ConditionFactory calmlyAwait;
 
     @Before
     public void setup() throws Exception {
@@ -52,6 +68,8 @@ public class CommonMailetConfigurationTest {
             .build();
 
         jamesServer = new TemporaryJamesServer(temporaryFolder, 
mailetContainer);
+        Duration slowPacedPollInterval = Duration.FIVE_HUNDRED_MILLISECONDS;
+        calmlyAwait = 
Awaitility.with().pollInterval(slowPacedPollInterval).and().with().pollDelay(slowPacedPollInterval).await();
     }
 
     @After
@@ -60,6 +78,66 @@ public class CommonMailetConfigurationTest {
     }
 
     @Test
-    public void startingJamesWithCommonMailetConfigurationShouldWork() {
+    public void startingJamesWithCommonMailetConfigurationShouldWork() throws 
Exception {
+    }
+
+    @Test
+    public void simpleMailShouldBeSent() throws Exception {
+        jamesServer.getServerProbe().addDomain(DEFAULT_DOMAIN);
+        String from = "user@" + DEFAULT_DOMAIN;
+        jamesServer.getServerProbe().addUser(from, PASSWORD);
+        String recipient = "user2@" + DEFAULT_DOMAIN;
+        jamesServer.getServerProbe().addUser(recipient, PASSWORD);
+        
jamesServer.getServerProbe().createMailbox(MailboxConstants.USER_NAMESPACE, 
recipient, "INBOX");
+
+        SMTPClient smtpClient = new SMTPClient();
+        try (SocketChannel socketChannel = SocketChannel.open()) {
+            smtpClient.connect(LOCALHOST_IP, SMTP_PORT);
+            sendMessage(smtpClient, from, recipient);
+
+            calmlyAwait.atMost(Duration.ONE_MINUTE).until(() -> 
messageHasBeenSent(smtpClient));
+            calmlyAwait.atMost(Duration.ONE_MINUTE).until(() -> 
userReceivedMessage(recipient));
+        } finally {
+            smtpClient.disconnect();
+        }
+    }
+
+    private void sendMessage(SMTPClient smtpClient, String from, String 
recipient) {
+        try {
+            smtpClient.helo(DEFAULT_DOMAIN);
+            smtpClient.setSender(from);
+            smtpClient.rcpt("<" + recipient + ">");
+            smtpClient.sendShortMessageData("subject: test\r\n" +
+                    "\r\n" +
+                    "content\r\n" +
+                    ".\r\n");
+        } catch (IOException e) {
+            throw Throwables.propagate(e);
+        }
+    }
+
+    private boolean messageHasBeenSent(SMTPClient smtpClient) throws 
IOException {
+        return smtpClient.getReplyString()
+            .contains("250 2.6.0 Message received");
+    }
+
+    private boolean userReceivedMessage(String user) {
+        IMAPClient imapClient = new IMAPClient();
+        try {
+            imapClient.connect(LOCALHOST_IP, IMAP_PORT);
+            imapClient.login(user, PASSWORD);
+            imapClient.select("INBOX");
+            imapClient.fetch("1:1", "ALL");
+            String replyString = imapClient.getReplyString();
+            return replyString.contains("OK FETCH completed");
+        } catch (IOException e) {
+            throw Throwables.propagate(e);
+        } finally {
+            try {
+                imapClient.close();
+            } catch (IOException e) {
+                throw Throwables.propagate(e);
+            }
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/cd6fe9cb/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/TemporaryJamesServer.java
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/TemporaryJamesServer.java
 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/TemporaryJamesServer.java
index 265df8b..71cedb1 100644
--- 
a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/TemporaryJamesServer.java
+++ 
b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/TemporaryJamesServer.java
@@ -31,6 +31,7 @@ import org.apache.james.GuiceJamesServer;
 import org.apache.james.MemoryJamesServerMain;
 import org.apache.james.mailets.configuration.MailetContainer;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.utils.ExtendedServerProbe;
 import org.junit.rules.TemporaryFolder;
 
 public class TemporaryJamesServer {
@@ -67,4 +68,8 @@ public class TemporaryJamesServer {
     public void shutdown() {
         jamesServer.stop();
     }
+
+    public ExtendedServerProbe getServerProbe() {
+        return jamesServer.serverProbe();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/cd6fe9cb/server/mailet/integration-testing/src/test/resources/logback.xml
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/resources/logback.xml 
b/server/mailet/integration-testing/src/test/resources/logback.xml
new file mode 100644
index 0000000..52c0153
--- /dev/null
+++ b/server/mailet/integration-testing/src/test/resources/logback.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+
+        <contextListener 
class="ch.qos.logback.classic.jul.LevelChangePropagator">
+                <resetJUL>true</resetJUL>
+        </contextListener>
+
+        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+                <encoder>
+                        <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{15} - 
%msg%n%rEx</pattern>
+                        <immediateFlush>false</immediateFlush>
+                </encoder>
+        </appender>
+
+        <root level="WARN">
+                <appender-ref ref="CONSOLE" />
+        </root>
+
+        <logger 
name="org.apache.james.mailetcontainer.impl.JamesMailetContext" level="DEBUG"/>
+
+</configuration>

http://git-wip-us.apache.org/repos/asf/james-project/blob/cd6fe9cb/server/mailet/integration-testing/src/test/resources/usersrepository.xml
----------------------------------------------------------------------
diff --git 
a/server/mailet/integration-testing/src/test/resources/usersrepository.xml 
b/server/mailet/integration-testing/src/test/resources/usersrepository.xml
new file mode 100644
index 0000000..85046b3
--- /dev/null
+++ b/server/mailet/integration-testing/src/test/resources/usersrepository.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!--
+  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.                                           
+ -->
+
+<usersrepository name="LocalUsers">
+    <algorithm>MD5</algorithm>
+    <enableVirtualHosting>true</enableVirtualHosting>    
+</usersrepository>
+


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

Reply via email to