[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