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 no...@apache.org on 2011/12/23 10:04:29 UTC

svn commit: r1222614 - in /james/protocols/trunk: ./ smtp/ smtp/src/main/java/org/apache/james/protocols/smtp/core/ smtp/src/test/java/org/apache/james/protocols/smtp/

Author: norman
Date: Fri Dec 23 09:04:28 2011
New Revision: 1222614

URL: http://svn.apache.org/viewvc?rev=1222614&view=rev
Log:
Add test for SMTP server. See PROTOCOLS-64

Added:
    james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/SMTPServerTest.java   (with props)
    james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/TestUtils.java   (with props)
Modified:
    james/protocols/trunk/pom.xml
    james/protocols/trunk/smtp/pom.xml
    james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractHookableCmdHandler.java

Modified: james/protocols/trunk/pom.xml
URL: http://svn.apache.org/viewvc/james/protocols/trunk/pom.xml?rev=1222614&r1=1222613&r2=1222614&view=diff
==============================================================================
--- james/protocols/trunk/pom.xml (original)
+++ james/protocols/trunk/pom.xml Fri Dec 23 09:04:28 2011
@@ -81,7 +81,7 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.james.protocols</groupId>
-                <artifactId>protocols-impl</artifactId>
+                <artifactId>protocols-netty</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
@@ -113,6 +113,12 @@
                 <version>4.10</version>
                 <scope>test</scope>
             </dependency>
+            <dependency>
+                <groupId>commons-net</groupId>
+                <artifactId>commons-net</artifactId>
+                <version>3.0.1</version>
+                <scope>test</scope>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 

Modified: james/protocols/trunk/smtp/pom.xml
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/pom.xml?rev=1222614&r1=1222613&r2=1222614&view=diff
==============================================================================
--- james/protocols/trunk/smtp/pom.xml (original)
+++ james/protocols/trunk/smtp/pom.xml Fri Dec 23 09:04:28 2011
@@ -46,6 +46,17 @@
             <artifactId>commons-codec</artifactId>
             <optional>true</optional>
         </dependency>
+
+        <dependency>
+            <groupId>commons-net</groupId>
+            <artifactId>commons-net</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.james.protocols</groupId>
+            <artifactId>protocols-netty</artifactId>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>

Modified: james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractHookableCmdHandler.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractHookableCmdHandler.java?rev=1222614&r1=1222613&r2=1222614&view=diff
==============================================================================
--- james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractHookableCmdHandler.java (original)
+++ james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/AbstractHookableCmdHandler.java Fri Dec 23 09:04:28 2011
@@ -133,10 +133,10 @@ public abstract class AbstractHookableCm
                     }
                     return response;
                 } else {
-                	SMTPResponse res = calcDefaultSMTPResponse(hRes);
-                	if (res != null) {
-                		return res;
-                	}
+                    SMTPResponse res = calcDefaultSMTPResponse(hRes);
+                    if (res != null) {
+                        return res;
+                    }
                 }
             }
         }

Added: james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/SMTPServerTest.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/SMTPServerTest.java?rev=1222614&view=auto
==============================================================================
--- james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/SMTPServerTest.java (added)
+++ james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/SMTPServerTest.java Fri Dec 23 09:04:28 2011
@@ -0,0 +1,973 @@
+/****************************************************************
+ * 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.                                           *
+ ****************************************************************/
+package org.apache.james.protocols.smtp;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.InetSocketAddress;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.apache.commons.net.smtp.SMTPClient;
+import org.apache.commons.net.smtp.SMTPReply;
+import org.apache.james.protocols.api.Response;
+import org.apache.james.protocols.api.handler.ConnectHandler;
+import org.apache.james.protocols.api.handler.DisconnectHandler;
+import org.apache.james.protocols.netty.NettyServer;
+import org.apache.james.protocols.smtp.hook.HeloHook;
+import org.apache.james.protocols.smtp.hook.HookResult;
+import org.apache.james.protocols.smtp.hook.HookReturnCode;
+import org.apache.james.protocols.smtp.hook.MailHook;
+import org.apache.james.protocols.smtp.hook.MessageHook;
+import org.apache.james.protocols.smtp.hook.RcptHook;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+public class SMTPServerTest {
+    
+    private final static String MSG1 = "Subject: Testmessage\r\n\r\nThis is a message";
+    private final static String SENDER = "me@sender";
+    private final static String RCPT1 ="rpct1@domain";
+    private final static String RCPT2 ="rpct2@domain";
+
+    @Test
+    public void testSimpleDelivery() throws Exception {
+        TestMessageHook hook = new TestMessageHook();
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            server = new NettyServer(new SMTPProtocol(new SMTPProtocolHandlerChain(hook), new SMTPConfigurationImpl()));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+            client.helo("localhost");
+            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.setSender(SENDER);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.addRecipient(RCPT1);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.addRecipient(RCPT2);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            assertTrue(client.sendShortMessageData(MSG1));
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+
+            Iterator<MailEnvelope> queued = hook.getQueued().iterator();
+            assertTrue(queued.hasNext());
+            
+            MailEnvelope env = queued.next();
+            checkEnvelope(env, SENDER, Arrays.asList(RCPT1, RCPT2), MSG1);
+            assertFalse(queued.hasNext());
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    @Test
+    public void testUnknownCommand() throws Exception {
+        TestMessageHook hook = new TestMessageHook();
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            server = new NettyServer(new SMTPProtocol(new SMTPProtocolHandlerChain(hook), new SMTPConfigurationImpl()));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+            client.sendCommand("UNKNOWN");
+            assertTrue(SMTPReply.isNegativePermanent(client.getReplyCode()));
+
+            
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+            Iterator<MailEnvelope> queued = hook.getQueued().iterator();
+            assertFalse(queued.hasNext());
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    @Test
+    public void testNoop() throws Exception {
+        TestMessageHook hook = new TestMessageHook();
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            server = new NettyServer(new SMTPProtocol(new SMTPProtocolHandlerChain(hook), new SMTPConfigurationImpl()));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+            client.noop();
+            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+            Iterator<MailEnvelope> queued = hook.getQueued().iterator();
+            assertFalse(queued.hasNext());
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    
+    @Test
+    public void testInvalidMailCommandSyntax() throws Exception {
+        TestMessageHook hook = new TestMessageHook();
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            server = new NettyServer(new SMTPProtocol(new SMTPProtocolHandlerChain(hook), new SMTPConfigurationImpl()));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+            client.helo("localhost");
+            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.mail("invalid");
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isNegativePermanent(client.getReplyCode()));
+
+            client.addRecipient(RCPT1);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isNegativePermanent(client.getReplyCode()));
+
+           
+            
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+
+            Iterator<MailEnvelope> queued = hook.getQueued().iterator();
+            assertFalse(queued.hasNext());
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+
+
+
+    @Test
+    public void testInvalidHelo() throws Exception {
+        TestMessageHook hook = new TestMessageHook();
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            server = new NettyServer(new SMTPProtocol(new SMTPProtocolHandlerChain(hook), new SMTPConfigurationImpl()));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+            client.helo("");
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isNegativePermanent(client.getReplyCode()));
+            
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+
+            Iterator<MailEnvelope> queued = hook.getQueued().iterator();
+            assertFalse(queued.hasNext());
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+
+    @Test
+    public void testInvalidRcptCommandSyntax() throws Exception {
+        TestMessageHook hook = new TestMessageHook();
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            server = new NettyServer(new SMTPProtocol(new SMTPProtocolHandlerChain(hook), new SMTPConfigurationImpl()));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+            client.helo("localhost");
+            assertTrue(SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.setSender(SENDER);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.rcpt(RCPT1);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isNegativePermanent(client.getReplyCode()));
+
+           
+            
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+
+            Iterator<MailEnvelope> queued = hook.getQueued().iterator();
+            assertFalse(queued.hasNext());
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    
+    @Test
+    public void testInvalidNoBracketsEnformance() throws Exception {
+        TestMessageHook hook = new TestMessageHook();
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            SMTPConfigurationImpl config = new SMTPConfigurationImpl();
+            config.setUseAddressBracketsEnforcement(false);
+            server = new NettyServer(new SMTPProtocol(new SMTPProtocolHandlerChain(hook), config));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+            client.helo("localhost");
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.mail(SENDER);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.addRecipient(RCPT1);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+           
+            
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+
+            Iterator<MailEnvelope> queued = hook.getQueued().iterator();
+            assertFalse(queued.hasNext());
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    
+    @Test
+    public void testHeloEnforcement() throws Exception {
+        TestMessageHook hook = new TestMessageHook();
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            SMTPConfigurationImpl config = new SMTPConfigurationImpl();
+            server = new NettyServer(new SMTPProtocol(new SMTPProtocolHandlerChain(hook), config));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+           
+            client.setSender(SENDER);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isNegativePermanent(client.getReplyCode()));
+
+         
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+
+            Iterator<MailEnvelope> queued = hook.getQueued().iterator();
+            assertFalse(queued.hasNext());
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    @Test
+    public void testHeloEnforcementDisabled() throws Exception {
+        TestMessageHook hook = new TestMessageHook();
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            SMTPConfigurationImpl config = new SMTPConfigurationImpl();
+            config.setHeloEhloEnforcement(false);
+            server = new NettyServer(new SMTPProtocol(new SMTPProtocolHandlerChain(hook), config));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+           
+            client.setSender(SENDER);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+         
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+
+            Iterator<MailEnvelope> queued = hook.getQueued().iterator();
+            assertFalse(queued.hasNext());
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    
+    @Test
+    public void testHeloHookPermanentError() throws Exception {
+        HeloHook hook = new HeloHook() {
+
+            public HookResult doHelo(SMTPSession session, String helo) {
+                return new HookResult(HookReturnCode.DENY);
+            }
+        };
+        
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            SMTPConfigurationImpl config = new SMTPConfigurationImpl();
+            server = new NettyServer(new SMTPProtocol(new SMTPProtocolHandlerChain(hook), config));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+           
+            client.helo("localhost");
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isNegativePermanent(client.getReplyCode()));
+
+         
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    
+    @Test
+    public void testHeloHookTempraryError() throws Exception {
+        HeloHook hook = new HeloHook() {
+
+            public HookResult doHelo(SMTPSession session, String helo) {
+                return new HookResult(HookReturnCode.DENYSOFT);
+            }
+        };
+        
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            SMTPConfigurationImpl config = new SMTPConfigurationImpl();
+            server = new NettyServer(new SMTPProtocol(new SMTPProtocolHandlerChain(hook), config));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+           
+            client.helo("localhost");
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isNegativeTransient(client.getReplyCode()));
+
+         
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    @Test
+    public void testMailHookPermanentError() throws Exception {
+        MailHook hook = new MailHook() {
+
+            public HookResult doMail(SMTPSession session, MailAddress sender) {
+                return new HookResult(HookReturnCode.DENY);
+            }
+        };
+        
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            SMTPConfigurationImpl config = new SMTPConfigurationImpl();
+            server = new NettyServer(new SMTPProtocol(new SMTPProtocolHandlerChain(hook), config));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+           
+            client.helo("localhost");
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.setSender(SENDER);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isNegativePermanent(client.getReplyCode()));
+
+         
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    @Test
+    public void testMailHookTemporaryError() throws Exception {
+        MailHook hook = new MailHook() {
+
+            public HookResult doMail(SMTPSession session, MailAddress sender) {
+                return new HookResult(HookReturnCode.DENYSOFT);
+            }
+        };
+        
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            SMTPConfigurationImpl config = new SMTPConfigurationImpl();
+            server = new NettyServer(new SMTPProtocol(new SMTPProtocolHandlerChain(hook), config));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+           
+            client.helo("localhost");
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.setSender(SENDER);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isNegativeTransient(client.getReplyCode()));
+
+         
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    
+    @Test
+    public void testRcptHookPermanentError() throws Exception {
+        RcptHook hook = new RcptHook() {
+
+            public HookResult doRcpt(SMTPSession session, MailAddress sender, MailAddress rcpt) {
+                if (RCPT1.equals(rcpt.toString())) {
+                    return new HookResult(HookReturnCode.DENY);
+                } else {
+                    return new HookResult(HookReturnCode.DECLINED);
+                }
+            }
+
+        };
+        
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            SMTPConfigurationImpl config = new SMTPConfigurationImpl();
+            server = new NettyServer(new SMTPProtocol(new SMTPProtocolHandlerChain(hook), config));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+           
+            client.helo("localhost");
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.setSender(SENDER);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.addRecipient(RCPT1);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isNegativePermanent(client.getReplyCode()));
+
+         
+            client.addRecipient(RCPT2);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    
+
+    @Test
+    public void testRcptHookTemporaryError() throws Exception {
+        RcptHook hook = new RcptHook() {
+
+            public HookResult doRcpt(SMTPSession session, MailAddress sender, MailAddress rcpt) {
+                if (RCPT1.equals(rcpt.toString())) {
+                    return new HookResult(HookReturnCode.DENYSOFT);
+                } else {
+                    return new HookResult(HookReturnCode.DECLINED);
+                }
+            }
+
+        };
+        
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            SMTPConfigurationImpl config = new SMTPConfigurationImpl();
+            server = new NettyServer(new SMTPProtocol(new SMTPProtocolHandlerChain(hook), config));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+           
+            client.helo("localhost");
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.setSender(SENDER);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.addRecipient(RCPT1);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isNegativeTransient(client.getReplyCode()));
+
+         
+            client.addRecipient(RCPT2);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    @Test
+    public void testMessageHookPermanentError() throws Exception {
+        TestMessageHook testHook = new TestMessageHook();
+
+        MessageHook hook = new MessageHook() {
+
+            @Override
+            public HookResult onMessage(SMTPSession session, MailEnvelope mail) {
+                return new HookResult(HookReturnCode.DENY);
+            }
+
+
+        };
+        
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            SMTPConfigurationImpl config = new SMTPConfigurationImpl();
+            server = new NettyServer(new SMTPProtocol(new SMTPProtocolHandlerChain(hook, testHook), config));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+           
+            client.helo("localhost");
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.setSender(SENDER);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+         
+            client.addRecipient(RCPT2);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            assertFalse(client.sendShortMessageData(MSG1));
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isNegativePermanent(client.getReplyCode()));
+            
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+
+            Iterator<MailEnvelope> queued = testHook.getQueued().iterator();
+            assertFalse(queued.hasNext());
+
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    
+    @Test
+    public void testMessageHookTemporaryError() throws Exception {
+        TestMessageHook testHook = new TestMessageHook();
+
+        MessageHook hook = new MessageHook() {
+
+            @Override
+            public HookResult onMessage(SMTPSession session, MailEnvelope mail) {
+                return new HookResult(HookReturnCode.DENYSOFT);
+            }
+
+
+        };
+        
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            SMTPConfigurationImpl config = new SMTPConfigurationImpl();
+            server = new NettyServer(new SMTPProtocol(new SMTPProtocolHandlerChain(hook, testHook), config));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+           
+            client.helo("localhost");
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            client.setSender(SENDER);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+         
+            client.addRecipient(RCPT2);
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+
+            assertFalse(client.sendShortMessageData(MSG1));
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isNegativeTransient(client.getReplyCode()));
+            
+            client.quit();
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            client.disconnect();
+
+            Iterator<MailEnvelope> queued = testHook.getQueued().iterator();
+            assertFalse(queued.hasNext());
+
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+  
+    
+    @Test
+    public void testConnectHandlerPermananet() throws Exception {
+        ConnectHandler<SMTPSession> connectHandler = new ConnectHandler<SMTPSession>() {
+
+            @Override
+            public Response onConnect(SMTPSession session) {
+                return new SMTPResponse("554", "Bye Bye");
+            }
+        };
+        
+        
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            SMTPConfigurationImpl config = new SMTPConfigurationImpl();
+            SMTPProtocolHandlerChain chain = new SMTPProtocolHandlerChain();
+            chain.add(0, connectHandler);
+            chain.wireExtensibleHandlers();
+            
+            server = new NettyServer(new SMTPProtocol(chain, config));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isNegativePermanent(client.getReplyCode()));
+            
+            client.disconnect();
+
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    
+    @Test
+    public void testConnectHandlerTemporary() throws Exception {
+        ConnectHandler<SMTPSession> connectHandler = new ConnectHandler<SMTPSession>() {
+
+            @Override
+            public Response onConnect(SMTPSession session) {
+                return new SMTPResponse("451", "Bye Bye");
+            }
+        };
+        
+        
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            SMTPConfigurationImpl config = new SMTPConfigurationImpl();
+            SMTPProtocolHandlerChain chain = new SMTPProtocolHandlerChain();
+            chain.add(0, connectHandler);
+            chain.wireExtensibleHandlers();
+            
+            server = new NettyServer(new SMTPProtocol(chain, config));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isNegativeTransient(client.getReplyCode()));
+            
+            client.disconnect();
+
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    @Test
+    public void testDisconnectHandler() throws Exception {
+        
+        final AtomicBoolean called = new AtomicBoolean(false);
+        DisconnectHandler<SMTPSession> handler = new DisconnectHandler<SMTPSession>() {
+
+            @Override
+            public void onDisconnect(SMTPSession session) {  
+                called.set(true);
+            }
+        };
+        
+        
+        InetSocketAddress address = new InetSocketAddress("127.0.0.1", TestUtils.getFreePort());
+        
+        NettyServer server = null;
+        try {
+            SMTPConfigurationImpl config = new SMTPConfigurationImpl();
+            SMTPProtocolHandlerChain chain = new SMTPProtocolHandlerChain();
+            chain.add(0, handler);
+            chain.wireExtensibleHandlers();
+            
+            server = new NettyServer(new SMTPProtocol(chain, config));
+            server.setListenAddresses(address);
+            server.bind();
+            
+            SMTPClient client = new SMTPClient();
+            client.connect(address.getAddress().getHostAddress(), address.getPort());
+            assertTrue("Reply="+ client.getReplyString(), SMTPReply.isPositiveCompletion(client.getReplyCode()));
+            
+            client.disconnect();
+            
+            Thread.sleep(1000);
+            assertTrue(called.get());
+
+
+        } finally {
+            if (server != null) {
+                server.unbind();
+            }
+        }
+        
+    }
+    
+    private static void checkEnvelope(MailEnvelope env, String sender, List<String> recipients, String msg) throws IOException {
+        assertEquals(sender, env.getSender().toString());
+
+        List<MailAddress> envRecipients = env.getRecipients();
+        assertEquals(recipients.size(), envRecipients.size());
+        for (int i = 0; i < recipients.size(); i++) {
+            MailAddress address = envRecipients.get(i);
+            assertEquals(recipients.get(i), address.toString());
+        }
+
+        BufferedReader reader = null;
+
+        try {
+            reader = new BufferedReader(new InputStreamReader(env.getMessageInputStream()));
+
+            String line = null;
+            boolean start = false;
+            StringBuilder sb = new StringBuilder();
+            while ((line = reader.readLine()) != null) {
+                if (line.startsWith("Subject")) {
+                    start = true;
+                }
+                if (start) {
+                    sb.append(line);
+                    sb.append("\r\n");
+                }
+            }
+            String msgQueued = sb.subSequence(0, sb.length() - 2).toString();
+
+            assertEquals(msg.length(), msgQueued.length());
+            for (int i = 0; i < msg.length(); i++) {
+                assertEquals(msg.charAt(i), msgQueued.charAt(i));
+            }
+        } finally {
+            if (reader != null) {
+                reader.close();
+            }
+        }
+
+    }
+    
+    private final class TestMessageHook implements MessageHook {
+
+        private final List<MailEnvelope> queued = new ArrayList<MailEnvelope>();
+        
+        public HookResult onMessage(SMTPSession session, MailEnvelope mail) {
+            queued.add(mail);
+            return new HookResult(HookReturnCode.OK);
+        }
+     
+        public List<MailEnvelope> getQueued() {
+            return queued;
+        }
+    }
+
+}

Propchange: james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/SMTPServerTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/TestUtils.java
URL: http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/TestUtils.java?rev=1222614&view=auto
==============================================================================
--- james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/TestUtils.java (added)
+++ james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/TestUtils.java Fri Dec 23 09:04:28 2011
@@ -0,0 +1,48 @@
+/****************************************************************
+ * 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.                                           *
+ ****************************************************************/
+package org.apache.james.protocols.smtp;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+
+public class TestUtils {
+
+    private final static int START_PORT = 20000;
+    private final static int END_PORT = 30000;
+    
+    /**
+     * Return a free port which can be used to bind to
+     * 
+     * @return port
+     */
+    public synchronized static int getFreePort() {
+        for(int start = START_PORT; start <= END_PORT; start++) {
+            try {
+                ServerSocket socket = new ServerSocket(start);
+                socket.setReuseAddress(true);
+                socket.close();
+                return start;
+            } catch (IOException e) {
+                // ignore 
+            }
+            
+        }
+        throw new RuntimeException("Unable to find a free port....");
+    }
+}

Propchange: james/protocols/trunk/smtp/src/test/java/org/apache/james/protocols/smtp/TestUtils.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain



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