[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