From jboss-remoting-commits at lists.jboss.org Sat Jul 31 09:44:55 2010 Content-Type: multipart/mixed; boundary="===============8145841819367426193==" MIME-Version: 1.0 From: jboss-remoting-commits at lists.jboss.org To: jboss-remoting-commits at lists.jboss.org Subject: [jboss-remoting-commits] JBoss Remoting SVN: r5945 - remoting2/branches/2.2/src/tests/org/jboss/test/remoting/lease. Date: Sat, 31 Jul 2010 09:44:54 -0400 Message-ID: <201007311344.o6VDisbt029304@svn01.web.mwc.hst.phx2.redhat.com> --===============8145841819367426193== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Author: ron.sigal(a)jboss.com Date: 2010-07-31 09:44:54 -0400 (Sat, 31 Jul 2010) New Revision: 5945 Added: remoting2/branches/2.2/src/tests/org/jboss/test/remoting/lease/LeaseCrea= tionTimeoutTestCase.java Log: JBREM-1238: New unit tests. Added: remoting2/branches/2.2/src/tests/org/jboss/test/remoting/lease/Lease= CreationTimeoutTestCase.java =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- remoting2/branches/2.2/src/tests/org/jboss/test/remoting/lease/LeaseCre= ationTimeoutTestCase.java (rev 0) +++ remoting2/branches/2.2/src/tests/org/jboss/test/remoting/lease/LeaseCre= ationTimeoutTestCase.java 2010-07-31 13:44:54 UTC (rev 5945) @@ -0,0 +1,784 @@ +/* + * JBoss, Home of Professional Open Source + * Copyright 2009, 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.lease; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintStream; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.HashMap; +import java.util.Map; + +import javax.management.MBeanServer; +import javax.net.ServerSocketFactory; + +import junit.framework.TestCase; + +import org.apache.log4j.ConsoleAppender; +import org.apache.log4j.Level; +import org.apache.log4j.PatternLayout; +import org.jboss.logging.Logger; +import org.jboss.logging.Log4jLoggerPlugin; +import org.jboss.logging.XLevel; +import org.jboss.remoting.CannotConnectException; +import org.jboss.remoting.Client; +import org.jboss.remoting.ConnectionListener; +import org.jboss.remoting.InvocationRequest; +import org.jboss.remoting.InvokerLocator; +import org.jboss.remoting.Remoting; +import org.jboss.remoting.ServerInvocationHandler; +import org.jboss.remoting.ServerInvoker; +import org.jboss.remoting.callback.InvokerCallbackHandler; +import org.jboss.remoting.transport.Connector; +import org.jboss.remoting.transport.PortUtil; + + +/** + * Unit test for JBREM-1238. + * = + * @author Ron Sigal + * @version = + *
+ * Copyright July 28, 2010 + *
+ */ +public class LeaseCreationTimeoutTestCase extends TestCase +{ + private static Logger log =3D Logger.getLogger(LeaseCreationTimeoutTest= Case.class); + + protected static int breakServer; + protected static int counter; + + protected String host; + protected int port; + protected String locatorURI; + protected InvokerLocator serverLocator; + protected Connector connector; + protected TestInvocationHandler invocationHandler; + protected PrintStream originalPrintStream; + protected ByteArrayOutputStream baos; + + + public void setUp() throws Exception + { + baos =3D new ByteArrayOutputStream(); + originalPrintStream =3D System.out; + PrintStream ps =3D new PrintStream(baos, true); + System.setOut(ps); + + String pattern =3D "[%d{ABSOLUTE}] [%t] %5p (%F:%L) - %m%n"; + PatternLayout layout =3D new PatternLayout(pattern); + ConsoleAppender consoleAppender =3D new ConsoleAppender(layout); + consoleAppender.setTarget(ConsoleAppender.SYSTEM_OUT); + + Log4jLoggerPlugin loggerPlugin =3D (Log4jLoggerPlugin) Logger.getLog= ger("org.jboss.remoting").getLoggerPlugin(); + org.apache.log4j.Logger logger =3D loggerPlugin.getLogger(); + logger.setLevel(XLevel.TRACE); + logger.addAppender(consoleAppender); + loggerPlugin =3D (Log4jLoggerPlugin) Logger.getLogger("org.jboss.tes= t.remoting").getLoggerPlugin(); + logger =3D loggerPlugin.getLogger(); + logger.setLevel(XLevel.TRACE); + logger.addAppender(consoleAppender); + + breakServer =3D -1; + counter =3D 0; + } + + + public void tearDown() + { + } + + + /** + * Verifies that default value of leaseCreationTimeout is set properly. + */ + public void testLeaseCreationTimeoutDefault() throws Throwable + { + log.info("entering " + getName()); + Client client =3D null; + + try + { + // Start server. + setupServer(-1); + + // Create client. + InvokerLocator clientLocator =3D new InvokerLocator(locatorURI); + HashMap clientConfig =3D new HashMap(); + clientConfig.put(InvokerLocator.FORCE_REMOTE, "true"); + clientConfig.put(Client.ENABLE_LEASE, "true"); + addExtraClientConfig(clientConfig); + client =3D new Client(clientLocator, clientConfig); + client.connect(); + log.info("client is connected"); + + // Test connection. + assertEquals("abc", client.invoke("abc")); + log.info("connection is good"); + + String s =3D baos.toString(); + assertTrue(s.indexOf("setting timeout to 30000 for this invocatio= n") > -1); + assertTrue(s.indexOf("starting lease timer with ping period of") = > -1); + log.info(getName() + " PASSES"); + } + finally + { + client.disconnect(); + shutdownServer(); + originalPrintStream.flush(); + System.setOut(originalPrintStream); + System.out.println("starting to write log"); + String s =3D baos.toString(); + System.out.println(s); + } + } + + + /** + * Verifies that value of leaseCreationTimeout is set properly from con= figuration map. + */ + public void testLeaseCreationTimeoutConfig() throws Throwable + { + log.info("entering " + getName()); + Client client =3D null; + + try + { + // Start server. + setupServer(-1); + + // Create client. + InvokerLocator clientLocator =3D new InvokerLocator(locatorURI); + HashMap clientConfig =3D new HashMap(); + clientConfig.put(InvokerLocator.FORCE_REMOTE, "true"); + clientConfig.put(Client.ENABLE_LEASE, "true"); + clientConfig.put(Remoting.LEASE_CREATION_TIMEOUT, "12345"); + clientConfig.put(ServerInvoker.TIMEOUT, "0"); + addExtraClientConfig(clientConfig); + client =3D new Client(clientLocator, clientConfig); + client.connect(); + log.info("client is connected"); + + // Test connection. + assertEquals("abc", client.invoke("abc")); + log.info("connection is good"); + + String s =3D baos.toString(); + assertTrue(s.indexOf("setting timeout to 12345 for this invocatio= n") > -1); + assertTrue(s.indexOf("starting lease timer with ping period of") = > -1); + log.info(getName() + " PASSES"); + } + finally + { + client.disconnect(); + shutdownServer(); + originalPrintStream.flush(); + System.setOut(originalPrintStream); + System.out.println("starting to write log"); + String s =3D baos.toString(); + System.out.println(s); + } + } + + + /** + * Verifies that MicroRemotingClientInvoker.establishLease() is termina= ted according to + * the value of Remoting.LEASE_CREATION_TIMEOUT so that another new con= nection can + * set up a lease. + */ + public void testLeaseCreationWithBrokenEstablishLease() throws Throwable + { + log.info("entering " + getName()); + Client client1 =3D null; + Client client2 =3D null; + + try + { + // Start server. + setupServer(1); + + // Create client. + InvokerLocator clientLocator =3D new InvokerLocator(locatorURI); + HashMap clientConfig =3D new HashMap(); + clientConfig.put(InvokerLocator.FORCE_REMOTE, "true"); + clientConfig.put(ServerInvoker.TIMEOUT, "0"); + clientConfig.put(Client.ENABLE_LEASE, "true"); + clientConfig.put(Remoting.LEASE_CREATION_TIMEOUT, "5000"); + addExtraClientConfig(clientConfig); + client1 =3D new Client(clientLocator, clientConfig); + + // Should not connect. + BrokenEstablisthLeaseTestThread btt =3D new BrokenEstablisthLease= TestThread(client1); + btt.run(); + + // Should connect. + Thread.sleep(10000); + client2 =3D new Client(clientLocator, clientConfig); + WorkingTestThread ttt =3D new WorkingTestThread(client2); + ttt.run(); + + // Test lease creation. + Thread.sleep(5000); + assertTrue(btt.ok); + assertTrue(ttt.ok); + + log.info(getName() + " PASSES"); + } + finally + { + client1.disconnect(); + client2.disconnect(); + shutdownServer(); + originalPrintStream.flush(); + System.setOut(originalPrintStream); + System.out.println("starting to write log"); + String s =3D baos.toString(); + System.out.println(s); + } + } + + + /** + * Verifies that MicroRemotingClientInvoker.terminateLease() is termina= ted according to + * the value of Remoting.LEASE_CREATION_TIMEOUT so that another new con= nection can + * set up a lease. In this test the hang up is in LeasePinger.removeCl= ient(). + */ + public void testLeaseTerminationWithBrokenRemoveClient() throws Throwab= le + { + log.info("entering " + getName()); + Client client1 =3D null; + Client client2 =3D null; + + try + { + // Start server. + setupServer(4); + + // Create client. + InvokerLocator clientLocator =3D new InvokerLocator(locatorURI); + HashMap clientConfig =3D new HashMap(); + clientConfig.put(InvokerLocator.FORCE_REMOTE, "true"); + clientConfig.put(ServerInvoker.TIMEOUT, "0"); + clientConfig.put(Client.ENABLE_LEASE, "true"); + clientConfig.put(Remoting.LEASE_CREATION_TIMEOUT, "5000"); + addExtraClientConfig(clientConfig); + client1 =3D new Client(clientLocator, clientConfig); + + // Should not terminate properly in call to LeasePinger.removeCli= ent(). + BrokenTerminateLeaseRemoveClientTestThread btt =3D new BrokenTerm= inateLeaseRemoveClientTestThread(client1, baos); + btt.start(); + + // Should connect. + Thread.sleep(10000); + client2 =3D new Client(clientLocator, clientConfig); + WorkingTestThread ttt =3D new WorkingTestThread(client2); + ttt.start(); + + // Test lease creation. + Thread.sleep(5000); + assertTrue(btt.ok); + assertTrue(ttt.ok); + + log.info(getName() + " PASSES"); + } + finally + { + shutdownServer(); + originalPrintStream.flush(); + System.setOut(originalPrintStream); + System.out.println("starting to write log"); + String s =3D baos.toString(); + System.out.println(s); + } + } + + = + /** + * Verifies that MicroRemotingClientInvoker.terminateLease() is termina= ted according to + * the value of Remoting.LEASE_CREATION_TIMEOUT so that another new con= nection can + * set up a lease. In this test the hang up is in LeasePinger.stopPing= (). + */ + public void testLeaseTerminationWithBrokenStopPing() throws Throwable + { + log.info("entering " + getName()); + + try + { + // Start server. + setupServer(5); + + // Create client. + InvokerLocator clientLocator =3D new InvokerLocator(locatorURI); + HashMap clientConfig =3D new HashMap(); + clientConfig.put(InvokerLocator.FORCE_REMOTE, "true"); + clientConfig.put(ServerInvoker.TIMEOUT, "0"); + clientConfig.put(Client.ENABLE_LEASE, "true"); + clientConfig.put(Remoting.LEASE_CREATION_TIMEOUT, "5000"); + addExtraClientConfig(clientConfig); + Client client1 =3D new Client(clientLocator, clientConfig); + + // Should not terminate properly in call to LeasePinger.stopPing(= ). + BrokenTerminateLeaseStopPingTestThread btt =3D new BrokenTerminat= eLeaseStopPingTestThread(client1, baos); + btt.start(); + + // Should connect. + Thread.sleep(10000); + Client client2 =3D new Client(clientLocator, clientConfig); + WorkingTestThread ttt =3D new WorkingTestThread(client2); + ttt.start(); + + // Test lease creation. + Thread.sleep(5000); + assertTrue(btt.ok); + assertTrue(ttt.ok); + + shutdownServer(); + log.info(getName() + " PASSES"); + + } + finally + { + originalPrintStream.flush(); + System.setOut(originalPrintStream); + System.out.println("starting to write log"); + String s =3D baos.toString(); + System.out.println(s); + } + } + = + = + protected String getTransport() + { + return "socket"; + } + + + protected void addExtraClientConfig(Map config) {} + protected void addExtraServerConfig(Map config) {} + + + protected void setupServer(int breakServer) throws Exception + { + host =3D InetAddress.getLocalHost().getHostAddress(); + port =3D PortUtil.findFreePort(host); + locatorURI =3D getTransport() + "://" + host + ":" + port; + String metadata =3D System.getProperty("remoting.metadata"); + if (metadata !=3D null) + { + locatorURI +=3D "/?" + metadata; + } + serverLocator =3D new InvokerLocator(locatorURI); + log.info("Starting remoting server with locator uri of: " + locatorU= RI); + HashMap config =3D new HashMap(); + config.put(InvokerLocator.FORCE_REMOTE, "true"); + config.put(Remoting.USE_CLIENT_CONNECTION_IDENTITY, "true"); + config.put("clientLeasePeriod", "10000"); + if (breakServer > -1) + { + LeaseCreationTimeoutTestCase.breakServer =3D breakServer; + config.put(Remoting.CUSTOM_SERVER_SOCKET_FACTORY, new TestServerS= ocketFactory()); + } + addExtraServerConfig(config); + connector =3D new Connector(serverLocator, config); + connector.create(); + invocationHandler =3D new TestInvocationHandler(); + connector.addInvocationHandler("test", invocationHandler); + connector.addConnectionListener(new TestConnectionListener()); + connector.start(); + } + + + protected void shutdownServer() throws Exception + { + if (connector !=3D null) + connector.stop(); + } + + + static class TestInvocationHandler implements ServerInvocationHandler + { + public void addListener(InvokerCallbackHandler callbackHandler) {} + public Object invoke(final InvocationRequest invocation) throws Thro= wable + { + return invocation.getParameter(); + } + public void removeListener(InvokerCallbackHandler callbackHandler) {} + public void setMBeanServer(MBeanServer server) {} + public void setInvoker(ServerInvoker invoker) {} + } + + = + static class TestConnectionListener implements ConnectionListener + { + public void handleConnectionException(Throwable throwable, Client cl= ient) + { + } + } + + = + static public class TestServerSocketFactory extends ServerSocketFactory + { + public TestServerSocketFactory() + { + } = + public ServerSocket createServerSocket() throws IOException + { + ServerSocket ss =3D new TestServerSocket(); + log.info(this + " returning: " + ss); + return ss; + } + public ServerSocket createServerSocket(int port) throws IOException + { + ServerSocket ss =3D new TestServerSocket(port); + log.info(this + " returning: " + ss); + return ss; + } + + public ServerSocket createServerSocket(int port, int backlog) throws= IOException + { + ServerSocket ss =3D new TestServerSocket(port, backlog); + log.info(this + " returning: " + ss); + return ss; + } + + public ServerSocket createServerSocket(int port, int backlog, InetAd= dress ifAddress) throws IOException + { + ServerSocket ss =3D new TestServerSocket(port, backlog, ifAddress= ); + log.info(this + " returning: " + ss); + return ss; + } + } + + = + static class TestServerSocket extends ServerSocket + { + public TestServerSocket() throws IOException + { + super(); + } + public TestServerSocket(int port) throws IOException + { + super(port); + } + public TestServerSocket(int port, int backlog) throws IOException + { + super(port, backlog); + } + public TestServerSocket(int port, int backlog, InetAddress bindAddr)= throws IOException + { + super(port, backlog, bindAddr); + } + public Socket accept() throws IOException + { + Socket s =3D super.accept(); + TestSocket ts =3D new TestSocket(s); + log.info(this + " returning: " + ts); + return ts; + } + public String toString() + { + return "TestServerSocket[" + getLocalPort() + "]"; + } + } + + = + static class TestSocket extends Socket + { + Socket s; + + public TestSocket(Socket s) + { + this.s =3D s; = + } + public void close() throws IOException + { + s.close(); + } + public InputStream getInputStream() throws IOException + { + return s.getInputStream(); + } + public OutputStream getOutputStream() throws IOException + { + return new TestOutputStream(s.getOutputStream()); + } + public InetAddress getInetAddress() + { + return s.getInetAddress(); = + } + public String toString() + { + return "TestSocket[" + s.getLocalPort() + "->" + s.getPort() + "]= "; + } + } + + + static class TestOutputStream extends OutputStream + { + OutputStream os; + boolean closed; + boolean doThrow =3D true; + + public TestOutputStream(OutputStream os) + { + this.os =3D os; + } + public void close()throws IOException + { + closed =3D true; + super.close(); + log.info(this + " closed"); + } + public void write(int b) throws IOException + { + System.out.print("b: " + b); + if (closed) + { + log.info("TestOutputStream closed, cannot write"); + throw new IOException("closed"); + } + if (doThrow && counter++ =3D=3D breakServer) + { + log.info("sleeping"); + while (true) + { + try + { + Thread.sleep(30000); + } + catch (InterruptedException e) + { + } + } + } + os.write(b); + } + public void write(byte b[], int off, int len) throws IOException + { + System.out.print("b: "); + for (int i =3D 0; i < len; i++) + { + System.out.print(b[i] + " "); + } + System.out.println(""); + if (closed) + { + log.info("TestOutputStream closed, cannot write"); + throw new IOException("closed"); + } + log.info("TestOutputStream: counter =3D " + counter + ", broken = =3D " + breakServer); + if (counter++ =3D=3D breakServer) + { + log.info(this + " sleeping"); + try + { + Thread.sleep(20000); + } + catch (InterruptedException e) + { + } + log.info(this + " woke up"); + } + if (closed) + { + log.info("TestOutputStream closed, cannot write"); + throw new IOException("closed"); + } + try + { + log.info(this + " calling write()"); + doThrow =3D false; + os.write(b, off, len); + os.flush(); + doThrow =3D true; + log.info(this + " back from write()"); + } + catch (IOException e) + { + log.info("exception: ", e); + throw e; + } + } + public void flush() throws IOException + { + os.flush(); + } + } + + + static class BrokenEstablisthLeaseTestThread extends Thread + { + public boolean ok; + Client client; + + public BrokenEstablisthLeaseTestThread(Client client) + { + this.client =3D client; + setName("BrokenEstablisthLeaseTestThread[" + client + "]"); + } + public void run() + { + try + { + log.info(this + " STARTING"); + log.info(this + " trying to connect " + client); + client.connect(); + } + catch (CannotConnectException e) + { + if ("Error setting up client lease upon performing connect.".e= quals(e.getMessage())) + { + ok =3D true; + log.info(this + " got expected exception"); + } + else + { + log.info(this + " got expected exception with unexpected me= ssage: " + e.getMessage()); = + } + } + catch (Exception e) + { + log.error(this + " got unexpected exception: " + e); + } + } + public String toString() + { + return getName(); + } + } + + + static class BrokenTerminateLeaseRemoveClientTestThread extends Thread + { + public boolean ok; + Client client; + ByteArrayOutputStream baos; + + public BrokenTerminateLeaseRemoveClientTestThread(Client client, Byt= eArrayOutputStream baos) + { + this.client =3D client; + this.baos =3D baos; + setName("BrokenTerminateLeaseRemoveClientTestThread[" + client + = "]"); + } + public void run() + { + try + { + log.info(this + " STARTING"); + log.info(this + " trying to connect " + client); + client.connect(); + assertEquals("def", client.invoke("def")); + client.disconnect(); + String s =3D baos.toString(); + assertTrue(s.indexOf("Terminating individual lease for session= id") > -1); + assertTrue(s.indexOf("failed sending disconnect for client lea= se") > -1); + ok =3D true; + } + catch (Throwable t) + { + log.error(this + " got unexpected exception: " + t); + } + } + public String toString() + { + return getName(); + } + } + + + static class BrokenTerminateLeaseStopPingTestThread extends Thread + { + public boolean ok; + Client client; + ByteArrayOutputStream baos; + + public BrokenTerminateLeaseStopPingTestThread(Client client, ByteArr= ayOutputStream baos) + { + this.client =3D client; + this.baos =3D baos; + setName("BrokenTerminateLeaseStopPingTestThread[" + client + "]"); + } + public void run() + { + try + { + log.info(this + " STARTING"); + log.info(this + " trying to connect " + client); + client.connect(); + assertEquals("def", client.invoke("def")); + client.disconnect(); + String s =3D baos.toString(); + assertTrue(s.indexOf("Terminating individual lease for session= id") > -1); + assertFalse(s.indexOf("failed sending disconnect for client le= ase") > -1); + assertTrue(s.indexOf(": disconnectTimeout: 5000") > -1); + assertTrue(s.indexOf("error shutting down lease pinger") > -1); + ok =3D true; + } + catch (Throwable t) + { + log.error(this + " got unexpected exception: " + t); + } + } + public String toString() + { + return getName(); + } + } + = + = + static class WorkingTestThread extends Thread + { + public boolean ok; + Client client; + + public WorkingTestThread(Client client) + { + this.client =3D client; + setName("WorkingTestThread[" + client + "]"); + } + public void run() + { + log.info(this + " STARTING"); + try + { + log.info(this + " trying to connect " + client); + client.connect(); + assertEquals("abc", client.invoke("abc")); + log.info(this + " connection is good"); + ok =3D true; + } + catch (Throwable t) + { + log.error(this + " got unexpected exception: " + t); + } + } + public String toString() + { + return getName(); + } + } +} \ No newline at end of file --===============8145841819367426193==--