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