[jboss-cvs] JBossRemoting/src/tests/org/jboss/test/remoting/transport/bisocket ...
Ron Sigal
ron_sigal at yahoo.com
Sun Mar 11 16:57:25 EDT 2007
User: rsigal
Date: 07/03/11 16:57:25
Modified: src/tests/org/jboss/test/remoting/transport/bisocket
BisocketTestCase.java
Log:
JBREM-721, JBREM-723: Added new unit tests.
Revision Changes Path
1.9 +253 -3 JBossRemoting/src/tests/org/jboss/test/remoting/transport/bisocket/BisocketTestCase.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: BisocketTestCase.java
===================================================================
RCS file: /cvsroot/jboss/JBossRemoting/src/tests/org/jboss/test/remoting/transport/bisocket/BisocketTestCase.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- BisocketTestCase.java 23 Feb 2007 06:59:23 -0000 1.8
+++ BisocketTestCase.java 11 Mar 2007 20:57:25 -0000 1.9
@@ -31,7 +31,6 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
-
import javax.management.MBeanServer;
import junit.framework.TestCase;
@@ -62,9 +61,10 @@
import org.jboss.remoting.transport.socket.SocketServerInvoker;
import org.jboss.remoting.transport.socket.SocketWrapper;
+
/**
* @author <a href="ron.sigal at jboss.com">Ron Sigal</a>
- * @version $Revision: 1.8 $
+ * @version $Revision: 1.9 $
* <p>
* Copyright Nov 25, 2006
* </p>
@@ -93,7 +93,6 @@
private SampleInvocationHandler invocationHandler;
-
/**
* Sets up target remoting server.
*/
@@ -313,6 +312,45 @@
}
+ public void testPullCallbacks() throws Throwable
+ {
+ log.info("entering " + getName());
+ String host = InetAddress.getLocalHost().getHostName();
+ String locatorURI = getTransport() + "://" + host + ":" + port;
+ InvokerLocator serverLocator = new InvokerLocator(locatorURI);
+ log.info("Connecting to: " + serverLocator);
+ HashMap config = new HashMap();
+ config.put(InvokerLocator.FORCE_REMOTE, "true");
+ config.put(Bisocket.IS_CALLBACK_SERVER, "true");
+ addExtraClientConfig(config);
+ Client client = new Client(serverLocator, config);
+ client.connect();
+ log.info("client is connected");
+ assertTrue(client.getInvoker() instanceof BisocketClientInvoker);
+
+ SimpleCallbackHandler callbackHandler = new SimpleCallbackHandler();
+ client.addListener(callbackHandler);
+ log.info("client added pull callback handler");
+
+ HashMap metadata = new HashMap(1);
+ Integer count = new Integer(3);
+ metadata.put(COUNTER, count);
+ Object response = client.invoke(INVOCATION_TEST, metadata);
+ assertTrue(response.equals(count));
+ client.invoke(CALLBACK_TEST);
+ List callbacks = client.getCallbacks(callbackHandler);
+ assertEquals(1, callbacks.size());
+
+ Field field = BisocketClientInvoker.class.getDeclaredField("listenerIdToClientInvokerMap");
+ field.setAccessible(true);
+ Map listenerIdToClientInvokerMap = (Map) field.get(client.getInvoker());
+ assertEquals(0, listenerIdToClientInvokerMap.size());
+
+ client.removeListener(callbackHandler);
+ client.disconnect();
+ }
+
+
public void testMaxSocketPoolSize() throws Throwable
{
log.info("entering " + getName());
@@ -1361,6 +1399,101 @@
}
+ public void testControlConnectionFailureBeforeFirstCallback() throws Throwable
+ {
+ log.info("entering " + getName());
+ String host = InetAddress.getLocalHost().getHostName();
+ String locatorURI = getTransport() + "://" + host + ":" + port;
+ InvokerLocator serverLocator = new InvokerLocator(locatorURI);
+ log.info("Connecting to: " + serverLocator);
+ HashMap config = new HashMap();
+ config.put(InvokerLocator.FORCE_REMOTE, "true");
+ config.put(Bisocket.IS_CALLBACK_SERVER, "true");
+ config.put(Bisocket.PING_FREQUENCY, TEST_PING_FREQUENCY_STRING);
+ addExtraClientConfig(config);
+ Client client = new Client(serverLocator, config);
+ client.connect();
+ log.info("client is connected");
+ assertTrue(client.getInvoker() instanceof BisocketClientInvoker);
+ DelayedCallbackHandler callbackHandler = new DelayedCallbackHandler();
+ client.addListener(callbackHandler, new HashMap());
+ log.info("client added callback handler");
+
+ // Shut down control connection on client side, so that pings can't be sent
+ // from server.
+ Field field = Client.class.getDeclaredField("callbackConnectors");
+ field.setAccessible(true);
+ Map callbackConnectors = (Map) field.get(client);
+ assertEquals(1, callbackConnectors.size());
+ Connector callbackConnector = (Connector) callbackConnectors.values().iterator().next();
+ ServerInvoker cbsi = callbackConnector.getServerInvoker();
+ assertTrue(cbsi instanceof BisocketServerInvoker);
+ field = BisocketServerInvoker.class.getDeclaredField("controlConnectionThreadMap");
+ field.setAccessible(true);
+ Map controlConnectionThreadMap = (Map) field.get(cbsi);
+ assertEquals(1, controlConnectionThreadMap.size());
+ Thread t = (Thread) controlConnectionThreadMap.values().iterator().next();
+ Class[] classes = BisocketServerInvoker.class.getDeclaredClasses();
+ Class controlConnectionThreadClass = null;
+
+ for (int i = 0; i < classes.length; i++)
+ {
+ log.info(classes[i]);
+ String fqn = classes[i].getName();
+ String className = fqn.substring(fqn.lastIndexOf('.') + 1);
+ log.info(className);
+ if ("BisocketServerInvoker$ControlConnectionThread".equals(className))
+ {
+ controlConnectionThreadClass = classes[i];
+ break;
+ }
+ }
+
+ assertNotNull(controlConnectionThreadClass);
+ assertEquals(t.getClass(), controlConnectionThreadClass);
+ field = controlConnectionThreadClass.getDeclaredField("controlSocket");
+ field.setAccessible(true);
+ Socket controlSocket = (Socket) field.get(t);
+ assertNotNull(controlSocket);
+ controlSocket.close();
+ log.info("CLOSED CONTROL SOCKET");
+
+ // Shut down the only existing ServerThread on the server side, and therefore
+ // the only existing pooled connection on the client side, forcing the
+ // next invocation to depend on the creation of a new control connection.
+ field = SocketServerInvoker.class.getDeclaredField("clientpool");
+ field.setAccessible(true);
+ ServerInvoker serverInvoker = connector.getServerInvoker();
+ assertTrue(serverInvoker instanceof BisocketServerInvoker);
+ LRUPool clientpool = (LRUPool) field.get(serverInvoker);
+ Set serverThreads = clientpool.getContents();
+ assertEquals(1, serverThreads.size());
+ ((ServerThread)serverThreads.iterator().next()).shutdown();
+ HashMap metadata = new HashMap();
+ metadata.put(COUNTER, new Integer(0));
+ client.invoke(INVOCATION_TEST, metadata);
+
+ field = controlConnectionThreadClass.getDeclaredField("MAX_INITIAL_ATTEMPTS");
+ field.setAccessible(true);
+ int MAX_INITIAL_ATTEMPTS = ((Integer) field.get(null)).intValue();
+
+ Thread.sleep(TEST_PING_FREQUENCY * MAX_INITIAL_ATTEMPTS);
+ log.info("********************** EXCEPTION EXPECTED ****************************");
+ client.invoke(CALLBACK_TEST);
+ log.info("***********************************************************************");
+ // Callback should not be possible because contol connection is disabled.
+ assertEquals(0, callbackHandler.callbackCounter);
+
+ Thread.sleep(TEST_PING_FREQUENCY * MAX_INITIAL_ATTEMPTS);
+ client.invoke(CALLBACK_TEST);
+ // Callback should be possible because control connection has been replaced.
+ assertEquals(1, callbackHandler.callbackCounter);
+
+ client.removeListener(callbackHandler);
+ client.disconnect();
+ }
+
+
public void testNoControlConnectionRestart() throws Throwable
{
log.info("entering " + getName());
@@ -1457,6 +1590,123 @@
client.removeListener(callbackHandler);
client.disconnect();
+
+ // The ControlMonitorTimerTask from the first callback handler tries to recreate
+ // its control connection, which adds an entry to
+ // BisocketClientInvoker.listenerIdToSocketsMap which cannot be removed, which
+ // interferes with testForLeaks().
+ //
+ // TODO: Should the possibility of a leak because of this phenomenon be handled?
+ field = BisocketClientInvoker.class.getDeclaredField("listenerIdToSocketsMap");
+ field.setAccessible(true);
+ Map listenerIdToSocketsMap = (Map) field.get(null);
+ listenerIdToSocketsMap.clear();
+ }
+
+
+ public void testForLeaks() throws Throwable
+ {
+ log.info("entering " + getName());
+ String host = InetAddress.getLocalHost().getHostName();
+ String locatorURI = getTransport() + "://" + host + ":" + port;
+ InvokerLocator serverLocator = new InvokerLocator(locatorURI);
+ log.info("Connecting to: " + serverLocator);
+ HashMap config = new HashMap();
+ config.put(InvokerLocator.FORCE_REMOTE, "true");
+ config.put(Bisocket.IS_CALLBACK_SERVER, "true");
+ addExtraClientConfig(config);
+ Client client = new Client(serverLocator, config);
+ client.connect();
+ log.info("client is connected");
+ assertTrue(client.getInvoker() instanceof BisocketClientInvoker);
+
+ int CALLBACK_HANDLER_COUNT = 5;
+ SimpleCallbackHandler[] callbackHandlers = new SimpleCallbackHandler[CALLBACK_HANDLER_COUNT];
+ for (int i = 0; i < CALLBACK_HANDLER_COUNT; i++)
+ {
+ callbackHandlers[i] = new SimpleCallbackHandler();
+ client.addListener(callbackHandlers[i], new HashMap());
+ }
+
+ client.invoke(CALLBACK_TEST);
+ for (int i = 0; i < CALLBACK_HANDLER_COUNT; i++)
+ {
+ assertEquals(1, callbackHandlers[i].callbackCounter);
+ }
+
+ // Static fields.
+ Field field = BisocketServerInvoker.class.getDeclaredField("listenerIdToServerInvokerMap");
+ field.setAccessible(true);
+ Map listenerIdToServerInvokerMap = (Map) field.get(null);
+ field = BisocketClientInvoker.class.getDeclaredField("listenerIdToClientInvokerMap");
+ field.setAccessible(true);
+ Map listenerIdToClientInvokerMap = (Map) field.get(null);
+ field = BisocketClientInvoker.class.getDeclaredField("listenerIdToCallbackClientInvokerMap");
+ field.setAccessible(true);
+ Map listenerIdToCallbackClientInvokerMap = (Map) field.get(null);
+ field = BisocketClientInvoker.class.getDeclaredField("listenerIdToSocketsMap");
+ field.setAccessible(true);
+ Map listenerIdToSocketsMap = (Map) field.get(null);
+
+ // Non-static fields.
+ field = Client.class.getDeclaredField("callbackConnectors");
+ field.setAccessible(true);
+ Map callbackConnectors = (Map) field.get(client);
+ assertEquals(CALLBACK_HANDLER_COUNT, callbackConnectors.size());
+ ServerInvoker[] serverInvokers = new ServerInvoker[CALLBACK_HANDLER_COUNT];
+ Map[] listenerIdToInvokerLocatorMaps = new HashMap[CALLBACK_HANDLER_COUNT];
+ Map[] controlConnectionThreadMaps = new HashMap[CALLBACK_HANDLER_COUNT];
+
+ int i = 0;
+ Iterator it = callbackConnectors.values().iterator();
+ while (it.hasNext())
+ {
+ Connector c = (Connector) it.next();
+ serverInvokers[i] = c.getServerInvoker();
+ assertTrue(serverInvokers[i] instanceof BisocketServerInvoker);
+ field = BisocketServerInvoker.class.getDeclaredField("listenerIdToInvokerLocatorMap");
+ field.setAccessible(true);
+ listenerIdToInvokerLocatorMaps[i] = (Map) field.get(serverInvokers[i]);
+ field = BisocketServerInvoker.class.getDeclaredField("controlConnectionThreadMap");
+ field.setAccessible(true);
+ controlConnectionThreadMaps[i] = (Map) field.get(serverInvokers[i]);
+ i++;
+ }
+
+ assertEquals(CALLBACK_HANDLER_COUNT, listenerIdToServerInvokerMap.size());
+ assertEquals(CALLBACK_HANDLER_COUNT, listenerIdToClientInvokerMap.size());
+ assertEquals(CALLBACK_HANDLER_COUNT, listenerIdToCallbackClientInvokerMap.size());
+ assertEquals(CALLBACK_HANDLER_COUNT, listenerIdToSocketsMap.size());
+
+ for (int j = 0; j < CALLBACK_HANDLER_COUNT; j++)
+ {
+ assertEquals(1, listenerIdToInvokerLocatorMaps[j].size());
+ assertEquals(1, controlConnectionThreadMaps[j].size());
+ field = BisocketServerInvoker.class.getDeclaredField("controlMonitorTimerTask");
+ field.setAccessible(true);
+ assertNotNull(field.get(serverInvokers[j]));
+ }
+
+ for (int j = 0; j < CALLBACK_HANDLER_COUNT; j++)
+ {
+ client.removeListener(callbackHandlers[j]);
+ }
+
+ assertEquals(0, listenerIdToServerInvokerMap.size());
+ assertEquals(0, listenerIdToClientInvokerMap.size());
+ assertEquals(0, listenerIdToCallbackClientInvokerMap.size());
+ assertEquals(0, listenerIdToSocketsMap.size());
+
+ for (int j = 0; j < CALLBACK_HANDLER_COUNT; j++)
+ {
+ assertEquals(0, listenerIdToInvokerLocatorMaps[j].size());
+ assertEquals(0, controlConnectionThreadMaps[j].size());
+ field = BisocketServerInvoker.class.getDeclaredField("controlMonitorTimerTask");
+ field.setAccessible(true);
+ assertNull(field.get(serverInvokers[j]));
+ }
+
+ client.disconnect();
}
More information about the jboss-cvs-commits
mailing list