[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