[jboss-cvs] JBossRemoting/src/tests/org/jboss/test/remoting/detection/jndi ...

Ron Sigal ron_sigal at yahoo.com
Tue Mar 27 04:22:42 EDT 2007


  User: rsigal  
  Date: 07/03/27 04:22:42

  Added:       src/tests/org/jboss/test/remoting/detection/jndi   
                        CleanDetectionTestServer.java
                        CleanDetectionTestCase.java
                        CleanDetectionTestClient.java
  Log:
  JBREM-730:  New unit test.
  
  Revision  Changes    Path
  1.1      date: 2007/03/27 08:22:42;  author: rsigal;  state: Exp;JBossRemoting/src/tests/org/jboss/test/remoting/detection/jndi/CleanDetectionTestServer.java
  
  Index: CleanDetectionTestServer.java
  ===================================================================
  /*
  * JBoss, Home of Professional Open Source
  * Copyright 2005, JBoss Inc., and individual contributors as indicated
  * 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.test.remoting.detection.jndi;
  
  import org.jboss.jrunit.extensions.ServerTestCase;
  import org.jboss.logging.Logger;
  import org.jboss.remoting.InvocationRequest;
  import org.jboss.remoting.InvokerLocator;
  import org.jboss.remoting.ServerInvocationHandler;
  import org.jboss.remoting.ServerInvoker;
  import org.jboss.remoting.callback.InvokerCallbackHandler;
  import org.jboss.remoting.detection.AbstractDetector;
  import org.jboss.remoting.detection.jndi.JNDIDetector;
  import org.jboss.remoting.transport.Connector;
  import org.jboss.remoting.transport.PortUtil;
  import org.jnp.server.Main;
  
  import javax.management.MBeanServer;
  import javax.management.MBeanServerFactory;
  import javax.management.ObjectName;
  
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.lang.reflect.Field;
  import java.net.InetAddress;
  import java.net.ServerSocket;
  import java.net.Socket;
  import java.util.HashMap;
  import java.util.Map;
  import java.util.Timer;
  
  /**
   * @author <a href="mailto:telrod at e2technologies.net">Tom Elrod</a>
   * @author <a href="mailto:mazz at jboss.com">John Mazzitelli</a>
   * @author <a href="mailto:ron.sigal at jboss.com">Ron Sigal</a>
   */
  public class CleanDetectionTestServer extends ServerTestCase
  {
     public static int syncPort = 6502;
     
     protected static Logger log = Logger.getLogger(CleanDetectionTestServer.class);
     protected static String transport;
     protected static int port = 5402;
     protected static Thread serverThread;
     
     protected int detectorPort = 1099;
     protected String contextFactory = "org.jnp.interfaces.NamingContextFactory";
     protected String urlPackage = "org.jboss.naming:org.jnp.interfaces";
     protected Main jserver;
     protected JNDIDetector detector;
     protected Connector connector;
  
     public void setUp() throws Exception
     {
        final String host = InetAddress.getLocalHost().getHostName();
        
        serverThread = new Thread()
        {
           public void run()
           {
              try
              {
                 setupJNDI();
                 setupServer(host);
                 setupDetector();
                 ServerSocket ss = new ServerSocket(syncPort, 0, InetAddress.getLocalHost());
                 log.info("bound to: " + InetAddress.getLocalHost() + ":" + syncPort);
                 Socket s = ss.accept();
                 InputStream is = s.getInputStream();
                 OutputStream os = s.getOutputStream();
                 
                 // Indicate server is started.
                 os.write(3);
                 log.info("indicated server started");
                 
                 is.read();
                 log.info("got request to shut down server");
                 shutdownServer();
                 disableDetector();
                 log.info("shut down server");
                 
                 is.read();
                 log.info("got request to restart server");
                 setupServer(host);
                 setupDetector();
                 os.write(7);
                 log.info("restarted server");
                 
                 is.read();
                 log.info("got request to shut down server");
                 shutdownServer();
                 shutdownDetector();
                 shutdownJNDI();
                 log.info("shut down server");
              }
              catch (Exception e)
              {
                 log.error(e);
                 e.printStackTrace();
              }
           }
        };
        
        serverThread.start();
     }
     
     protected void setupJNDI() throws Exception
     {
        String host = InetAddress.getLocalHost().getHostAddress();
  
        jserver = new Main();
        jserver.setPort(detectorPort);
        jserver.setBindAddress(host);
        jserver.setRmiPort(31000);
        jserver.start();
        System.out.println("Started JNDI server on " + host + ":" + port);
     }
     
     protected void shutdownJNDI()
     {
        jserver.stop();
     }
  
     protected void setupDetector() throws Exception
     {
        // we need an MBeanServer to store our network registry and multicast detector services
        MBeanServer server = MBeanServerFactory.createMBeanServer();
  
        String detectorHost = InetAddress.getLocalHost().getHostName();
  
        detector = new JNDIDetector(getConfiguration());
        // set config info for detector and start it.
        detector.setPort(detectorPort);
        detector.setHost(detectorHost);
        detector.setContextFactory(contextFactory);
        detector.setURLPackage(urlPackage);
  
        server.registerMBean(detector, new ObjectName("remoting:type=JNDIDetector"));
        detector.setCleanDetectionNumber(detector.getCleanDetectionNumber() * 2);
        detector.start();
        log.info("JNDIDetector has been created and is listening for new NetworkRegistries to come online");
     }
     
     
     protected void shutdownDetector() throws Exception
     {
        detector.stop();
     }
  
     
     protected void disableDetector() throws Exception
     {
        Field field = AbstractDetector.class.getDeclaredField("heartbeatTimer");
        field.setAccessible(true);
        Timer heartbeatTimer = (Timer) field.get(detector);
        heartbeatTimer.cancel();
     }
     
     
     /**
      * Sets up our JBoss/Remoting server by creating our Connector on the given locator URI
      * and installing our invocation handler that will handle incoming messages.
      *
      * @param locatorURI defines our server endpoing
      * @throws Exception
      */
     protected void setupServer(String host) throws Exception
     {
        int port = PortUtil.findFreePort(host);
        String locatorURI = getTransport() + "://" + host + ":" + port;
        InvokerLocator locator = new InvokerLocator(locatorURI);
        log.info("Starting remoting server with locator uri of: " + locatorURI);
        connector = new Connector(locator, getConfiguration());
        connector.create();
        SampleInvocationHandler invocationHandler = new SampleInvocationHandler();
        connector.addInvocationHandler("sample", invocationHandler);
        connector.start();
     }
     
     
     protected void shutdownServer()
     {
        String locatorURI = connector.getLocator().getLocatorURI();
        connector.stop();
        log.info("Stopped remoting server with locator uri of: " + locatorURI);
     }
  
     
     protected String getTransport()
     {
        return "socket";
     }
     
     
     /**
      * @return configuration map for Connector and JNDIDetector
      */
     protected Map getConfiguration()
     {
        return new HashMap();
     }
     
     
     public static void main(String[] args)
     {
        try
        {
           CleanDetectionTestServer server = new CleanDetectionTestServer();
           server.setUp();
           serverThread.join();
        }
        catch (Exception e)
        {
           log.error(e);
           e.printStackTrace();
        }
     }
     
  
     /**
      * Simple invocation handler implementation.  This is the handler that processes incoming messages from clients.
      */
     public static class SampleInvocationHandler implements ServerInvocationHandler
     {
        /**
         * This is the method that is called when a new message comes in from a client.
         *
         * @param invocation the incoming client invocation, encapsulates the message object
         * @return the response object we send back to the client.
         * @throws Throwable
         */
        public Object invoke(InvocationRequest invocation) throws Throwable
        {
           // Print out the invocation request
           String msg = invocation.getParameter().toString();
  
           log.info("RECEIVED A CLIENT MESSAGE: " + msg);
  
           String response = "Server received your message that said [" + msg + "]";
  
           if(msg.indexOf("Welcome") > -1)
           {
              response = "Received your welcome message.  Thank you!";
           }
  
           log.info("Returning the following message back to the client: " + response);
  
           return response;
        }
  
        /**
         * Adds a callback handler that will listen for callbacks from the server invoker handler.
         *
         * @param callbackHandler
         */
        public void addListener(InvokerCallbackHandler callbackHandler)
        {
           // NO OP as we do not handle callback listeners in this example
        }
  
        /**
         * Removes the callback handler that was listening for callbacks from the server invoker handler.
         *
         * @param callbackHandler
         */
        public void removeListener(InvokerCallbackHandler callbackHandler)
        {
           // NO OP as we do not handle callback listeners in this example
        }
  
        /**
         * set the mbean server that the handler can reference
         *
         * @param server
         */
        public void setMBeanServer(MBeanServer server)
        {
           // NO OP as we do not need a reference to the MBeanServer for this handler
        }
  
        /**
         * set the invoker that owns this handler
         *
         * @param invoker
         */
        public void setInvoker(ServerInvoker invoker)
        {
           // NO OP as we do not need a reference back to the server invoker
        }
     }
  }
  
  
  
  1.1      date: 2007/03/27 08:22:42;  author: rsigal;  state: Exp;JBossRemoting/src/tests/org/jboss/test/remoting/detection/jndi/CleanDetectionTestCase.java
  
  Index: CleanDetectionTestCase.java
  ===================================================================
  /*
  * JBoss, Home of Professional Open Source
  * Copyright 2005, JBoss Inc., and individual contributors as indicated
  * 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.test.remoting.detection.jndi;
  
  import org.apache.log4j.Level;
  import org.jboss.jrunit.harness.TestDriver;
  
  /**
   * In this JNDIDetector test case, the server will
   * 
   * <ol>
   *  <li>start a Connector and a JNDIDetector
   *  <li>stop the Connector and disable the JNDIDetector, leaving a stale reference to the
   *      Connector in the JNDI server
   *  <li>start a new Connector and JNDIDetector
   * </ol>
   * 
   * The client will get the JNDI bindings after the first Connector has been started, then
   * get the JNDI bindings shortly after the second Connector has been started.  The JNDIConnector
   * should have done a clean detection when the heartbeat started and registered the new
   * Connector with the JNDI server.
   * 
   * See JIRA issue JBREM-730.
   *
   * @author <a href="mailto:telrod at e2technologies.net">Tom Elrod</a>
   * @author <a href="mailto:ron.sigal at jboss.com">Ron Sigal</a>
   */
  public class CleanDetectionTestCase extends TestDriver
  {
  
     /**
      * This method should call the addTestClasses() method with the client class to run, number of clients to run
      * and the server class to run.
      */
     public void declareTestClasses()
     {
        addTestClasses(CleanDetectionTestClient.class.getName(),
                       1,
                       CleanDetectionTestServer.class.getName());
     }
  
     protected Level getTestLogLevel()
     {
        return Level.INFO;
     }
  
     /**
      * How long to wait for test results to be returned from the client(s).  If goes longer than the
      * specified limit, will throw an exception and kill the running test cases.  Default value is
      * RESULTS_TIMEOUT.
      *
      * @return
      */
     protected long getResultsTimeout()
     {
        return 300000;
     }
  
     /**
      * How long for the server test case to wait for tear down message.  If exceeds timeout,
      * will throw exception.  The default value is TEARDOWN_TIMEOUT.
      *
      * @return
      */
     protected long getTearDownTimeout()
     {
        return 300000;
     }
  
     /**
      * How long to allow each of the test cases to run their tests.  If exceeds this timeout
      * will throw exception and kill tests.  The default value is RUN_TEST_TIMEOUT.
      *
      * @return
      */
     protected long getRunTestTimeout()
     {
        return 300000;
     }
  }
  
  
  
  1.1      date: 2007/03/27 08:22:42;  author: rsigal;  state: Exp;JBossRemoting/src/tests/org/jboss/test/remoting/detection/jndi/CleanDetectionTestClient.java
  
  Index: CleanDetectionTestClient.java
  ===================================================================
  /*
  * JBoss, Home of Professional Open Source
  * Copyright 2005, JBoss Inc., and individual contributors as indicated
  * 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.test.remoting.detection.jndi;
  
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.net.InetAddress;
  import java.net.Socket;
  import java.util.Properties;
  
  import javax.naming.Binding;
  import javax.naming.Context;
  import javax.naming.InitialContext;
  import javax.naming.NameAlreadyBoundException;
  import javax.naming.NamingEnumeration;
  import javax.naming.NamingException;
  
  import junit.framework.TestCase;
  
  import org.jboss.logging.Logger;
  import org.jboss.remoting.InvokerLocator;
  import org.jboss.remoting.detection.Detection;
  import org.jboss.remoting.detection.jndi.JNDIDetector;
  
  /**
   * @author <a href="mailto:telrod at e2technologies.net">Tom Elrod</a>
   * @author <a href="mailto:mazz at jboss.com">John Mazzitelli</a>
   * @author <a href="mailto:ron.sigal at jboss.com">Ron Sigal</a>
   */
  public class CleanDetectionTestClient extends TestCase //implements NotificationListener
  {
     private static Logger log = Logger.getLogger(CleanDetectionTestClient.class);
     
     private String detectorHost;
     private int detectorPort = 1099;
     private String contextFactory = "org.jnp.interfaces.NamingContextFactory";
     private String urlPackage = "org.jboss.naming:org.jnp.interfaces";
     
     protected JNDIDetector detector;
     protected int serversDetected;
     protected boolean invocationSucceeded;
     protected Object lock = new Object();
     protected boolean notified;
     
     private Context context;
  
     
     public void testCleanDetect()
     {
        try
        {
           String host = InetAddress.getLocalHost().getHostName();
           
           Socket s = null;
           for (int i = 0; i < 5; i++)
           {
              try
              {
                 s = new Socket(host, CleanDetectionTestServer.syncPort);
                 break;
              }
              catch (Exception e)
              {
                 log.info("Unable to connect to " + host + ":" + CleanDetectionTestServer.syncPort);
                 log.info("Will try again");
                 try
                 {
                    Thread.sleep(2000);
                 }
                 catch (InterruptedException ignored) {}
              }
           }
           InputStream is = s.getInputStream();
           OutputStream os = s.getOutputStream();
           
           // Wait until server has been started.
           is.read();
           
           // Get detection message from JNDI server.
           createContext();
           NamingEnumeration enumeration = context.listBindings("");
           assertTrue(enumeration.hasMore());
           Binding binding = (Binding) enumeration.next();
           assertFalse(enumeration.hasMore());
           log.info(binding);
           assertTrue(binding.getObject() instanceof Detection);
           Detection detection = (Detection) binding.getObject();
           assertEquals(1, detection.getLocators().length);
           InvokerLocator locator = detection.getLocators()[0];
           log.info("locator: " + locator);
  
           // Tell server to shut down.
           os.write(5);
           
           // Tell server to restart.
           os.write(7);
           Thread.sleep(2000);
  
           // Get new detection message from JNDI server.
           enumeration = context.listBindings("");
           assertTrue(enumeration.hasMore());
           binding = (Binding) enumeration.next();
           log.info(binding);
           assertFalse(enumeration.hasMore());
           assertTrue(binding.getObject() instanceof Detection);
           detection = (Detection) binding.getObject();
           assertEquals(1, detection.getLocators().length);
           InvokerLocator newLocator = detection.getLocators()[0];
           log.info("new locator: " + newLocator);
           
           // Verify that JNDIDetector has already discovered that old server is dead and
           // has registered new server.
           assertFalse(locator.equals(newLocator));
  
           // Tell server test is over.
           os.write(9);
        }
        catch (Exception e)
        {
           log.error(e);
           e.printStackTrace();
           fail();
        }
     }
     
     
     private void createContext() throws Exception
     {
        detectorHost = InetAddress.getLocalHost().getHostName();
        
        Properties env = new Properties();
        env.put(Context.INITIAL_CONTEXT_FACTORY, contextFactory);
        env.put(Context.PROVIDER_URL, detectorHost + ":" + detectorPort);
        env.put(Context.URL_PKG_PREFIXES, urlPackage);
  
        InitialContext initialContext = new InitialContext(env);
        
        String subContextName = JNDIDetector.DETECTION_SUBCONTEXT_NAME;
        try
        {
           context = (Context) initialContext.lookup(subContextName);
        }
        catch(NamingException e)
        {
           try
           {
              context = initialContext.createSubcontext(subContextName);
           }
           catch(NameAlreadyBoundException e1)
           {
              log.debug("The sub context " + subContextName + " was created before we could.");
              context = (Context) initialContext.lookup(subContextName);
           }
        }
     }
  
  }
  
  
  



More information about the jboss-cvs-commits mailing list