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 2010/01/22 11:29:28 UTC

svn commit: r902049 [1/2] - in /james/server/trunk: imapserver-function/src/main/java/org/apache/james/imapserver/ mina-socket-library/src/main/java/org/apache/james/socket/mina/ pop3server-function/ pop3server-function/src/main/java/org/apache/james/p...

Author: norman
Date: Fri Jan 22 10:29:27 2010
New Revision: 902049

URL: http://svn.apache.org/viewvc?rev=902049&view=rev
Log:
Remove dependencies on cornerstone-sockets for pop3server,imapserver,smtpserver,remotemanager (JAMES-551)

Removed:
    james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/ImapHandler.java
    james/server/trunk/imapserver-function/src/main/java/org/apache/james/imapserver/ImapServerProtocolHandlerFactory.java
    james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/POP3Handler.java
    james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/POP3ServerMBeanImpl.java
    james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/POP3ServerProtocolServerHandlerFactory.java
    james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/package.html
    james/server/trunk/pop3server-function/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
    james/server/trunk/remotemanager-function/src/main/java/org/apache/james/remotemanager/RemoteManagerHandler.java
    james/server/trunk/remotemanager-function/src/main/java/org/apache/james/remotemanager/RemoteManagerMBeanImpl.java
    james/server/trunk/remotemanager-function/src/main/java/org/apache/james/remotemanager/RemoteManagerProtocolHandlerFactory.java
    james/server/trunk/remotemanager-function/src/main/java/org/apache/james/remotemanager/package.html
    james/server/trunk/remotemanager-function/src/test/java/org/apache/james/remotemanager/RemoteManagerTest.java
    james/server/trunk/smtpserver-function/src/main/java/org/apache/james/smtpserver/SMTPHandler.java
    james/server/trunk/smtpserver-function/src/main/java/org/apache/james/smtpserver/SMTPServerMBeanImpl.java
    james/server/trunk/smtpserver-function/src/main/java/org/apache/james/smtpserver/SMTPServerProtocolHandlerFactory.java
    james/server/trunk/smtpserver-function/src/main/java/org/apache/james/smtpserver/package.html
    james/server/trunk/smtpserver-function/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
Modified:
    james/server/trunk/mina-socket-library/src/main/java/org/apache/james/socket/mina/AbstractAsyncServer.java
    james/server/trunk/pop3server-function/pom.xml
    james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/ListCmdHandler.java
    james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/PassCmdHandler.java
    james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java
    james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java
    james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java
    james/server/trunk/pop3server-function/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java
    james/server/trunk/remotemanager-function/pom.xml
    james/server/trunk/remotemanager-function/src/test/java/org/apache/james/remotemanager/AsyncRemoteManagerTest.java
    james/server/trunk/smtpserver-function/pom.xml
    james/server/trunk/smtpserver-function/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java
    james/server/trunk/spring-deployment/src/main/config/james/spring-beans.xml

Modified: james/server/trunk/mina-socket-library/src/main/java/org/apache/james/socket/mina/AbstractAsyncServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/mina-socket-library/src/main/java/org/apache/james/socket/mina/AbstractAsyncServer.java?rev=902049&r1=902048&r2=902049&view=diff
==============================================================================
--- james/server/trunk/mina-socket-library/src/main/java/org/apache/james/socket/mina/AbstractAsyncServer.java (original)
+++ james/server/trunk/mina-socket-library/src/main/java/org/apache/james/socket/mina/AbstractAsyncServer.java Fri Jan 22 10:29:27 2010
@@ -285,8 +285,13 @@
         if (isEnabled()) {
             preInit();
             buildSSLContextFactory();
+            
+            // add connectionfilter in the first of the chain
+            DefaultIoFilterChainBuilder builder = createIoFilterChainBuilder();
+            builder.addFirst("connectionFilter", new ConnectionFilter(getLogger(), connectionLimit, connPerIP));
+
             SocketAcceptor acceptor = new NioSocketAcceptor();  
-            acceptor.setFilterChainBuilder(createIoFilterChainBuilder());
+            acceptor.setFilterChainBuilder(builder);
             acceptor.setBacklog(backlog);
             acceptor.setReuseAddress(true);
             acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, timeout );
@@ -468,7 +473,6 @@
         ProtocolCodecFilter codecFactory = new ProtocolCodecFilter(new TextLineCodecFactory(getProtocolCharset(), LineDelimiter.CRLF, LineDelimiter.CRLF));
         DefaultIoFilterChainBuilder builder = new DefaultIoFilterChainBuilder();
         builder.addLast("protocolCodecFactory", codecFactory);
-        builder.addLast("connectionFilter", new ConnectionFilter(getLogger(), connectionLimit, connPerIP));
         return builder;
     }
     

Modified: james/server/trunk/pop3server-function/pom.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server-function/pom.xml?rev=902049&r1=902048&r2=902049&view=diff
==============================================================================
--- james/server/trunk/pop3server-function/pom.xml (original)
+++ james/server/trunk/pop3server-function/pom.xml Fri Jan 22 10:29:27 2010
@@ -74,10 +74,7 @@
       <groupId>org.apache.james</groupId>
       <artifactId>james-server-core-library</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-avalon-socket-library</artifactId>
-    </dependency>
+
     <dependency>
       <groupId>org.apache.james</groupId>
       <artifactId>james-server-socket-shared-library</artifactId>
@@ -100,15 +97,7 @@
       <groupId>commons-collections</groupId>
       <artifactId>commons-collections</artifactId>
     </dependency>
-    
-    <dependency>
-      <groupId>org.apache.avalon.cornerstone.threads</groupId>
-      <artifactId>cornerstone-threads-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.avalon.cornerstone.sockets</groupId>
-      <artifactId>cornerstone-sockets-api</artifactId>
-    </dependency>
+
     <dependency>
       <groupId>org.apache.james</groupId>
       <artifactId>james-server-common-util</artifactId>

Modified: james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/ListCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/ListCmdHandler.java?rev=902049&r1=902048&r2=902049&view=diff
==============================================================================
--- james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/ListCmdHandler.java (original)
+++ james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/ListCmdHandler.java Fri Jan 22 10:29:27 2010
@@ -30,7 +30,6 @@
 import org.apache.james.api.protocol.CommandHandler;
 import org.apache.james.api.protocol.Request;
 import org.apache.james.api.protocol.Response;
-import org.apache.james.pop3server.POP3Handler;
 import org.apache.james.pop3server.POP3Response;
 import org.apache.james.pop3server.POP3Session;
 import org.apache.mailet.Mail;
@@ -54,7 +53,7 @@
         POP3Response response = null;
         String parameters = request.getArgument();
         
-        if (session.getHandlerState() == POP3Handler.TRANSACTION) {
+        if (session.getHandlerState() == POP3Session.TRANSACTION) {
             Mail dm = (Mail) session.getState().get(POP3Session.DELETED);
 
             if (parameters == null) {

Modified: james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/PassCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/PassCmdHandler.java?rev=902049&r1=902048&r2=902049&view=diff
==============================================================================
--- james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/PassCmdHandler.java (original)
+++ james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/PassCmdHandler.java Fri Jan 22 10:29:27 2010
@@ -27,7 +27,6 @@
 
 import javax.annotation.Resource;
 
-import org.apache.james.api.protocol.CommandHandler;
 import org.apache.james.api.protocol.Request;
 import org.apache.james.api.protocol.Response;
 import org.apache.james.api.user.UsersRepository;
@@ -40,7 +39,7 @@
 /**
   * Handles PASS command
   */
-public class PassCmdHandler implements CommandHandler<POP3Session> {
+public class PassCmdHandler extends RsetCmdHandler {
 
 	private final static String COMMAND_NAME ="PASS";
 	private UsersRepository users;
@@ -83,7 +82,7 @@
                         throw new IllegalStateException("MailServer returned a null inbox for "+session.getUser());
                     }
                     session.setUserInbox(inbox);
-                    RsetCmdHandler.stat(session);
+                    stat(session);
                     
                     // Store the ipAddress to use it later for pop before smtp 
                     POP3BeforeSMTPHelper.addIPAddress(session.getRemoteIPAddress());

Modified: james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java?rev=902049&r1=902048&r2=902049&view=diff
==============================================================================
--- james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java (original)
+++ james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java Fri Jan 22 10:29:27 2010
@@ -70,7 +70,7 @@
      *
      */
     @SuppressWarnings("unchecked")
-    public static void stat(POP3Session session) {
+    protected void stat(POP3Session session) {
         ArrayList<Mail> userMailbox = new ArrayList<Mail>();
         Mail dm = (Mail) session.getState().get(POP3Session.DELETED);
 

Modified: james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java?rev=902049&r1=902048&r2=902049&view=diff
==============================================================================
--- james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java (original)
+++ james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java Fri Jan 22 10:29:27 2010
@@ -31,7 +31,6 @@
 
 import org.apache.james.api.protocol.Request;
 import org.apache.james.api.protocol.Response;
-import org.apache.james.pop3server.POP3Handler;
 import org.apache.james.pop3server.POP3Response;
 import org.apache.james.pop3server.POP3Session;
 import org.apache.mailet.Mail;
@@ -70,7 +69,7 @@
             argument1 = parameters.substring(pos+1);
         }
 
-        if (session.getHandlerState() == POP3Handler.TRANSACTION) {
+        if (session.getHandlerState() == POP3Session.TRANSACTION) {
             int num = 0;
             int lines = 0;
             try {
@@ -133,7 +132,7 @@
      */
 	public List<String> getImplementedCapabilities(POP3Session session) {
 		List<String> caps = new ArrayList<String>();
-		if (session.getHandlerState() == POP3Handler.TRANSACTION) {
+		if (session.getHandlerState() == POP3Session.TRANSACTION) {
 			caps.add(COMMAND_NAME);
 			return caps;
 		}

Modified: james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java?rev=902049&r1=902048&r2=902049&view=diff
==============================================================================
--- james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java (original)
+++ james/server/trunk/pop3server-function/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java Fri Jan 22 10:29:27 2010
@@ -28,7 +28,6 @@
 import org.apache.james.api.protocol.CommandHandler;
 import org.apache.james.api.protocol.Request;
 import org.apache.james.api.protocol.Response;
-import org.apache.james.pop3server.POP3Handler;
 import org.apache.james.pop3server.POP3Response;
 import org.apache.james.pop3server.POP3Session;
 import org.apache.mailet.Mail;
@@ -47,7 +46,7 @@
     public Response onCommand(POP3Session session, Request request) {
         POP3Response response = null;
         String parameters = request.getArgument();
-        if (session.getHandlerState() == POP3Handler.TRANSACTION) {
+        if (session.getHandlerState() == POP3Session.TRANSACTION) {
             Mail dm = (Mail) session.getState().get(POP3Session.DELETED);
 
             if (parameters == null) {
@@ -114,7 +113,7 @@
      */
 	public List<String> getImplementedCapabilities(POP3Session session) {
 		List<String> caps = new ArrayList<String>();
-		if (session.getHandlerState() == POP3Handler.TRANSACTION) {
+		if (session.getHandlerState() == POP3Session.TRANSACTION) {
 			caps.add(COMMAND_NAME);
 			return caps;
 		}

Modified: james/server/trunk/pop3server-function/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server-function/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java?rev=902049&r1=902048&r2=902049&view=diff
==============================================================================
--- james/server/trunk/pop3server-function/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java (original)
+++ james/server/trunk/pop3server-function/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java Fri Jan 22 10:29:27 2010
@@ -19,10 +19,56 @@
 
 package org.apache.james.pop3server;
 
+import java.io.InputStream;
+import java.io.Reader;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.mail.MessagingException;
+import javax.mail.util.SharedByteArrayInputStream;
+
+import junit.framework.TestCase;
+
+import org.apache.avalon.framework.container.ContainerUtil;
 import org.apache.commons.logging.impl.SimpleLog;
+import org.apache.commons.net.pop3.POP3Client;
+import org.apache.commons.net.pop3.POP3MessageInfo;
+import org.apache.commons.net.pop3.POP3Reply;
+import org.apache.james.api.dnsservice.AbstractDNSServer;
+import org.apache.james.api.dnsservice.DNSService;
+import org.apache.james.api.kernel.mock.FakeLoader;
+import org.apache.james.api.user.UsersRepository;
+import org.apache.james.core.MailImpl;
 import org.apache.james.pop3server.mina.AsyncPOP3Server;
+import org.apache.james.services.MailRepository;
+import org.apache.james.services.MailServer;
+import org.apache.james.test.mock.james.InMemorySpoolRepository;
+import org.apache.james.test.mock.james.MockFileSystem;
+import org.apache.james.test.mock.james.MockMailServer;
+import org.apache.james.test.util.Util;
+import org.apache.james.userrepository.MockUsersRepository;
+import org.apache.james.util.POP3BeforeSMTPHelper;
+import org.apache.mailet.MailAddress;
+
+public class AsyncPOP3ServerTest extends TestCase {
 
-public class AsyncPOP3ServerTest extends POP3ServerTest {
+    private int m_pop3ListenerPort = Util.getNonPrivilegedPort();
+    private MockMailServer m_mailServer;
+    private POP3TestConfiguration m_testConfiguration;
+    private MockUsersRepository m_usersRepository = new MockUsersRepository();
+    private POP3Client m_pop3Protocol = null;
+    private MailImpl testMail1;
+    private MailImpl testMail2;
+    private FakeLoader serviceManager;
+    private DNSService dnsservice;
+    private MockFileSystem fSystem;
+    
+    public AsyncPOP3ServerTest() {
+        super("AsyncPOP3ServerTest");
+    }
 
     private AsyncPOP3Server m_pop3Server;
 
@@ -46,10 +92,468 @@
         m_pop3Server.init();
     }
 
+    
+    protected void setUpServiceManager() throws Exception {
+        serviceManager = new FakeLoader();
+
+        m_mailServer = new MockMailServer(m_usersRepository);
+        serviceManager.put(MailServer.ROLE, m_mailServer);
+        serviceManager.put(UsersRepository.ROLE,
+                m_usersRepository);
+       
+        dnsservice = setUpDNSServer();
+        serviceManager.put(DNSService.ROLE, setUpDNSServer());
+        fSystem = new MockFileSystem();
+        serviceManager.put(MockFileSystem.ROLE,fSystem);
+      
+    }
+
+    private DNSService setUpDNSServer() {
+        DNSService dns = new AbstractDNSServer() {
+            public String getHostName(InetAddress addr) {
+                return "localhost";
+            }
+            
+            public InetAddress getLocalHost() throws UnknownHostException {
+                return InetAddress.getLocalHost();
+            }            
+        
+        };
+        return dns;
+    }
+    protected void tearDown() throws Exception {
+        if (m_pop3Protocol != null) {
+            m_pop3Protocol.sendCommand("quit");
+            m_pop3Protocol.disconnect();
+        }
+        ContainerUtil.dispose(m_mailServer);
+        if (testMail1 != null) testMail1.dispose();
+        if (testMail2 != null) testMail2.dispose();
+        super.tearDown();
+    }
+
+    public void testAuthenticationFail() throws Exception {
+        finishSetUp(m_testConfiguration);
+        
+        m_pop3Protocol = new POP3Client();
+        m_pop3Protocol.connect("127.0.0.1", m_pop3ListenerPort);
+
+        m_usersRepository.addUser("known", "test2");
+
+        m_pop3Protocol.login("known", "test");
+        assertEquals(0, m_pop3Protocol.getState());
+        assertTrue(m_pop3Protocol.getReplyString().startsWith("-ERR"));
+    }
+
+    public void testUnknownUser() throws Exception {
+        finishSetUp(m_testConfiguration);
+
+        m_pop3Protocol = new POP3Client();
+        m_pop3Protocol.connect("127.0.0.1", m_pop3ListenerPort);
+
+        m_pop3Protocol.login("unknown", "test");
+        assertEquals(0, m_pop3Protocol.getState());
+        assertTrue(m_pop3Protocol.getReplyString().startsWith("-ERR"));
+    }
+
+    public void testKnownUserEmptyInbox() throws Exception {
+        finishSetUp(m_testConfiguration);
+
+        m_pop3Protocol = new POP3Client();
+        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
+
+        m_usersRepository.addUser("foo", "bar");
+        InMemorySpoolRepository mockMailRepository = new InMemorySpoolRepository();
+        m_mailServer.setUserInbox("foo", mockMailRepository);
+
+        // not authenticated
+        POP3MessageInfo[] entries = m_pop3Protocol.listMessages();
+        assertNull(entries);
+
+        m_pop3Protocol.login("foo", "bar");
+        System.err.println(m_pop3Protocol.getState());
+        assertEquals(1, m_pop3Protocol.getState());
+
+        entries = m_pop3Protocol.listMessages();
+        assertEquals(1, m_pop3Protocol.getState());
+
+        assertNotNull(entries);
+        assertEquals(entries.length, 0);
+        
+        POP3MessageInfo p3i = m_pop3Protocol.listMessage(1);
+        assertEquals(1, m_pop3Protocol.getState());
+        assertNull(p3i);
+
+        ContainerUtil.dispose(mockMailRepository);
+    }
+
+    // TODO: This currently fails with Async implementation because
+    //       it use Charset US-ASCII to decode / Encode the protocol
+    //       from the RFC I'm currently not understand if NON-ASCII chars
+    //       are allowed at all. So this needs to be checked
+    /*
     public void testNotAsciiCharsInPassword() throws Exception {
-        // TODO: This currently fails with Async implementation because
-        //       it use Charset US-ASCII to decode / Encode the protocol
-        //       from the RFC I'm currently not understand if NON-ASCII chars
-        //       are allowed at all. So this needs to be checked
+        finishSetUp(m_testConfiguration);
+
+        m_pop3Protocol = new POP3Client();
+        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
+
+        String pass = "bar" + (new String(new char[] { 200, 210 })) + "foo";
+        m_usersRepository.addUser("foo", pass);
+        InMemorySpoolRepository mockMailRepository = new InMemorySpoolRepository();
+        m_mailServer.setUserInbox("foo", mockMailRepository);
+
+        m_pop3Protocol.login("foo", pass);
+        assertEquals(1, m_pop3Protocol.getState());
+        ContainerUtil.dispose(mockMailRepository);
+    }
+    */
+
+
+    public void testUnknownCommand() throws Exception {
+        finishSetUp(m_testConfiguration);
+
+        m_pop3Protocol = new POP3Client();
+        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
+        
+        m_pop3Protocol.sendCommand("unkn");
+        assertEquals(0, m_pop3Protocol.getState());
+        assertEquals("Expected -ERR as result for an unknown command", m_pop3Protocol.getReplyString().substring(0,4),"-ERR");
+    }
+
+    public void testUidlCommand() throws Exception {
+        finishSetUp(m_testConfiguration);
+
+        m_usersRepository.addUser("foo", "bar");
+        InMemorySpoolRepository mockMailRepository = new InMemorySpoolRepository();
+        m_mailServer.setUserInbox("foo", mockMailRepository);
+
+        m_pop3Protocol = new POP3Client();
+        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
+
+        m_pop3Protocol.sendCommand("uidl");
+        assertEquals(0, m_pop3Protocol.getState());
+
+        m_pop3Protocol.login("foo", "bar");
+
+        POP3MessageInfo[] list = m_pop3Protocol.listUniqueIdentifiers();
+        assertEquals("Found unexpected messages", 0, list.length);
+
+        m_pop3Protocol.disconnect();
+        
+        setupTestMails(mockMailRepository);
+        
+        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
+        m_pop3Protocol.login("foo", "bar");
+
+        list = m_pop3Protocol.listUniqueIdentifiers();
+        assertEquals("Expected 2 messages, found: "+list.length, 2, list.length);
+        assertEquals("name", list[0].identifier);
+        assertEquals("name2", list[1].identifier);
+        
+        POP3MessageInfo p3i = m_pop3Protocol.listUniqueIdentifier(1);
+        assertNotNull(p3i);
+        assertEquals("name", p3i.identifier);
+
+    }
+
+    public void testMiscCommandsWithWithoutAuth() throws Exception {
+        finishSetUp(m_testConfiguration);
+
+        m_usersRepository.addUser("foo", "bar");
+        InMemorySpoolRepository mockMailRepository = new InMemorySpoolRepository();
+        m_mailServer.setUserInbox("foo", mockMailRepository);
+
+        m_pop3Protocol = new POP3Client();
+        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
+
+        m_pop3Protocol.sendCommand("noop");
+        assertEquals(0, m_pop3Protocol.getState());
+        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
+
+        m_pop3Protocol.sendCommand("stat");
+        assertEquals(0, m_pop3Protocol.getState());
+        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
+
+        m_pop3Protocol.sendCommand("pass");
+        assertEquals(0, m_pop3Protocol.getState());
+        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
+
+        m_pop3Protocol.sendCommand("auth");
+        assertEquals(0, m_pop3Protocol.getState());
+        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
+
+        m_pop3Protocol.sendCommand("rset");
+        assertEquals(0, m_pop3Protocol.getState());
+        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
+        
+        m_pop3Protocol.login("foo", "bar");
+
+        POP3MessageInfo[] list = m_pop3Protocol.listUniqueIdentifiers();
+        assertEquals("Found unexpected messages", 0, list.length);
+
+        m_pop3Protocol.sendCommand("noop");
+        assertEquals(1, m_pop3Protocol.getState());
+
+        m_pop3Protocol.sendCommand("pass");
+        assertEquals(1, m_pop3Protocol.getState());
+        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
+
+        m_pop3Protocol.sendCommand("auth");
+        assertEquals(1, m_pop3Protocol.getState());
+        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
+
+        m_pop3Protocol.sendCommand("user");
+        assertEquals(1, m_pop3Protocol.getState());
+        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
+
+        m_pop3Protocol.sendCommand("rset");
+        assertEquals(1, m_pop3Protocol.getState());
+        
+    }
+
+    public void testKnownUserInboxWithMessages() throws Exception {
+        finishSetUp(m_testConfiguration);
+
+        m_pop3Protocol = new POP3Client();
+        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
+
+        m_usersRepository.addUser("foo2", "bar2");
+        InMemorySpoolRepository mailRep = new InMemorySpoolRepository();
+
+        setupTestMails(mailRep);
+
+        m_mailServer.setUserInbox("foo2", mailRep);
+        
+        m_pop3Protocol.sendCommand("retr","1");
+        assertEquals(0, m_pop3Protocol.getState());
+        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
+
+        m_pop3Protocol.login("foo2", "bar2");
+        assertEquals(1, m_pop3Protocol.getState());
+
+        POP3MessageInfo[] entries = m_pop3Protocol.listMessages();
+
+        assertNotNull(entries);
+        assertEquals(2, entries.length);
+        assertEquals(1, m_pop3Protocol.getState());
+
+        Reader r = m_pop3Protocol.retrieveMessageTop(entries[0].number, 0);
+
+        assertNotNull(r);
+
+        r.close();
+
+        Reader r2 = m_pop3Protocol.retrieveMessage(entries[0].number);
+        assertNotNull(r2);
+        r2.close();
+
+        // existing message
+        boolean deleted = m_pop3Protocol.deleteMessage(entries[0].number);
+        assertTrue(deleted);
+
+        // already deleted message
+        deleted = m_pop3Protocol.deleteMessage(entries[0].number);
+        
+        // TODO: Understand why this fails...
+        //assertFalse(deleted);
+
+        // unexisting message
+        deleted = m_pop3Protocol.deleteMessage(10);
+        assertFalse(deleted);
+
+        m_pop3Protocol.sendCommand("quit");
+        m_pop3Protocol.disconnect();
+
+        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
+
+        m_pop3Protocol.login("foo2", "bar2");
+        assertEquals(1, m_pop3Protocol.getState());
+
+        entries = null;
+
+        POP3MessageInfo stats = m_pop3Protocol.status();
+        assertEquals(1, stats.number);
+        assertEquals(5, stats.size);
+
+        entries = m_pop3Protocol.listMessages();
+
+        assertNotNull(entries);
+        assertEquals(1, entries.length);
+        assertEquals(1, m_pop3Protocol.getState());
+
+        // top without arguments
+        m_pop3Protocol.sendCommand("top");
+        assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
+        
+        Reader r3 = m_pop3Protocol.retrieveMessageTop(entries[0].number, 0);
+        assertNotNull(r3);
+        r3.close();
+        ContainerUtil.dispose(mailRep);
+    }
+
+    private void setupTestMails(MailRepository mailRep) throws MessagingException {
+        ArrayList<MailAddress> recipients = new ArrayList<MailAddress>();
+        recipients.add(new MailAddress("recipient@test.com"));
+        InputStream mw = new SharedByteArrayInputStream(
+                                ("Return-path: return@test.com\r\n"+
+                                 "Content-Transfer-Encoding: plain\r\n"+
+                                 "Subject: test\r\n\r\n"+
+                                 "Body Text POP3ServerTest.setupTestMails\r\n").getBytes());
+        testMail1 = new MailImpl("name", new MailAddress("from@test.com"),
+                        recipients, mw);
+        mailRep.store(testMail1);
+        InputStream mw2 = new SharedByteArrayInputStream(
+                                ("EMPTY").getBytes());
+        testMail2 = new MailImpl("name2", new MailAddress("from@test.com"),
+                                recipients, mw2);
+        mailRep.store(testMail2);
+    }
+
+    /*
+    public void testTwoSimultaneousMails() throws Exception {
+        finishSetUp(m_testConfiguration);
+
+        // make two user/repositories, open both
+        m_usersRepository.addUser("foo1", "bar1");
+        InMemorySpoolRepository mailRep1 = new InMemorySpoolRepository();
+        setupTestMails(mailRep1);
+        m_mailServer.setUserInbox("foo1", mailRep1);
+
+        m_usersRepository.addUser("foo2", "bar2");
+        InMemorySpoolRepository mailRep2 = new InMemorySpoolRepository();
+        //do not setupTestMails, this is done later
+        m_mailServer.setUserInbox("foo2", mailRep2);
+
+        POP3Client pop3Protocol2 = null;
+        try {
+            // open two connections
+            m_pop3Protocol = new POP3Client();
+            m_pop3Protocol.connect("127.0.0.1", m_pop3ListenerPort);
+            pop3Protocol2 = new POP3Client();
+            pop3Protocol2.connect("127.0.0.1", m_pop3ListenerPort);
+
+            assertEquals("first connection taken", 0, m_pop3Protocol.getState());
+            assertEquals("second connection taken", 0, pop3Protocol2.getState());
+
+            // open two accounts
+            m_pop3Protocol.login("foo1", "bar1");
+
+            pop3Protocol2.login("foo2", "bar2");
+
+            POP3MessageInfo[] entries = m_pop3Protocol.listMessages();
+            assertEquals("foo1 has mails", 2, entries.length);
+
+            entries = pop3Protocol2.listMessages();
+            assertEquals("foo2 has no mails", 0, entries.length);
+
+        } finally {
+            // put both to rest, field var is handled by tearDown()
+            if (pop3Protocol2 != null) {
+                pop3Protocol2.sendCommand("quit");
+                pop3Protocol2.disconnect();
+            }
+        }
+    }
+    */
+    public void testIpStored() throws Exception {
+        finishSetUp(m_testConfiguration);
+
+        m_pop3Protocol = new POP3Client();
+        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
+
+        String pass = "password";
+        m_usersRepository.addUser("foo", pass);
+        InMemorySpoolRepository mockMailRepository = new InMemorySpoolRepository();
+        m_mailServer.setUserInbox("foo", mockMailRepository);
+
+        m_pop3Protocol.login("foo", pass);
+        assertEquals(1, m_pop3Protocol.getState());
+        assertTrue(POP3BeforeSMTPHelper.isAuthorized("127.0.0.1"));
+        ContainerUtil.dispose(mockMailRepository);
+    }
+    
+    public void testCapa() throws Exception {
+         finishSetUp(m_testConfiguration);
+
+         m_pop3Protocol = new POP3Client();
+         m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
+
+         String pass = "password";
+         m_usersRepository.addUser("foo", pass);
+         InMemorySpoolRepository mockMailRepository = new InMemorySpoolRepository();
+         m_mailServer.setUserInbox("foo", mockMailRepository);
+
+         assertEquals(POP3Reply.OK, m_pop3Protocol.sendCommand("CAPA"));
+         
+         m_pop3Protocol.getAdditionalReply();
+         m_pop3Protocol.getReplyString();
+         List<String> replies = Arrays.asList(m_pop3Protocol.getReplyStrings());
+         
+         assertTrue("contains USER", replies.contains("USER"));
+         
+         m_pop3Protocol.login("foo", pass);
+         assertEquals(POP3Reply.OK, m_pop3Protocol.sendCommand("CAPA"));
+         
+         m_pop3Protocol.getAdditionalReply();
+         m_pop3Protocol.getReplyString();
+         replies = Arrays.asList(m_pop3Protocol.getReplyStrings());
+         assertTrue("contains USER", replies.contains("USER"));
+         assertTrue("contains UIDL", replies.contains("UIDL"));
+         assertTrue("contains TOP", replies.contains("TOP"));
+
+         ContainerUtil.dispose(mockMailRepository);
+
+    }
+    
+
+    /*
+     * See JAMES-649
+     * The same happens when using RETR
+     *     
+     * Comment to not broke the builds!
+     *
+    public void testOOMTop() throws Exception {
+        finishSetUp(m_testConfiguration);
+
+        int messageCount = 30000;
+        m_pop3Protocol = new POP3Client();
+        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
+
+        m_usersRepository.addUser("foo", "bar");
+        InMemorySpoolRepository mockMailRepository = new InMemorySpoolRepository();
+        
+        Mail m = new MailImpl();
+        m.setMessage(Util.createMimeMessage("X-TEST", "test"));
+        for (int i = 1; i < messageCount+1; i++ ) {
+            m.setName("test" + i);
+            mockMailRepository.store(m);
+        }
+
+        m_mailServer.setUserInbox("foo", mockMailRepository);
+
+        // not authenticated
+        POP3MessageInfo[] entries = m_pop3Protocol.listMessages();
+        assertNull(entries);
+
+        m_pop3Protocol.login("foo", "bar");
+        System.err.println(m_pop3Protocol.getState());
+        assertEquals(1, m_pop3Protocol.getState());
+
+        entries = m_pop3Protocol.listMessages();
+        assertEquals(1, m_pop3Protocol.getState());
+
+        assertNotNull(entries);
+        assertEquals(entries.length, messageCount);
+        
+        for (int i = 1; i < messageCount+1; i++ ) {
+            Reader r = m_pop3Protocol.retrieveMessageTop(i, 100);
+            assertNotNull(r);
+            r.close();
+        }
+        
+        ContainerUtil.dispose(mockMailRepository);
     }
+    */
+    
 }

Modified: james/server/trunk/remotemanager-function/pom.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/remotemanager-function/pom.xml?rev=902049&r1=902048&r2=902049&view=diff
==============================================================================
--- james/server/trunk/remotemanager-function/pom.xml (original)
+++ james/server/trunk/remotemanager-function/pom.xml Fri Jan 22 10:29:27 2010
@@ -57,10 +57,7 @@
       <groupId>org.apache.james</groupId>
       <artifactId>james-server-user-api</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
-      <artifactId>james-server-avalon-socket-library</artifactId>
-    </dependency>
+
     <dependency>
       <groupId>org.apache.james</groupId>
       <artifactId>james-server-socket-shared-library</artifactId>
@@ -79,14 +76,6 @@
     </dependency>
 
     <dependency>
-      <groupId>org.apache.avalon.cornerstone.threads</groupId>
-      <artifactId>cornerstone-threads-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.avalon.cornerstone.sockets</groupId>
-      <artifactId>cornerstone-sockets-api</artifactId>
-    </dependency>
-    <dependency>
       <groupId>commons-configuration</groupId>
       <artifactId>commons-configuration</artifactId>
     </dependency>
@@ -149,10 +138,5 @@
       <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>commons-jxpath</groupId>
-      <artifactId>commons-jxpath</artifactId>
-      <scope>runtime</scope>
-    </dependency> 
   </dependencies>
 </project>
\ No newline at end of file

Modified: james/server/trunk/remotemanager-function/src/test/java/org/apache/james/remotemanager/AsyncRemoteManagerTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/remotemanager-function/src/test/java/org/apache/james/remotemanager/AsyncRemoteManagerTest.java?rev=902049&r1=902048&r2=902049&view=diff
==============================================================================
--- james/server/trunk/remotemanager-function/src/test/java/org/apache/james/remotemanager/AsyncRemoteManagerTest.java (original)
+++ james/server/trunk/remotemanager-function/src/test/java/org/apache/james/remotemanager/AsyncRemoteManagerTest.java Fri Jan 22 10:29:27 2010
@@ -19,32 +19,861 @@
 
 package org.apache.james.remotemanager;
 
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.mail.MessagingException;
+
+import junit.framework.TestCase;
+
+import org.apache.avalon.framework.container.ContainerUtil;
 import org.apache.commons.logging.impl.SimpleLog;
+import org.apache.commons.net.telnet.TelnetClient;
+import org.apache.james.api.dnsservice.AbstractDNSServer;
+import org.apache.james.api.dnsservice.DNSService;
+import org.apache.james.api.domainlist.ManageableDomainList;
+import org.apache.james.api.domainlist.SimpleDomainList;
+import org.apache.james.api.kernel.mock.FakeLoader;
+import org.apache.james.api.user.UsersRepository;
+import org.apache.james.api.user.UsersStore;
+import org.apache.james.api.vut.management.MockVirtualUserTableManagementService;
+import org.apache.james.api.vut.management.VirtualUserTableManagementService;
+import org.apache.james.management.BayesianAnalyzerManagementException;
+import org.apache.james.management.BayesianAnalyzerManagementService;
+import org.apache.james.management.DomainListManagementException;
+import org.apache.james.management.DomainListManagementService;
+import org.apache.james.management.ProcessorManagementService;
+import org.apache.james.management.SpoolFilter;
+import org.apache.james.management.SpoolManagementException;
+import org.apache.james.management.SpoolManagementService;
 import org.apache.james.remotemanager.mina.AsyncRemoteManager;
+import org.apache.james.services.MailServer;
+import org.apache.james.test.mock.avalon.MockStore;
+import org.apache.james.test.mock.james.MockFileSystem;
+import org.apache.james.test.mock.james.MockMailServer;
+import org.apache.james.test.mock.james.MockUsersStore;
+import org.apache.james.test.util.Util;
+import org.apache.james.userrepository.MockUsersRepository;
+import org.apache.james.util.InternetPrintWriter;
+
+public class AsyncRemoteManagerTest extends TestCase {
+    private int m_remoteManagerListenerPort = Util.getNonPrivilegedPort();
+	private RemoteManagerTestConfiguration m_testConfiguration;
+	private String m_host = "127.0.0.1";
+	private BufferedReader m_reader;
+	private InternetPrintWriter m_writer;
+	private TelnetClient m_telnetClient;
+	private MockUsersRepository m_mockUsersRepository;
+	private MockMailServer mailServer;
+	private FakeLoader serviceManager;
+	private MockUsersStore usersStore;
+	private DNSService dnsservice;
+	private MockFileSystem filesystem;
+	private MockVirtualUserTableManagementService vutManagement;
+	private AsyncRemoteManager remotemanager;
+
+	protected void setUp() throws Exception {
+		setUpFakeLoader();
+
+		remotemanager = new AsyncRemoteManager();
+		remotemanager.setDNSService(dnsservice);
+		remotemanager.setFileSystem(filesystem);
+		remotemanager.setLoader(serviceManager);
+		SimpleLog log = new SimpleLog("Mock");
+		log.setLevel(SimpleLog.LOG_LEVEL_DEBUG);
+		remotemanager.setLog(log);
+		remotemanager.setMailServer(mailServer);
+		m_testConfiguration = new RemoteManagerTestConfiguration(
+				m_remoteManagerListenerPort);
+	}
+
+	protected void tearDown() throws Exception {
+		ContainerUtil.dispose(mailServer);
+		super.tearDown();
+	}
+
+	protected void finishSetUp(RemoteManagerTestConfiguration testConfiguration)
+			throws Exception {
+		testConfiguration.init();
+		remotemanager.configure(testConfiguration);
+		remotemanager.init();
+	}
+
+	protected void login() throws IOException {
+		login(m_testConfiguration.getLoginName(), m_testConfiguration
+				.getLoginPassword());
+	}
+
+	protected void login(String name, String password) throws IOException {
+		sendCommand(name);
+		List answers = readAnswer();
+		String last = getLastLine(answers);
+		assertTrue("Last line does not start with Password: " + last, last
+				.startsWith("Password:"));
+		sendCommand(password);
+		answers = readAnswer();
+		last = getLastLine(answers);
+		assertTrue("Last line does not start with Welcome: " + last, last
+				.startsWith("Welcome"));
+	}
+
+	protected String getLastLine(List list) {
+		if (list == null || list.isEmpty())
+			return null;
+		return (String) list.get(list.size() - 1);
+	}
+
+	protected List readAnswer() {
+		return readAnswer(1);
+	}
+
+	protected List readAnswer(int numLines) {
+		List allAnswerLines = new ArrayList();
+		try {
+			if (numLines > 0) {
+				for (int i = 0; i < numLines; i++) {
+					allAnswerLines.add(m_reader.readLine());
+				}
+			} else {
+				String line = m_reader.readLine();
+				allAnswerLines.add(line);
+
+				while (m_reader.ready()) {
+					allAnswerLines.add(m_reader.readLine());
+				}
+			}
+			return allAnswerLines;
+		} catch (IOException e) {
+			return null;
+		}
+	}
+
+	protected void sendCommand(String command) throws IOException {
+		m_writer.println(command);
+		m_writer.flush();
+	}
+
+	protected void connect() throws IOException {
+		m_telnetClient = new TelnetClient();
+		m_telnetClient.connect(m_host, m_remoteManagerListenerPort);
+
+		m_reader = new BufferedReader(new InputStreamReader(
+				new BufferedInputStream(m_telnetClient.getInputStream(), 1024),
+				"ASCII"));
+		m_writer = new InternetPrintWriter(new BufferedOutputStream(
+				m_telnetClient.getOutputStream(), 1024), true);
+
+		readAnswer(3);
+	}
+
+	protected void setUpFakeLoader() throws Exception {
+		serviceManager = new FakeLoader();
+
+		m_mockUsersRepository = new MockUsersRepository();
+
+		mailServer = new MockMailServer(m_mockUsersRepository);
+		usersStore = new MockUsersStore(m_mockUsersRepository);
+
+		serviceManager.put(MailServer.ROLE, mailServer);
+		serviceManager.put(UsersRepository.ROLE, m_mockUsersRepository);
+
+		filesystem = new MockFileSystem();
+		serviceManager.put(MockFileSystem.ROLE, filesystem);
+
+		serviceManager.put(UsersStore.ROLE, usersStore);
+
+		dnsservice = setUpDNSServer();
+		serviceManager.put(DNSService.ROLE, dnsservice);
+		vutManagement = new MockVirtualUserTableManagementService();
+		// VirtualUserTableManagementService vutManagement = new
+		// VirtualUserTableManagement();
+		// vutManagement.setVirtualUserTableStore(vutStore);
+		// vutManagement.setVirtualUserTableManagement(new
+		// MockVirtualUserTableManagementImpl());
+		serviceManager.put(VirtualUserTableManagementService.ROLE,
+				new MockVirtualUserTableManagementService());
+
+		ManageableDomainList xml = new SimpleDomainList();
+
+		DomainListManagementService domManagement = new DomainListManagementService() {
+
+			private ManageableDomainList domainList;
+
+			public boolean addDomain(String domain)
+					throws DomainListManagementException {
+				return domainList.addDomain(domain);
+			}
+
+			public DomainListManagementService setDomainList(
+					ManageableDomainList xml) {
+				this.domainList = xml;
+				return this;
+			}
+
+			public boolean containsDomain(String domain) {
+				return domainList.containsDomain(domain);
+			}
+
+			public List getDomains() {
+				return domainList.getDomains();
+			}
+
+			public boolean removeDomain(String domain)
+					throws DomainListManagementException {
+				return domainList.removeDomain(domain);
+			}
+
+		}.setDomainList(xml);
+
+		serviceManager.put(DomainListManagementService.ROLE, domManagement);
+		serviceManager.put(BayesianAnalyzerManagementService.ROLE,
+				new BayesianAnalyzerManagementService() {
+
+					public void resetData()
+							throws BayesianAnalyzerManagementException {
+						// TODO Auto-generated method stub
+
+					}
+
+					public void importData(String file)
+							throws BayesianAnalyzerManagementException {
+						// TODO Auto-generated method stub
+
+					}
+
+					public void exportData(String file)
+							throws BayesianAnalyzerManagementException {
+						// TODO Auto-generated method stub
+
+					}
+
+					public int addSpamFromMbox(String file)
+							throws BayesianAnalyzerManagementException {
+						// TODO Auto-generated method stub
+						return 0;
+					}
+
+					public int addSpamFromDir(String dir)
+							throws BayesianAnalyzerManagementException {
+						// TODO Auto-generated method stub
+						return 0;
+					}
+
+					public int addHamFromMbox(String file)
+							throws BayesianAnalyzerManagementException {
+						// TODO Auto-generated method stub
+						return 0;
+					}
+
+					public int addHamFromDir(String dir)
+							throws BayesianAnalyzerManagementException {
+						// TODO Auto-generated method stub
+						return 0;
+					}
+				});
+
+		serviceManager.put(SpoolManagementService.ROLE,
+				new SpoolManagementService() {
+
+					public int resendSpoolItems(String spoolRepositoryURL,
+							String key, List lockingFailures, SpoolFilter filter)
+							throws MessagingException, SpoolManagementException {
+						// TODO Auto-generated method stub
+						return 0;
+					}
+
+					public int removeSpoolItems(String spoolRepositoryURL,
+							String key, List lockingFailures, SpoolFilter filter)
+							throws MessagingException, SpoolManagementException {
+						// TODO Auto-generated method stub
+						return 0;
+					}
+
+					public int moveSpoolItems(String srcSpoolRepositoryURL,
+							String dstSpoolRepositoryURL, String dstState,
+							SpoolFilter filter) throws MessagingException,
+							SpoolManagementException {
+						// TODO Auto-generated method stub
+						return 0;
+					}
+
+					public List getSpoolItems(String spoolRepositoryURL,
+							SpoolFilter filter) throws MessagingException,
+							SpoolManagementException {
+						// TODO Auto-generated method stub
+						return null;
+					}
+				});
+		serviceManager.put(MockStore.ROLE, new MockStore());
+		serviceManager.put(ProcessorManagementService.ROLE,
+				new ProcessorManagementService() {
+
+					public String[] getProcessorNames() {
+						// TODO Auto-generated method stub
+						return null;
+					}
+
+					public String[] getMatcherParameters(String processorName,
+							int matcherIndex) {
+						// TODO Auto-generated method stub
+						return null;
+					}
+
+					public String[] getMatcherNames(String processorName) {
+						// TODO Auto-generated method stub
+						return null;
+					}
+
+					public String[] getMailetParameters(String processorName,
+							int mailetIndex) {
+						// TODO Auto-generated method stub
+						return null;
+					}
+
+					public String[] getMailetNames(String processorName) {
+						// TODO Auto-generated method stub
+						return null;
+					}
+				});
+	}
+
+	private DNSService setUpDNSServer() {
+		DNSService dns = new AbstractDNSServer() {
+			public String getHostName(InetAddress addr) {
+				return "localhost";
+			}
+
+			public InetAddress getLocalHost() throws UnknownHostException {
+				return InetAddress.getLocalHost();
+			}
+
+			public InetAddress[] getAllByName(String name)
+					throws UnknownHostException {
+				return new InetAddress[] { InetAddress.getLocalHost() };
+			}
+		};
+
+		return dns;
+	}
+
+	/*
+	 * public void testCustomCommand() throws Exception {
+	 * finishSetUp(m_testConfiguration); connect(); login();
+	 * 
+	 * sendCommand("echo hsif eht lla rof sknaht"); String lastLine =
+	 * getLastLine(readAnswer()); assertEquals("Arguments echoed",
+	 * "hsif eht lla rof sknaht", lastLine); }
+	 */
+	public void testLogin() throws Exception {
+		finishSetUp(m_testConfiguration);
+		connect();
+
+		login();
+	}
+
+	public void testWrongLoginUser() throws Exception {
+		finishSetUp(m_testConfiguration);
+		connect();
+
+		sendCommand("sindbad");
+		List answers = readAnswer();
+		sendCommand(m_testConfiguration.getLoginPassword());
+
+		// we should receive the fail message and a new Login id.
+		answers = readAnswer(2);
+		String last = getLastLine(answers);
+		assertTrue("Last line does not start with 'Login id:' but with '"
+				+ last + "'", last.startsWith("Login id:")); // login failed,
+																// getting new
+																// login prompt
+	}
+
+	public void testWrongLoginPassword() throws Exception {
+		finishSetUp(m_testConfiguration);
+		connect();
+
+		sendCommand(m_testConfiguration.getLoginName());
+		List answers = readAnswer();
+		sendCommand("getmethru");
+
+		answers = readAnswer(2);
+		String last = getLastLine(answers);
+		assertTrue("Line does not start with 'Login id:' but with '" + last
+				+ "'", last.startsWith("Login id:")); // login failed, getting
+														// new login prompt
+	}
+
+	public void testUserCount() throws Exception {
+		finishSetUp(m_testConfiguration);
+		connect();
+		login();
+
+		sendCommand("countusers");
+		assertTrue(getLastLine(readAnswer()).endsWith(" 0")); // no user yet
+
+		sendCommand("adduser testCount1 testCount");
+		assertTrue(getLastLine(readAnswer()).endsWith(" added")); // success
+
+		sendCommand("countusers");
+		assertTrue(getLastLine(readAnswer()).endsWith(" 1")); // 1 total
+
+		sendCommand("adduser testCount2 testCount");
+		assertTrue(getLastLine(readAnswer()).endsWith(" added")); // success
+
+		sendCommand("countusers");
+		assertTrue(getLastLine(readAnswer()).endsWith(" 2")); // 2 total
+
+		m_mockUsersRepository.removeUser("testCount1");
+
+		sendCommand("countusers");
+		assertTrue(getLastLine(readAnswer()).endsWith(" 1")); // 1 total
+	}
+
+	public void testAddUserAndVerify() throws Exception {
+		finishSetUp(m_testConfiguration);
+		connect();
+		login();
+
+		sendCommand("adduser testAdd test");
+		assertTrue(getLastLine(readAnswer()).endsWith(" added")); // success
+
+		sendCommand("verify testNotAdded");
+		assertTrue(getLastLine(readAnswer()).endsWith(" does not exist"));
+
+		sendCommand("verify testAdd");
+		assertTrue(getLastLine(readAnswer()).endsWith(" exists"));
+
+		sendCommand("deluser testAdd");
+		readAnswer();
+
+		sendCommand("verify testAdd");
+		assertTrue(getLastLine(readAnswer()).endsWith(" does not exist"));
+	}
+
+	public void testDelUser() throws Exception {
+		finishSetUp(m_testConfiguration);
+		connect();
+		login();
+
+		sendCommand("adduser testDel test");
+		assertTrue(getLastLine(readAnswer()).endsWith(" added")); // success
+
+		sendCommand("deluser testNotDeletable");
+		assertTrue(getLastLine(readAnswer()).endsWith(" doesn't exist"));
+
+		sendCommand("verify testDel");
+		assertTrue(getLastLine(readAnswer()).endsWith(" exists"));
+
+		sendCommand("deluser testDel");
+		assertTrue(getLastLine(readAnswer()).endsWith(" deleted"));
+
+		sendCommand("verify testDel");
+		assertTrue(getLastLine(readAnswer()).endsWith(" does not exist"));
+	}
+
+	public void testQuit() throws Exception {
+
+		finishSetUp(m_testConfiguration);
+		connect();
+		login();
+
+		sendCommand("help");
+		delay();
+		assertTrue("command line is effective", readAnswer().size() > 0);
+
+		sendCommand("quit");
+		delay();
+		assertTrue("", readAnswer(39).contains("Bye"));
+
+		sendCommand("help");
+		delay();
+		assertNull("connection is closed", m_reader.readLine());
+	}
+
+	public void testListUsers() throws Exception {
+		finishSetUp(m_testConfiguration);
+		connect();
+		login();
+
+		String[] users = new String[] { "ccc", "aaa", "dddd", "bbbbb" };
+
+		for (int i = 0; i < users.length; i++) {
+			String user = users[i];
+			sendCommand("adduser " + user + " test");
+			readAnswer(1);
+		}
+
+		delay();
+
+		sendCommand("listusers");
+		List list = readAnswer(5);
+
+		assertEquals("user count line", "Existing accounts " + users.length,
+				list.get(0));
+
+		List readUserNames = new ArrayList();
+		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
+			String answerLine = (String) iterator.next();
+			if (!answerLine.startsWith("user: "))
+				continue;
+			readUserNames.add(answerLine.substring(6));
+		}
+		assertEquals("user count", users.length, readUserNames.size());
+
+		for (int i = 0; i < users.length; i++) {
+			String user = users[i];
+			assertTrue("name found", readUserNames.contains(user));
+		}
+	}
+
+	private void delay() {
+		try {
+			Thread.sleep(100);
+		} catch (InterruptedException e) {
+			; // ignore
+		}
+	}
+
+	public void testCommandCaseInsensitive() throws Exception {
+		finishSetUp(m_testConfiguration);
+		connect();
+		login();
+
+		sendCommand("adduser testDel test");
+		assertTrue(getLastLine(readAnswer()).endsWith(" added")); // success
+
+		sendCommand("verify testDel");
+		assertTrue(getLastLine(readAnswer()).endsWith(" exists"));
+
+		sendCommand("VERIFY testDel");
+		assertTrue(getLastLine(readAnswer()).endsWith(" exists"));
+
+		sendCommand("vErIfY testDel");
+		assertTrue(getLastLine(readAnswer()).endsWith(" exists"));
+	}
+
+	public void testParameterCaseSensitive() throws Exception {
+		finishSetUp(m_testConfiguration);
+		connect();
+		login();
+
+		sendCommand("adduser testDel test");
+		assertTrue(getLastLine(readAnswer()).endsWith(" added")); // success
+
+		sendCommand("verify testDel");
+		assertTrue(getLastLine(readAnswer()).endsWith(" exists"));
+
+		sendCommand("verify TESTDEL");
+		assertTrue(getLastLine(readAnswer()).endsWith(" does not exist"));
+
+		sendCommand("verify testdel");
+		assertTrue(getLastLine(readAnswer()).endsWith(" does not exist"));
+	}
+
+	public void testAlias() throws Exception {
+		m_mockUsersRepository.setForceUseJamesUser();
+		finishSetUp(m_testConfiguration);
+		connect();
+		login();
+
+		// do some tests when parameter users don't exist
+		sendCommand("setalias testNonExist1 testNonExist2");
+		assertTrue(getLastLine(readAnswer()).equals(
+				"No such user testNonExist1"));
+
+		sendCommand("adduser testAlias1 test");
+		assertTrue(getLastLine(readAnswer()).endsWith(" added"));
+
+		sendCommand("showalias testAlias1");
+		assertTrue(getLastLine(readAnswer()).equals(
+				"User testAlias1 does not currently have an alias"));
+
+		sendCommand("setalias testAlias1 testNonExist2");
+		assertTrue(getLastLine(readAnswer()).equals(
+				"Alias unknown to server - create that user first."));
+
+		sendCommand("setalias testNonExist1 testAlias");
+		assertTrue(getLastLine(readAnswer()).equals(
+				"No such user testNonExist1"));
+
+		sendCommand("adduser testAlias2 test");
+		assertTrue(getLastLine(readAnswer()).endsWith(" added"));
+
+		// regular alias
+		sendCommand("setalias testAlias1 testAlias2");
+		assertTrue(getLastLine(readAnswer()).equals(
+				"Alias for testAlias1 set to:testAlias2"));
+
+		// TODO: is this correct? even primitive circular aliasing allowed!
+		sendCommand("setalias testAlias2 testAlias1");
+		assertTrue(getLastLine(readAnswer()).equals(
+				"Alias for testAlias2 set to:testAlias1"));
+
+		// did first one persist?
+		sendCommand("showalias testAlias1");
+		assertTrue(getLastLine(readAnswer()).equals(
+				"Current alias for testAlias1 is: testAlias2"));
+
+		// TODO: is this correct? setting self as alias!
+		sendCommand("setalias testAlias1 testAlias1");
+		assertTrue(getLastLine(readAnswer()).equals(
+				"Alias for testAlias1 set to:testAlias1"));
+
+		sendCommand("adduser testAlias3 test");
+		assertTrue(getLastLine(readAnswer()).endsWith(" added"));
+
+		// re-set, simply overwrites
+		sendCommand("setalias testAlias1 testAlias3");
+		assertTrue(getLastLine(readAnswer()).equals(
+				"Alias for testAlias1 set to:testAlias3"));
+
+		// check overwrite
+		sendCommand("showalias testAlias1");
+		assertTrue(getLastLine(readAnswer()).equals(
+				"Current alias for testAlias1 is: testAlias3"));
+
+		// retreat
+		sendCommand("unsetalias testAlias1");
+		assertTrue(getLastLine(readAnswer()).equals(
+				"Alias for testAlias1 unset"));
+
+		// check removed alias
+		sendCommand("showalias testAlias1");
+		assertTrue(getLastLine(readAnswer()).equals(
+				"User testAlias1 does not currently have an alias"));
+
+	}
+
+	public void testForward() throws Exception {
+		m_mockUsersRepository.setForceUseJamesUser();
+		finishSetUp(m_testConfiguration);
+		connect();
+		login();
+
+		// do some tests when parameter users don't exist
+		sendCommand("setforwarding testNonExist1 testForward1@locahost");
+		assertTrue(getLastLine(readAnswer()).equals(
+				"No such user testNonExist1"));
+
+		sendCommand("adduser testForwardUser test");
+		assertTrue(getLastLine(readAnswer()).endsWith(" added"));
+
+		sendCommand("showforwarding testForwardUser");
+		assertTrue(getLastLine(readAnswer()).equals(
+				"User testForwardUser is not currently being forwarded"));
+
+		sendCommand("setforwarding testForwardUser testForward1@locahost");
+		assertTrue(getLastLine(readAnswer())
+				.equals(
+						"Forwarding destination for testForwardUser set to:testForward1@locahost"));
+
+		// did it persist?
+		sendCommand("showforwarding testForwardUser");
+		assertTrue(getLastLine(readAnswer())
+				.equals(
+						"Current forwarding destination for testForwardUser is: testForward1@locahost"));
+
+		// re-set, simply overwrites
+		sendCommand("setforwarding testForwardUser testForward2@locahost");
+		assertTrue(getLastLine(readAnswer())
+				.equals(
+						"Forwarding destination for testForwardUser set to:testForward2@locahost"));
+
+		// check overwrite
+		sendCommand("showforwarding testForwardUser");
+		assertTrue(getLastLine(readAnswer())
+				.equals(
+						"Current forwarding destination for testForwardUser is: testForward2@locahost"));
+
+		// retreat
+		sendCommand("unsetforwarding testForwardUser");
+		assertTrue(getLastLine(readAnswer()).equals(
+				"Forward for testForwardUser unset"));
+
+		// check removed forward
+		sendCommand("showforwarding testForwardUser");
+		assertTrue(getLastLine(readAnswer()).equals(
+				"User testForwardUser is not currently being forwarded"));
+
+	}
+
+	public void testSetPassword() throws Exception {
+		finishSetUp(m_testConfiguration);
+		connect();
+		login();
+
+		String lastLine;
+
+		sendCommand("adduser testPwdUser pwd1");
+		lastLine = getLastLine(readAnswer());
+		assertTrue(lastLine.endsWith(" added"));
+
+		assertTrue("initial password", m_mockUsersRepository.test(
+				"testPwdUser", "pwd1"));
+
+		sendCommand("setpassword testPwdUser     ");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("password changed to empty: " + lastLine,
+				m_mockUsersRepository.test("testPwdUser", "pwd1"));
+
+		// change pwd
+		sendCommand("setpassword testPwdUser pwd2");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("password not changed to pwd2: " + lastLine,
+				m_mockUsersRepository.test("testPwdUser", "pwd2"));
+
+		// assure case sensitivity
+		sendCommand("setpassword testPwdUser pWD2");
+		lastLine = getLastLine(readAnswer());
+		assertFalse("password not changed to pWD2: " + lastLine,
+				m_mockUsersRepository.test("testPwdUser", "pwd2"));
+		assertTrue("password not changed to pWD2: " + lastLine,
+				m_mockUsersRepository.test("testPwdUser", "pWD2"));
+
+	}
+
+	public void testAddMapping() throws Exception {
+		String lastLine;
+		finishSetUp(m_testConfiguration);
+		connect();
+		login();
+
+		sendCommand("addmapping test@test junit");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("Add mapping", lastLine.endsWith("true"));
+
+		sendCommand("addmapping test@test junit");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("Not add mapping... allready exists", lastLine
+				.endsWith("false"));
+	}
+
+	public void testRemoveMapping() throws Exception {
+		String lastLine;
+		finishSetUp(m_testConfiguration);
+		connect();
+		login();
+
+		sendCommand("addmapping test@test junit");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("Add mapping", lastLine.endsWith("true"));
+
+		sendCommand("removemapping test@test junit");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("remove mapping", lastLine.endsWith("true"));
+
+		sendCommand("removemapping test@test junit");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("Not remove mapping... mapping not exists", lastLine
+				.endsWith("false"));
+	}
+
+	public void testListAllMappings() throws Exception {
+		String lastLine;
+		finishSetUp(m_testConfiguration);
+		connect();
+		login();
+
+		sendCommand("addmapping test@test junit");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("Add mapping", lastLine.endsWith("true"));
+
+		sendCommand("addmapping test2@test junit2");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("Add mapping", lastLine.endsWith("true"));
+
+		sendCommand("listallmappings");
+		List answer = readAnswer(3);
+		assertTrue("Read first mapping", answer.get(1).toString().contains(
+				"junit"));
+		assertTrue("Read second mapping line", answer.get(2).toString()
+				.contains("junit2"));
+	}
+
+	public void testListMapping() throws Exception {
+		String lastLine;
+		finishSetUp(m_testConfiguration);
+		connect();
+		login();
+
+		sendCommand("addmapping test@test junit");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("Add mapping", lastLine.endsWith("true"));
+
+		sendCommand("addmapping test2@test junit2");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("Add mapping", lastLine.endsWith("true"));
+
+		sendCommand("listmapping test@test");
+		lastLine = readAnswer(2).get(1).toString();
+		assertTrue("list mapping", lastLine.endsWith("junit"));
+	}
+
+	public void testaddDomain() throws Exception {
+		String lastLine;
+		finishSetUp(m_testConfiguration);
+		connect();
+		login();
+
+		sendCommand("adddomain domain");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("Add domain", lastLine.endsWith("successful"));
+
+		sendCommand("adddomain domain");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("Add domain which exists", lastLine.endsWith("fail"));
+
+		sendCommand("listdomains");
+
+		lastLine = readAnswer(2).get(1).toString();
+		assertTrue("list domain", lastLine.endsWith("domain"));
+	}
+
+	public void testremoveDomain() throws Exception {
+		String lastLine;
+		finishSetUp(m_testConfiguration);
+		connect();
+		login();
+
+		sendCommand("adddomain domain");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("Add domain", lastLine.endsWith("successful"));
 
-public class AsyncRemoteManagerTest extends RemoteManagerTest{
+		sendCommand("removedomain domain");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("Remove domain", lastLine.endsWith("successful"));
 
+		sendCommand("removedomain domain");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("Remove domain which not exist", lastLine.endsWith("fail"));
+	}
 
-    private AsyncRemoteManager remotemanager;
+	public void testListDomains() throws Exception {
+		String lastLine;
+		finishSetUp(m_testConfiguration);
+		connect();
+		login();
 
-    protected void setUp() throws Exception {
-        setUpServiceManager();
+		sendCommand("adddomain domain");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("Add domain", lastLine.endsWith("successful"));
 
-        remotemanager = new AsyncRemoteManager();
-        remotemanager.setDNSService(dnsservice);
-        remotemanager.setFileSystem(filesystem);
-        remotemanager.setLoader(serviceManager);
-        SimpleLog log = new SimpleLog("Mock");
-        log.setLevel(SimpleLog.LOG_LEVEL_DEBUG);
-        remotemanager.setLog(log);
-        remotemanager.setMailServer(mailServer);
-        m_testConfiguration = new RemoteManagerTestConfiguration(m_remoteManagerListenerPort);
-    }
-
-    protected void finishSetUp(RemoteManagerTestConfiguration testConfiguration) throws Exception {
-        testConfiguration.init();
-        remotemanager.configure(testConfiguration);
-        remotemanager.init();
-    }
+		sendCommand("adddomain domain2");
+		lastLine = getLastLine(readAnswer());
+		assertTrue("Add domain", lastLine.endsWith("successful"));
 
+		sendCommand("listdomains");
+		List answer = readAnswer(3);
+		assertTrue("list domain 1", answer.get(1).toString().endsWith("domain"));
+		assertTrue("list domain 2", answer.get(2).toString()
+				.endsWith("domain2"));
+	}
 }

Modified: james/server/trunk/smtpserver-function/pom.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver-function/pom.xml?rev=902049&r1=902048&r2=902049&view=diff
==============================================================================
--- james/server/trunk/smtpserver-function/pom.xml (original)
+++ james/server/trunk/smtpserver-function/pom.xml Fri Jan 22 10:29:27 2010
@@ -73,10 +73,6 @@
     </dependency>
     <dependency>
       <groupId>org.apache.james</groupId>
-      <artifactId>james-server-avalon-socket-library</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.james</groupId>
       <artifactId>james-server-mina-socket-library</artifactId>
     </dependency>
     <dependency>
@@ -96,14 +92,7 @@
       <groupId>org.apache.avalon.cornerstone.store</groupId>
       <artifactId>cornerstone-store-api</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.apache.avalon.cornerstone.threads</groupId>
-      <artifactId>cornerstone-threads-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.avalon.cornerstone.sockets</groupId>
-      <artifactId>cornerstone-sockets-api</artifactId>
-    </dependency>
+   
     <dependency>
       <groupId>org.apache.avalon.framework</groupId>
       <artifactId>avalon-framework-impl</artifactId>
@@ -129,11 +118,7 @@
       <artifactId>dnsjava</artifactId>
       <scope>runtime</scope>
     </dependency>
-    <dependency>
-      <groupId>commons-jxpath</groupId>
-      <artifactId>commons-jxpath</artifactId>
-      <scope>runtime</scope>
-    </dependency> 
+   
     <dependency>
       <groupId>commons-logging</groupId>
       <artifactId>commons-logging</artifactId>



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