[jboss-cvs] JBoss Messaging SVN: r4592 - in trunk: tests/src/org/jboss/messaging/tests/integration/core/remoting/mina and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Jun 26 01:57:43 EDT 2008


Author: clebert.suconic at jboss.com
Date: 2008-06-26 01:57:43 -0400 (Thu, 26 Jun 2008)
New Revision: 4592

Added:
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupportImpl.java
   trunk/tests/src/org/jboss/messaging/tests/unit/core/remoting/impl/mina/MinaConnectorTest.java
Modified:
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupport.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaAcceptor.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaConnector.java
   trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaSession.java
   trunk/tests/src/org/jboss/messaging/tests/integration/core/remoting/mina/FilterChainSupportTest.java
   trunk/tests/src/org/jboss/messaging/tests/integration/core/remoting/mina/TestSupport.java
Log:
Tests on MinaConnector (intermediary commit)

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupport.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupport.java	2008-06-25 23:27:28 UTC (rev 4591)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupport.java	2008-06-26 05:57:43 UTC (rev 4592)
@@ -23,58 +23,21 @@
 package org.jboss.messaging.core.remoting.impl.mina;
 
 import org.apache.mina.common.DefaultIoFilterChainBuilder;
-import org.apache.mina.filter.codec.ProtocolCodecFilter;
-import org.apache.mina.filter.ssl.SslFilter;
-import org.jboss.messaging.core.logging.Logger;
-import org.jboss.messaging.core.remoting.impl.ssl.SSLSupport;
 
-import javax.net.ssl.SSLContext;
-
 /**
  * @author <a href="mailto:jmesnil at redhat.com">Jeff Mesnil</a>
  * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
+ * @author <a href="mailto:clebert.suconic at jboss.com">Clebert Suconic</a>
  * 
  * @version <tt>$Revision$</tt>
  * 
  */
-public class FilterChainSupport
+public interface FilterChainSupport
 {
-   // Constants -----------------------------------------------------
+   void addCodecFilter(final DefaultIoFilterChainBuilder filterChain);
 
-   private static final Logger log = Logger.getLogger(FilterChainSupport.class);
-
-   // Attributes ----------------------------------------------------
-
-   // Static --------------------------------------------------------
-
-   // Constructors --------------------------------------------------
-
-   // Public --------------------------------------------------------
-
-   public static void addCodecFilter(final DefaultIoFilterChainBuilder filterChain)
-   {
-      assert filterChain != null;
-
-      filterChain.addLast("codec", new ProtocolCodecFilter(new MinaProtocolCodecFilter()));
-   }
-
-   public static void addSSLFilter(
+   void addSSLFilter(
          final DefaultIoFilterChainBuilder filterChain, final boolean client,
          final String keystorePath, final String keystorePassword, final String trustStorePath,
-         final String trustStorePassword) throws Exception
-   {
-      SSLContext context = SSLSupport.getInstance(client, keystorePath, keystorePassword,
-            trustStorePath, trustStorePassword);
-      SslFilter filter = new SslFilter(context);
-      if (client)
-      {
-         filter.setUseClientMode(true);
-         filter.setWantClientAuth(true);
-      }
-      filterChain.addLast("ssl", filter); 
-   }
-   
-   // Package protected ---------------------------------------------
-
-   // Inner classes -------------------------------------------------
+         final String trustStorePassword) throws Exception;
 }

Added: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupportImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupportImpl.java	                        (rev 0)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/FilterChainSupportImpl.java	2008-06-26 05:57:43 UTC (rev 4592)
@@ -0,0 +1,74 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005-2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+
+package org.jboss.messaging.core.remoting.impl.mina;
+
+import javax.net.ssl.SSLContext;
+
+import org.apache.mina.common.DefaultIoFilterChainBuilder;
+import org.apache.mina.filter.codec.ProtocolCodecFilter;
+import org.apache.mina.filter.ssl.SslFilter;
+import org.jboss.messaging.core.logging.Logger;
+import org.jboss.messaging.core.remoting.impl.ssl.SSLSupport;
+
+public class FilterChainSupportImpl implements FilterChainSupport
+{
+   // Constants -----------------------------------------------------
+
+   private static final Logger log = Logger.getLogger(FilterChainSupport.class);
+
+   // Attributes ----------------------------------------------------
+
+   // Static --------------------------------------------------------
+
+   // Constructors --------------------------------------------------
+
+   // Public --------------------------------------------------------
+
+   public void addCodecFilter(final DefaultIoFilterChainBuilder filterChain)
+   {
+      assert filterChain != null;
+
+      filterChain.addLast("codec", new ProtocolCodecFilter(new MinaProtocolCodecFilter()));
+   }
+
+   public void addSSLFilter(
+         final DefaultIoFilterChainBuilder filterChain, final boolean client,
+         final String keystorePath, final String keystorePassword, final String trustStorePath,
+         final String trustStorePassword) throws Exception
+   {
+      SSLContext context = SSLSupport.getInstance(client, keystorePath, keystorePassword,
+            trustStorePath, trustStorePassword);
+      SslFilter filter = new SslFilter(context);
+      if (client)
+      {
+         filter.setUseClientMode(true);
+         filter.setWantClientAuth(true);
+      }
+      filterChain.addLast("ssl", filter); 
+   }
+   
+   // Package protected ---------------------------------------------
+
+   // Inner classes -------------------------------------------------
+}

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaAcceptor.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaAcceptor.java	2008-06-25 23:27:28 UTC (rev 4591)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaAcceptor.java	2008-06-26 05:57:43 UTC (rev 4592)
@@ -28,8 +28,6 @@
 import org.jboss.messaging.core.remoting.Acceptor;
 import org.jboss.messaging.core.remoting.CleanUpNotifier;
 import org.jboss.messaging.core.remoting.RemotingService;
-import static org.jboss.messaging.core.remoting.impl.mina.FilterChainSupport.addCodecFilter;
-import static org.jboss.messaging.core.remoting.impl.mina.FilterChainSupport.addSSLFilter;
 
 import java.net.InetSocketAddress;
 import java.util.concurrent.ExecutorService;
@@ -49,6 +47,7 @@
    private IoServiceListener acceptorListener;
    private CleanUpNotifier cleanupNotifier;
    private RemotingService remotingService;
+   private FilterChainSupport chainSupport = new FilterChainSupportImpl();
 
    public void startAccepting(RemotingService remotingService, CleanUpNotifier cleanupNotifier) throws Exception
    {
@@ -65,12 +64,12 @@
       // addMDCFilter(filterChain);
       if (remotingService.getConfiguration().isSSLEnabled())
       {
-         addSSLFilter(filterChain, false, remotingService.getConfiguration().getKeyStorePath(),
+         chainSupport.addSSLFilter(filterChain, false, remotingService.getConfiguration().getKeyStorePath(),
                  remotingService.getConfiguration().getKeyStorePassword(), remotingService.getConfiguration()
                  .getTrustStorePath(), remotingService.getConfiguration()
                  .getTrustStorePassword());
       }
-      addCodecFilter(filterChain);
+      chainSupport.addCodecFilter(filterChain);
 
       // Bind
       acceptor.setDefaultLocalAddress(new InetSocketAddress(remotingService.getConfiguration().getHost(), remotingService.getConfiguration().getPort()));

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaConnector.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaConnector.java	2008-06-25 23:27:28 UTC (rev 4591)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaConnector.java	2008-06-26 05:57:43 UTC (rev 4592)
@@ -24,6 +24,8 @@
 
 import org.apache.mina.common.*;
 import org.apache.mina.filter.ssl.SslFilter;
+import org.apache.mina.transport.socket.SocketConnector;
+import org.apache.mina.transport.socket.SocketSessionConfig;
 import org.apache.mina.transport.socket.nio.NioSocketConnector;
 import org.jboss.messaging.core.client.ConnectionParams;
 import org.jboss.messaging.core.client.Location;
@@ -35,8 +37,6 @@
 import org.jboss.messaging.core.ping.impl.PingerImpl;
 import org.jboss.messaging.core.remoting.*;
 import org.jboss.messaging.core.remoting.impl.ResponseHandlerImpl;
-import static org.jboss.messaging.core.remoting.impl.mina.FilterChainSupport.addCodecFilter;
-import static org.jboss.messaging.core.remoting.impl.mina.FilterChainSupport.addSSLFilter;
 import org.jboss.messaging.core.remoting.impl.wireformat.Ping;
 import org.jboss.messaging.core.remoting.impl.wireformat.Pong;
 
@@ -64,8 +64,12 @@
    private final Location location;
 
    private final ConnectionParams connectionParams;
+   
+   private final FilterChainSupport chainSupport;
 
-   private transient NioSocketConnector connector;
+   private transient SocketConnector connector;
+   
+   private transient SocketSessionConfig connectorConfig;
 
    private final PacketDispatcher dispatcher;
 
@@ -74,11 +78,12 @@
    private IoSession session;
 
    private final List<RemotingSessionListener> listeners = new ArrayList<RemotingSessionListener>();
+
    private IoServiceListenerAdapter ioListener;
 
    private MinaHandler handler;
 
-   private ScheduledExecutorService scheduledExecutor;
+   private final ScheduledExecutorService scheduledExecutor;
 
    private boolean alive = true;
 
@@ -88,21 +93,52 @@
 
    // Public --------------------------------------------------------
 
-   public MinaConnector(Location location, PacketDispatcher dispatcher)
+   public MinaConnector(final Location location, final PacketDispatcher dispatcher)
    {
       this(location, new ConnectionParamsImpl(), dispatcher);
    }
 
-   public MinaConnector(Location location, ConnectionParams connectionParams, PacketDispatcher dispatcher)
+   public MinaConnector(final Location location, final ConnectionParams connectionParams, final PacketDispatcher dispatcher)
    {
-      assert location != null;
-      assert dispatcher != null;
-      assert connectionParams != null;
+      this(location, connectionParams, new NioSocketConnector(), new FilterChainSupportImpl(),dispatcher);
+   }
+   
+   public MinaConnector(final Location location, final ConnectionParams connectionParams, final SocketConnector connector, 
+                        FilterChainSupport chainSupport, final PacketDispatcher dispatcher)
+   {
+      if (location == null)
+      {
+         throw new IllegalArgumentException("Invalid argument null location");
+      }
+      
+      if (dispatcher == null)
+      {
+         throw new IllegalArgumentException("Invalid argument null dispatcher");
+      }
+      
+      if (connectionParams == null)
+      {
+         throw new IllegalArgumentException("Invalid argument null connectionParams");
+      }
+      
+      if (connector == null)
+      {
+         throw new IllegalArgumentException("Invalid argument null connector");
+      }
 
+      if (chainSupport == null)
+      {
+         throw new IllegalArgumentException("Invalid argument null chainSupport");
+      }
+
       this.location = location;
       this.connectionParams = connectionParams;
       this.dispatcher = dispatcher;
-      this.connector = new NioSocketConnector();
+      this.connector = connector;
+      this.connectorConfig = connector.getSessionConfig();
+      this.chainSupport = chainSupport;
+      
+      
       DefaultIoFilterChainBuilder filterChain = connector.getFilterChain();
 
       connector.setSessionDataStructureFactory(new MessagingIOSessionDataStructureFactory());
@@ -112,7 +148,7 @@
       {
          try
          {
-            addSSLFilter(filterChain, true, connectionParams.getKeyStorePath(), connectionParams.getKeyStorePassword(), null, null);
+            this.chainSupport.addSSLFilter(filterChain, true, connectionParams.getKeyStorePath(), connectionParams.getKeyStorePassword(), null, null);
          }
          catch (Exception e)
          {
@@ -121,20 +157,20 @@
             throw ise;
          }
       }
-      addCodecFilter(filterChain);
-      connector.getSessionConfig().setTcpNoDelay(connectionParams.isTcpNoDelay());
+      this.chainSupport.addCodecFilter(filterChain);
+      connectorConfig.setTcpNoDelay(connectionParams.isTcpNoDelay());
       int receiveBufferSize = connectionParams.getTcpReceiveBufferSize();
       if (receiveBufferSize != -1)
       {
-         connector.getSessionConfig().setReceiveBufferSize(receiveBufferSize);
+         connectorConfig.setReceiveBufferSize(receiveBufferSize);
       }
       int sendBufferSize = connectionParams.getTcpSendBufferSize();
       if (sendBufferSize != -1)
       {
-         connector.getSessionConfig().setSendBufferSize(sendBufferSize);
+         connectorConfig.setSendBufferSize(sendBufferSize);
       }
-      connector.getSessionConfig().setKeepAlive(true);
-      connector.getSessionConfig().setReuseAddress(true);
+      connectorConfig.setKeepAlive(true);
+      connectorConfig.setReuseAddress(true);
 
       scheduledExecutor = new ScheduledThreadPoolExecutor(1);
    }
@@ -166,7 +202,7 @@
       }
       session = future.getSession();
       
-      log.info("Got mina session " + session);
+      log.info("Connected on session " + session);
 
       MinaSession minaSession = new MinaSession(session);
       //register a handler for dealing with server pings
@@ -208,6 +244,7 @@
    {
       if (session == null)
       {
+         // TODO: shouldn't this throw an exception such as not initialized, not connected instead of return false? (written by Clebert)
          return false;
       }
       alive = false;

Modified: trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaSession.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaSession.java	2008-06-25 23:27:28 UTC (rev 4591)
+++ trunk/src/main/org/jboss/messaging/core/remoting/impl/mina/MinaSession.java	2008-06-26 05:57:43 UTC (rev 4592)
@@ -72,6 +72,30 @@
       return session.isConnected();
    }
 
+   @Override
+   public int hashCode()
+   {
+      final int prime = 31;
+      int result = 1;
+      result = prime * result + ((session == null) ? 0 : session.hashCode());
+      return result;
+   }
+
+   @Override
+   public boolean equals(Object obj)
+   {
+      if (this == obj)
+         return true;
+      if (obj == null)
+         return false;
+      if (getClass() != obj.getClass())
+         return false;
+      final MinaSession other = (MinaSession) obj;
+      
+      return this.session == other.session;
+   }
+   
+
    // Package protected ---------------------------------------------
 
    // Protected -----------------------------------------------------

Modified: trunk/tests/src/org/jboss/messaging/tests/integration/core/remoting/mina/FilterChainSupportTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/integration/core/remoting/mina/FilterChainSupportTest.java	2008-06-25 23:27:28 UTC (rev 4591)
+++ trunk/tests/src/org/jboss/messaging/tests/integration/core/remoting/mina/FilterChainSupportTest.java	2008-06-26 05:57:43 UTC (rev 4592)
@@ -23,8 +23,6 @@
 package org.jboss.messaging.tests.integration.core.remoting.mina;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static org.jboss.messaging.core.remoting.impl.mina.FilterChainSupport.addCodecFilter;
-import static org.jboss.messaging.core.remoting.impl.mina.FilterChainSupport.addSSLFilter;
 import static org.jboss.messaging.tests.util.RandomUtil.randomLong;
 
 import java.net.InetSocketAddress;
@@ -40,6 +38,8 @@
 import org.apache.mina.filter.ssl.SslFilter;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 import org.apache.mina.transport.socket.nio.NioSocketConnector;
+import org.jboss.messaging.core.remoting.impl.mina.FilterChainSupport;
+import org.jboss.messaging.core.remoting.impl.mina.FilterChainSupportImpl;
 import org.jboss.messaging.core.remoting.impl.wireformat.Ping;
 
 /**
@@ -80,9 +80,11 @@
    {
       InetSocketAddress address = new InetSocketAddress("localhost", 9091);
       NioSocketAcceptor acceptor = new NioSocketAcceptor();
-      addSSLFilter(acceptor.getFilterChain(), false, keystorePath,
+      FilterChainSupport support = new FilterChainSupportImpl();
+      
+      support.addSSLFilter(acceptor.getFilterChain(), false, keystorePath,
             keystorePassword, trustStorePath, trustStorePassword);
-      addCodecFilter(acceptor.getFilterChain());
+      support.addCodecFilter(acceptor.getFilterChain());
       acceptor.setDefaultLocalAddress(address);
 
       final CountDownLatch latch = new CountDownLatch(1);
@@ -99,9 +101,9 @@
       acceptor.bind();
 
       NioSocketConnector connector = new NioSocketConnector();
-      addSSLFilter(connector.getFilterChain(), true,
+      support.addSSLFilter(connector.getFilterChain(), true,
             keystorePath, keystorePassword, null, null);
-      addCodecFilter(connector.getFilterChain());
+      support.addCodecFilter(connector.getFilterChain());
       connector.setHandler(new IoHandlerAdapter());
       ConnectFuture future = connector.connect(address).awaitUninterruptibly();
       IoSession session = future.getSession();

Modified: trunk/tests/src/org/jboss/messaging/tests/integration/core/remoting/mina/TestSupport.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/integration/core/remoting/mina/TestSupport.java	2008-06-25 23:27:28 UTC (rev 4591)
+++ trunk/tests/src/org/jboss/messaging/tests/integration/core/remoting/mina/TestSupport.java	2008-06-26 05:57:43 UTC (rev 4592)
@@ -40,6 +40,8 @@
    public static final long REQRES_TIMEOUT = 2; // in seconds
 
    public static final int PORT = 9090;
+   
+   public static final String HOST = "localhost";
 
    // Attributes ----------------------------------------------------
 

Added: trunk/tests/src/org/jboss/messaging/tests/unit/core/remoting/impl/mina/MinaConnectorTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/unit/core/remoting/impl/mina/MinaConnectorTest.java	                        (rev 0)
+++ trunk/tests/src/org/jboss/messaging/tests/unit/core/remoting/impl/mina/MinaConnectorTest.java	2008-06-26 05:57:43 UTC (rev 4592)
@@ -0,0 +1,833 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005-2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+
+package org.jboss.messaging.tests.unit.core.remoting.impl.mina;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.security.NoSuchAlgorithmException;
+import java.util.List;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLException;
+
+import org.apache.mina.common.AbstractIoSession;
+import org.apache.mina.common.CloseFuture;
+import org.apache.mina.common.ConnectFuture;
+import org.apache.mina.common.DefaultIoFilterChain;
+import org.apache.mina.common.DefaultIoFilterChainBuilder;
+import org.apache.mina.common.IdleStatus;
+import org.apache.mina.common.IoFilter;
+import org.apache.mina.common.IoFilterChain;
+import org.apache.mina.common.IoHandler;
+import org.apache.mina.common.IoProcessor;
+import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoServiceListener;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.IoSessionConfig;
+import org.apache.mina.common.IoSessionDataStructureFactory;
+import org.apache.mina.common.TrafficMask;
+import org.apache.mina.common.TransportMetadata;
+import org.apache.mina.common.WriteFuture;
+import org.apache.mina.common.WriteRequest;
+import org.apache.mina.common.IoFilter.NextFilter;
+import org.apache.mina.filter.ssl.SslFilter;
+import org.apache.mina.transport.socket.SocketConnector;
+import org.apache.mina.transport.socket.SocketSessionConfig;
+import org.easymock.EasyMock;
+import org.easymock.IAnswer;
+import org.easymock.IArgumentMatcher;
+import org.jboss.messaging.core.client.ConnectionParams;
+import org.jboss.messaging.core.client.impl.LocationImpl;
+import org.jboss.messaging.core.remoting.PacketDispatcher;
+import org.jboss.messaging.core.remoting.PacketHandler;
+import org.jboss.messaging.core.remoting.PacketReturner;
+import org.jboss.messaging.core.remoting.RemotingSession;
+import org.jboss.messaging.core.remoting.TransportType;
+import org.jboss.messaging.core.remoting.impl.ResponseHandlerImpl;
+import org.jboss.messaging.core.remoting.impl.mina.FilterChainSupport;
+import org.jboss.messaging.core.remoting.impl.mina.MinaConnector;
+import org.jboss.messaging.core.remoting.impl.mina.MinaHandler;
+import org.jboss.messaging.core.remoting.impl.mina.MinaSession;
+import org.jboss.messaging.core.remoting.impl.wireformat.Ping;
+import org.jboss.messaging.core.remoting.impl.wireformat.Pong;
+import org.jboss.messaging.tests.integration.core.remoting.mina.TestSupport;
+import org.jboss.messaging.tests.util.RandomUtil;
+import org.jboss.messaging.tests.util.UnitTestCase;
+
+/**
+ * 
+ * @author <a href="mailto:clebert.suconic at jboss.com">Clebert Suconic</a>
+ *
+ */
+public class MinaConnectorTest extends UnitTestCase
+{
+   
+   // Constants -----------------------------------------------------
+   
+   // Attributes ----------------------------------------------------
+   
+   
+   private LocationImpl location;
+   
+   private ConnectionParams connectionParams;
+   
+   private PacketDispatcher dispatcher;
+   
+   private SocketConnector connector;
+   
+   private DefaultIoFilterChainBuilder delegateBuilder;
+   
+   private SocketSessionConfig sessionConfig;
+   
+   private IoSession ioSession;
+   
+   private FilterChainSupport filterChainSupport;
+   
+   private SetHandlerAnswer setHandlerAnswer;
+   
+   // Static --------------------------------------------------------
+   
+   // Constructors --------------------------------------------------
+   
+   // Public --------------------------------------------------------
+   
+   
+   public void setUp() throws Exception
+   {
+      super.setUp();
+      
+      location = null;
+      
+      connectionParams = null;
+      
+      dispatcher = null;
+      
+      connector = null;
+      
+      delegateBuilder = null;
+      
+      sessionConfig = null;
+      
+      ioSession = null;
+      
+      filterChainSupport = null;
+      
+      setHandlerAnswer = null;
+
+   }
+   
+   public void testConstructor() throws Exception
+   {
+      construct(false);
+      construct(true);
+      
+      try
+      {
+         new MinaConnector(null, connectionParams, connector, filterChainSupport, dispatcher);
+         fail("Supposed to throw exception");
+      }
+      catch (IllegalArgumentException ignored)
+      {
+      }
+
+      try
+      {
+         new MinaConnector(location, null, connector, filterChainSupport, dispatcher);
+         fail("Supposed to throw exception");
+      }
+      catch (IllegalArgumentException ignored)
+      {
+      }
+
+      try
+      {
+         new MinaConnector(location, connectionParams, null, filterChainSupport, dispatcher);
+         fail("Supposed to throw exception");
+      }
+      catch (IllegalArgumentException ignored)
+      {
+      }
+
+      try
+      {
+         new MinaConnector(location, connectionParams, connector, null, dispatcher);
+         fail("Supposed to throw exception");
+      }
+      catch (IllegalArgumentException ignored)
+      {
+      }
+
+      try
+      {
+         new MinaConnector(location, connectionParams, connector, filterChainSupport, null);
+         fail("Supposed to throw exception");
+      }
+      catch (IllegalArgumentException ignored)
+      {
+      }
+
+      try
+      {
+         new MinaConnector(null, dispatcher);
+         fail("Supposed to throw exception");
+      }
+      catch (IllegalArgumentException ignored)
+      {
+      }
+
+      try
+      {
+         new MinaConnector(location, null);
+         fail("Supposed to throw exception");
+      }
+      catch (IllegalArgumentException ignored)
+      {
+      }
+   }
+   
+   public void testSSLError() throws Exception
+   {
+      location = new LocationImpl(TransportType.TCP, TestSupport.HOST, TestSupport.PORT);
+      
+      connectionParams = EasyMock.createMock(ConnectionParams.class);
+      
+      dispatcher = EasyMock.createMock(PacketDispatcher.class);
+      
+      connector = EasyMock.createMock(SocketConnector.class);
+      
+      connector.setSessionDataStructureFactory((IoSessionDataStructureFactory)EasyMock.anyObject());
+      
+      EasyMock.expect(connectionParams.isSSLEnabled()).andReturn(true);
+      
+      FilterChainSupport filterChainSupport = EasyMock.createMock(FilterChainSupport.class);
+      
+      delegateBuilder = new DefaultIoFilterChainBuilder();
+
+      sessionConfig = EasyMock.createMock(SocketSessionConfig.class);
+      
+      EasyMock.expect(connector.getSessionConfig()).andReturn(sessionConfig);
+      
+      EasyMock.expect(connector.getFilterChain()).andReturn(delegateBuilder);
+      
+      String password = RandomUtil.randomString();
+ 
+      String storePath = RandomUtil.randomString();
+      
+      EasyMock.expect(connectionParams.getKeyStorePassword()).andReturn(password);
+      
+      EasyMock.expect(connectionParams.getKeyStorePath()).andReturn(storePath);
+
+      filterChainSupport.addSSLFilter(delegateBuilder, true, storePath, password, null, null);
+      
+      EasyMock.expectLastCall().andThrow(new IllegalStateException("mock exception"));
+
+      EasyMock.replay(connectionParams, dispatcher, connector, filterChainSupport);
+      
+      
+      try
+      {
+         new MinaConnector(location, connectionParams, connector, filterChainSupport, dispatcher);
+         fail("supposed to throw exception");
+      }
+      catch (IllegalStateException e)
+      {
+      }
+      
+      EasyMock.verify(connectionParams, dispatcher, connector, filterChainSupport);
+      
+   }
+
+   public void testExceptionOnConnect() throws Exception
+   {
+      MinaConnector minaConnector = construct(false);
+      
+      connector.setHandler(EasyMock.isA(MinaHandler.class));
+      
+      dispatcher.setListener(EasyMock.isA(MinaHandler.class));
+      
+      ConnectFuture futureConnect = EasyMock.createMock(ConnectFuture.class);
+      
+      InetSocketAddress address = new InetSocketAddress(location.getHost(), location.getPort());
+      
+      EasyMock.expect(connector.connect(address)).andReturn(futureConnect);
+      
+      connector.setDefaultRemoteAddress(address);
+      
+      connector.addListener(EasyMock.isA(IoServiceListener.class));
+      
+      EasyMock.expect(futureConnect.awaitUninterruptibly()).andReturn(futureConnect);
+      
+      EasyMock.expect(futureConnect.isConnected()).andReturn(false);
+
+      EasyMock.replay(connectionParams, dispatcher, connector, sessionConfig, filterChainSupport, futureConnect);
+      
+      try
+      {
+         minaConnector.connect();
+         fail("Suppsoed to throw IOException");
+      }
+      catch (IOException ignored)
+      {
+      }
+      
+      EasyMock.verify(connectionParams, dispatcher, connector, sessionConfig, filterChainSupport, futureConnect);
+   }
+
+   
+   public void testConnect() throws Exception
+   {
+      MinaConnector minaConnector = construct(false);
+      
+      connect(minaConnector);
+      
+      // A reconnect should return the same cached Session (using a new MinaSession)
+      
+      EasyMock.expect(ioSession.isConnected()).andStubReturn(true);
+      
+      EasyMock.replay(connectionParams, dispatcher, connector, sessionConfig, filterChainSupport, ioSession);
+
+      RemotingSession minaSession = minaConnector.connect();
+      
+      assertEquals(minaSession, new MinaSession(ioSession));
+      
+      EasyMock.verify(connectionParams, dispatcher, connector, sessionConfig, filterChainSupport, ioSession);
+   }
+
+   public void testDisconnect() throws Exception
+   {
+      MinaConnector minaConnector = construct(true);
+      
+      assertFalse(minaConnector.disconnect());
+      
+      connect(minaConnector);
+      
+      disconnect(minaConnector);
+      
+   }
+
+   public void testPinger() throws Exception
+   {
+      MinaConnector minaConnector = construct(true);
+      
+      connect(minaConnector, true);
+      
+      Ping ping = new Ping(33);
+      
+      
+      PacketReturner retPack = EasyMock.createStrictMock(PacketReturner.class);
+      retPack.send(pongMatch(33, false));
+      
+      EasyMock.replay(retPack);
+      
+      this.setHandlerAnswer.handler.handle(ping, retPack);
+
+      EasyMock.verify(retPack);
+      
+      disconnect(minaConnector);
+      
+   }
+   
+   // Package protected ---------------------------------------------
+   
+   // Protected -----------------------------------------------------
+   
+   // Private -------------------------------------------------------
+
+   private Pong pongMatch(final int sessionId, final boolean sessionFailed)
+   {
+      EasyMock.reportMatcher(new IArgumentMatcher()
+      {
+
+         public void appendTo(StringBuffer buffer)
+         {
+         }
+
+         public boolean matches(Object argument)
+         {
+            Pong pong = (Pong) argument;
+            
+            return pong.getSessionID() == sessionId &&
+                   pong.isSessionFailed() == sessionFailed;
+         }
+         
+      });
+      
+      return null;
+   }
+      
+   private void connect(MinaConnector minaConnector) throws IOException
+   {
+      connect(minaConnector, false);
+   }
+   
+   private void connect(final MinaConnector minaConnector, final boolean ping) throws IOException
+   {
+      connector.setHandler(EasyMock.isA(MinaHandler.class));
+      
+      dispatcher.setListener(EasyMock.isA(MinaHandler.class));
+      
+      ConnectFuture futureConnect = EasyMock.createMock(ConnectFuture.class);
+      
+      InetSocketAddress address = new InetSocketAddress(location.getHost(), location.getPort());
+      
+      EasyMock.expect(connector.connect(address)).andReturn(futureConnect);
+      
+      connector.setDefaultRemoteAddress(address);
+      
+      connector.addListener(EasyMock.isA(IoServiceListener.class));
+      
+      EasyMock.expect(futureConnect.awaitUninterruptibly()).andReturn(futureConnect);
+      
+      EasyMock.expect(futureConnect.isConnected()).andReturn(true);
+      
+      ioSession = EasyMock.createMock(IoSession.class);
+      
+      EasyMock.expect(futureConnect.getSession()).andReturn(ioSession);
+      
+      dispatcher.register(EasyMock.isA(PacketHandler.class));
+      
+      this.setHandlerAnswer = new SetHandlerAnswer();
+      
+      EasyMock.expectLastCall().andAnswer(setHandlerAnswer);
+      
+      if (ping)
+      {
+         EasyMock.expect(connectionParams.getPingInterval()).andReturn(60000l);
+         EasyMock.expectLastCall().atLeastOnce();
+         EasyMock.expect(dispatcher.generateID()).andReturn(30l);
+         EasyMock.expect(connectionParams.getPingTimeout()).andReturn(60000l);
+         dispatcher.register(EasyMock.isA(ResponseHandlerImpl.class));
+      }
+      else
+      {
+         EasyMock.expect(connectionParams.getPingInterval()).andReturn(0l);
+      }
+      
+      EasyMock.replay(connectionParams, dispatcher, connector, sessionConfig, filterChainSupport, futureConnect, ioSession);
+      
+      minaConnector.connect();
+      
+      EasyMock.verify(connectionParams, dispatcher, connector, sessionConfig, filterChainSupport, futureConnect, ioSession);
+      
+      EasyMock.reset(connectionParams, dispatcher, connector, sessionConfig, filterChainSupport, futureConnect, ioSession);
+   }
+   
+   private void disconnect(MinaConnector minaConnector) throws Exception,
+         NoSuchAlgorithmException
+   {
+      connector.removeListener(EasyMock.isA(IoServiceListener.class));
+      
+      CloseFuture futureClose = EasyMock.createMock(CloseFuture.class);
+      
+      EasyMock.expect(ioSession.close()).andReturn(futureClose);
+      
+      EasyMock.expect(futureClose.awaitUninterruptibly())
+            .andReturn(futureClose);
+      
+      EasyMock.expect(futureClose.isClosed()).andReturn(true);
+      
+      connector.dispose();
+      
+      IoFilterChain easyChain = EasyMock.createNiceMock(IoFilterChain.class);
+      
+      WriteFuture futureSSLStop = EasyMock.createStrictMock(WriteFuture.class);
+      EasyMock.expect(futureSSLStop.awaitUninterruptibly()).andReturn(
+            futureSSLStop);
+      
+      EasyMock.expect(easyChain.get("ssl")).andReturn(
+            new ProxySSLFilter(futureSSLStop));
+      
+      ProxyFilterChain chain = new ProxyFilterChain(new IoSessionProxy(
+            easyChain), easyChain);
+      
+      new SslFilter(SSLContext.getInstance("TLS"));
+      
+      EasyMock.expect(ioSession.getFilterChain()).andReturn(chain);
+      
+      // This is a hack currently being done on disconnect for SSL, maybe it
+      // will start to fail when MINA is fixed
+      
+      EasyMock.replay(connectionParams, dispatcher, connector, sessionConfig,
+            filterChainSupport, futureClose, futureSSLStop, ioSession,
+            easyChain);
+      
+      minaConnector.disconnect();
+      
+      EasyMock.verify(connectionParams, dispatcher, connector, sessionConfig,
+            filterChainSupport, futureClose, futureSSLStop, ioSession,
+            easyChain);
+      
+      EasyMock.reset(connectionParams, dispatcher, connector, sessionConfig,
+            filterChainSupport, futureClose, futureSSLStop, ioSession,
+            easyChain);
+   }
+
+
+   
+   private MinaConnector construct(boolean ssl) throws Exception
+   {
+      location = new LocationImpl(TransportType.TCP, TestSupport.HOST, TestSupport.PORT);
+      
+      connectionParams = EasyMock.createMock(ConnectionParams.class);
+      
+      dispatcher = EasyMock.createMock(PacketDispatcher.class);
+      
+      connector = EasyMock.createMock(SocketConnector.class);
+      
+      connector.setSessionDataStructureFactory((IoSessionDataStructureFactory)EasyMock.anyObject());
+      
+      EasyMock.expect(connectionParams.isSSLEnabled()).andReturn(ssl);
+      
+      filterChainSupport = EasyMock.createMock(FilterChainSupport.class);
+      
+      delegateBuilder = new DefaultIoFilterChainBuilder();
+
+      filterChainSupport.addCodecFilter(delegateBuilder);
+      
+      sessionConfig = EasyMock.createMock(SocketSessionConfig.class);
+      
+      EasyMock.expect(connector.getSessionConfig()).andReturn(sessionConfig);
+      
+      EasyMock.expect(connector.getFilterChain()).andReturn(delegateBuilder);
+      
+      if (ssl)
+      {
+         String password = RandomUtil.randomString();
+         String storePath = RandomUtil.randomString();
+         EasyMock.expect(connectionParams.getKeyStorePassword()).andReturn(password);
+         EasyMock.expect(connectionParams.getKeyStorePath()).andReturn(storePath);
+
+         filterChainSupport.addSSLFilter(delegateBuilder, true, storePath, password, null, null);
+      }
+      
+      EasyMock.expect(connectionParams.isTcpNoDelay()).andReturn(true);
+      
+      sessionConfig.setTcpNoDelay(true);
+
+      EasyMock.expect(connectionParams.getTcpReceiveBufferSize()).andReturn(1024);
+      
+      sessionConfig.setReceiveBufferSize(1024);
+      
+      EasyMock.expect(connectionParams.getTcpSendBufferSize()).andReturn(1024);
+      
+      sessionConfig.setSendBufferSize(1024);
+      
+      sessionConfig.setKeepAlive(true);
+      
+      sessionConfig.setReuseAddress(true);
+      
+      EasyMock.replay(connectionParams, dispatcher, connector, sessionConfig, filterChainSupport);
+      
+      MinaConnector mina = new MinaConnector(location, connectionParams, connector, filterChainSupport, dispatcher);
+      
+      EasyMock.verify(connectionParams, dispatcher, connector, sessionConfig, filterChainSupport);
+      
+      EasyMock.reset(connectionParams, dispatcher, connector, sessionConfig, filterChainSupport);
+      
+      return mina;
+   }
+   
+   
+   // Inner classes -------------------------------------------------
+   
+
+   class SetHandlerAnswer implements IAnswer<Object>
+   {
+      PacketHandler handler;
+
+      public Object answer() throws Throwable
+      {
+         handler = (PacketHandler)EasyMock.getCurrentArguments()[0];
+         System.out.println("handler = " + handler);
+         return null;
+      }
+   }
+   
+   
+   /** Mina is not 100% "interfacable", so I'm mocking this class */
+  class ProxySSLFilter extends SslFilter
+   {
+      
+      private final WriteFuture futureStop;
+      
+      public ProxySSLFilter(WriteFuture futureStop) throws Exception
+      {
+         super(SSLContext.getInstance("TLS"));
+         this.futureStop = futureStop;
+      }
+      
+      public WriteFuture stopSsl(IoSession session) throws SSLException
+      {
+         return futureStop;
+      }
+      
+   }
+   
+   
+   /** Mina is not 100% "interfacable", so I'm mocking this class */
+   class ProxyFilterChain extends DefaultIoFilterChain
+   {
+
+      private final IoFilterChain delegateMock;
+      
+      public ProxyFilterChain(AbstractIoSession session, IoFilterChain delegateMock)
+      {
+         super(session);
+         this.delegateMock = delegateMock;
+      }
+
+      public void addAfter(String baseName, String name, IoFilter filter)
+      {
+         delegateMock.addAfter(baseName, name, filter);
+      }
+
+      public void addBefore(String baseName, String name, IoFilter filter)
+      {
+         delegateMock.addBefore(baseName, name, filter);
+      }
+
+      public void addFirst(String name, IoFilter filter)
+      {
+         delegateMock.addFirst(name, filter);
+      }
+
+      public void addLast(String name, IoFilter filter)
+      {
+         delegateMock.addLast(name, filter);
+      }
+
+      public void clear() throws Exception
+      {
+         delegateMock.clear();
+      }
+
+      public boolean contains(Class<? extends IoFilter> filterType)
+      {
+         return delegateMock.contains(filterType);
+      }
+
+      public boolean contains(IoFilter filter)
+      {
+         return delegateMock.contains(filter);
+      }
+
+      public boolean contains(String name)
+      {
+         return delegateMock.contains(name);
+      }
+
+      public void fireExceptionCaught(Throwable cause)
+      {
+         delegateMock.fireExceptionCaught(cause);
+      }
+
+      public void fireFilterClose()
+      {
+         delegateMock.fireFilterClose();
+      }
+
+      public void fireFilterSetTrafficMask(TrafficMask trafficMask)
+      {
+         delegateMock.fireFilterSetTrafficMask(trafficMask);
+      }
+
+      public void fireFilterWrite(WriteRequest writeRequest)
+      {
+         delegateMock.fireFilterWrite(writeRequest);
+      }
+
+      public void fireMessageReceived(Object message)
+      {
+         delegateMock.fireMessageReceived(message);
+      }
+
+      public void fireMessageSent(WriteRequest request)
+      {
+         delegateMock.fireMessageSent(request);
+      }
+
+      public void fireSessionClosed()
+      {
+         delegateMock.fireSessionClosed();
+      }
+
+      public void fireSessionCreated()
+      {
+         delegateMock.fireSessionCreated();
+      }
+
+      public void fireSessionIdle(IdleStatus status)
+      {
+         delegateMock.fireSessionIdle(status);
+      }
+
+      public void fireSessionOpened()
+      {
+         delegateMock.fireSessionOpened();
+      }
+
+      public IoFilter get(Class<? extends IoFilter> filterType)
+      {
+         return delegateMock.get(filterType);
+      }
+
+      public IoFilter get(String name)
+      {
+         return delegateMock.get(name);
+      }
+
+      public List<Entry> getAll()
+      {
+         return delegateMock.getAll();
+      }
+
+      public List<Entry> getAllReversed()
+      {
+         return delegateMock.getAllReversed();
+      }
+
+      public Entry getEntry(Class<? extends IoFilter> filterType)
+      {
+         return delegateMock.getEntry(filterType);
+      }
+
+      public Entry getEntry(IoFilter filter)
+      {
+         return delegateMock.getEntry(filter);
+      }
+
+      public Entry getEntry(String name)
+      {
+         return delegateMock.getEntry(name);
+      }
+
+      public NextFilter getNextFilter(Class<? extends IoFilter> filterType)
+      {
+         return delegateMock.getNextFilter(filterType);
+      }
+
+      public NextFilter getNextFilter(IoFilter filter)
+      {
+         return delegateMock.getNextFilter(filter);
+      }
+
+      public NextFilter getNextFilter(String name)
+      {
+         return delegateMock.getNextFilter(name);
+      }
+
+      public IoSession getSession()
+      {
+         return delegateMock.getSession();
+      }
+
+      public IoFilter remove(Class<? extends IoFilter> filterType)
+      {
+         return delegateMock.remove(filterType);
+      }
+
+      public void remove(IoFilter filter)
+      {
+         delegateMock.remove(filter);
+      }
+
+      public IoFilter remove(String name)
+      {
+         return delegateMock.remove(name);
+      }
+
+      public IoFilter replace(Class<? extends IoFilter> oldFilterType,
+            IoFilter newFilter)
+      {
+         return delegateMock.replace(oldFilterType, newFilter);
+      }
+
+      public void replace(IoFilter oldFilter, IoFilter newFilter)
+      {
+         delegateMock.replace(oldFilter, newFilter);
+      }
+
+      public IoFilter replace(String name, IoFilter newFilter)
+      {
+         return delegateMock.replace(name, newFilter);
+      }
+
+   }
+   
+   
+   /** Mina is not 100% "interfacable", so I'm mocking this class */
+   class IoSessionProxy extends AbstractIoSession
+   {
+
+      private final IoFilterChain delegateMock;
+      
+      public IoSessionProxy(IoFilterChain delegateMock)
+      {
+         this.delegateMock = delegateMock;
+      }
+      
+      protected IoProcessor getProcessor()
+      {
+         return null;
+      }
+
+      public IoSessionConfig getConfig()
+      {
+         return null;
+      }
+
+      public IoFilterChain getFilterChain()
+      {
+         return new ProxyFilterChain(this, delegateMock);
+      }
+
+      public IoHandler getHandler()
+      {
+         return null;
+      }
+
+      public SocketAddress getLocalAddress()
+      {
+         return null;
+      }
+
+      public SocketAddress getRemoteAddress()
+      {
+         return null;
+      }
+
+      public IoService getService()
+      {
+         return null;
+      }
+
+      public TransportMetadata getTransportMetadata()
+      {
+         return null;
+      }
+      
+   }
+   
+}




More information about the jboss-cvs-commits mailing list