You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by tr...@apache.org on 2007/11/10 15:45:20 UTC
svn commit: r593782 - in /mina:
branches/1.0/core/src/test/java/org/apache/mina/transport/socket/nio/
branches/1.1/core/src/test/java/org/apache/mina/transport/socket/nio/
trunk/core/src/main/java/org/apache/mina/transport/socket/nio/
trunk/core/src/te...
Author: trustin
Date: Sat Nov 10 06:45:19 2007
New Revision: 593782
URL: http://svn.apache.org/viewvc?rev=593782&view=rev
Log:
Added a test case for DIRMINA-472 (Close request for an acceptor-side datagram session doesn't dispose the session.)
* Only trunk had this bug. Simply forgot to call IoSessionRecycler.remove()
Modified:
mina/branches/1.0/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java
mina/branches/1.1/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java
mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioDatagramAcceptor.java
mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java
Modified: mina/branches/1.0/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java
URL: http://svn.apache.org/viewvc/mina/branches/1.0/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java?rev=593782&r1=593781&r2=593782&view=diff
==============================================================================
--- mina/branches/1.0/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java (original)
+++ mina/branches/1.0/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java Sat Nov 10 06:45:19 2007
@@ -76,56 +76,113 @@
Thread.sleep(1000);
- Assert.assertEquals("CROPSECL", connectorHandler.result);
- Assert.assertEquals("CROPRECL", acceptorHandler.result);
+ Assert.assertEquals("CROPSECL", connectorHandler.result.toString());
+ Assert.assertEquals("CROPRECL", acceptorHandler.result.toString());
} finally {
acceptor.unbind(new InetSocketAddress(port));
}
}
+ public void testCloseRequest() throws Exception {
+ int port = AvailablePortFinder.getNextAvailable(1024);
+ DatagramAcceptorConfig config = new DatagramAcceptorConfig();
+ ExpiringSessionRecycler recycler = new ExpiringSessionRecycler(10, 1);
+ config.setSessionRecycler(recycler);
+
+ MockHandler acceptorHandler = new MockHandler();
+ MockHandler connectorHandler = new MockHandler();
+
+ acceptor.bind(new InetSocketAddress(port), acceptorHandler, config);
+
+ try {
+ ConnectFuture future = connector.connect(new InetSocketAddress(
+ "localhost", port), connectorHandler, config);
+ future.join();
+
+ // Write whatever to trigger the acceptor.
+ future.getSession().write(ByteBuffer.allocate(1)).join();
+
+ // Make sure the connection is closed before recycler closes it.
+ while (acceptorHandler.session == null) {
+ Thread.yield();
+ }
+ acceptorHandler.session.close();
+ Assert.assertTrue(
+ acceptorHandler.session.getCloseFuture().join(3000));
+
+ IoSession oldSession = acceptorHandler.session;
+
+ // Wait until all events are processed and clear the state.
+ long startTime = System.currentTimeMillis();
+ while (acceptorHandler.result.length() < 8) {
+ Thread.yield();
+ if (System.currentTimeMillis() - startTime > 5000) {
+ throw new Exception();
+ }
+ }
+ acceptorHandler.result.setLength(0);
+ acceptorHandler.session = null;
+
+ // Write whatever to trigger the acceptor again.
+ future.getSession().write(ByteBuffer.allocate(1)).join();
+
+ // Make sure the connection is closed before recycler closes it.
+ while (acceptorHandler.session == null) {
+ Thread.yield();
+ }
+ acceptorHandler.session.close();
+ Assert.assertTrue(
+ acceptorHandler.session.getCloseFuture().join(3000));
+
+ future.getSession().close().join();
+
+ Assert.assertNotSame(oldSession, acceptorHandler.session);
+ } finally {
+ acceptor.unbind(new InetSocketAddress(port));
+ }
+ }
+
private class MockHandler extends IoHandlerAdapter {
- public IoSession session;
-
- public String result = "";
+ public volatile IoSession session;
+ public final StringBuffer result = new StringBuffer();
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
this.session = session;
- result += "CA";
+ result.append("CA");
}
public void messageReceived(IoSession session, Object message)
throws Exception {
this.session = session;
- result += "RE";
+ result.append("RE");
}
public void messageSent(IoSession session, Object message)
throws Exception {
this.session = session;
- result += "SE";
+ result.append("SE");
}
public void sessionClosed(IoSession session) throws Exception {
this.session = session;
- result += "CL";
+ result.append("CL");
}
public void sessionCreated(IoSession session) throws Exception {
this.session = session;
- result += "CR";
+ result.append("CR");
}
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
this.session = session;
- result += "ID";
+ result.append("ID");
}
public void sessionOpened(IoSession session) throws Exception {
this.session = session;
- result += "OP";
+ result.append("OP");
}
-
}
}
Modified: mina/branches/1.1/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java
URL: http://svn.apache.org/viewvc/mina/branches/1.1/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java?rev=593782&r1=593781&r2=593782&view=diff
==============================================================================
--- mina/branches/1.1/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java (original)
+++ mina/branches/1.1/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java Sat Nov 10 06:45:19 2007
@@ -76,56 +76,120 @@
Thread.sleep(1000);
- Assert.assertEquals("CROPSECL", connectorHandler.result);
- Assert.assertEquals("CROPRECL", acceptorHandler.result);
+ Assert.assertEquals("CROPSECL", connectorHandler.result.toString());
+ Assert.assertEquals("CROPRECL", acceptorHandler.result.toString());
} finally {
acceptor.unbind(new InetSocketAddress(port));
}
}
- private class MockHandler extends IoHandlerAdapter {
- public IoSession session;
+ public void testCloseRequest() throws Exception {
+ int port = AvailablePortFinder.getNextAvailable(1024);
+ DatagramAcceptorConfig config = new DatagramAcceptorConfig();
+ ExpiringSessionRecycler recycler = new ExpiringSessionRecycler(10, 1);
+ config.setSessionRecycler(recycler);
+
+ MockHandler acceptorHandler = new MockHandler();
+ MockHandler connectorHandler = new MockHandler();
+
+ acceptor.bind(new InetSocketAddress(port), acceptorHandler, config);
+
+ try {
+ ConnectFuture future = connector.connect(new InetSocketAddress(
+ "localhost", port), connectorHandler, config);
+ future.join();
+
+ // Write whatever to trigger the acceptor.
+ future.getSession().write(ByteBuffer.allocate(1)).join();
+
+ // Make sure the connection is closed before recycler closes it.
+ while (acceptorHandler.session == null) {
+ Thread.yield();
+ }
+ acceptorHandler.session.close();
+ Assert.assertTrue(
+ acceptorHandler.session.getCloseFuture().join(3000));
+
+ IoSession oldSession = acceptorHandler.session;
+
+ // Wait until all events are processed and clear the state.
+ long startTime = System.currentTimeMillis();
+ while (acceptorHandler.result.length() < 8) {
+ Thread.yield();
+ if (System.currentTimeMillis() - startTime > 5000) {
+ throw new Exception();
+ }
+ }
+ acceptorHandler.result.setLength(0);
+ acceptorHandler.session = null;
+
+ // Write whatever to trigger the acceptor again.
+ future.getSession().write(ByteBuffer.allocate(1)).join();
+
+ // Make sure the connection is closed before recycler closes it.
+ while (acceptorHandler.session == null) {
+ Thread.yield();
+ }
+ acceptorHandler.session.close();
+ Assert.assertTrue(
+ acceptorHandler.session.getCloseFuture().join(3000));
+
+ future.getSession().close().join();
+
+ Assert.assertNotSame(oldSession, acceptorHandler.session);
+ } finally {
+ acceptor.unbind(new InetSocketAddress(port));
+ }
+ }
- public String result = "";
+ private class MockHandler extends IoHandlerAdapter {
+ public volatile IoSession session;
+ public final StringBuffer result = new StringBuffer();
+ @Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
this.session = session;
- result += "CA";
+ result.append("CA");
}
+ @Override
public void messageReceived(IoSession session, Object message)
throws Exception {
this.session = session;
- result += "RE";
+ result.append("RE");
}
+ @Override
public void messageSent(IoSession session, Object message)
throws Exception {
this.session = session;
- result += "SE";
+ result.append("SE");
}
+ @Override
public void sessionClosed(IoSession session) throws Exception {
this.session = session;
- result += "CL";
+ result.append("CL");
}
+ @Override
public void sessionCreated(IoSession session) throws Exception {
this.session = session;
- result += "CR";
+ result.append("CR");
}
+ @Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
this.session = session;
- result += "ID";
+ result.append("ID");
}
+ @Override
public void sessionOpened(IoSession session) throws Exception {
this.session = session;
- result += "OP";
+ result.append("OP");
}
-
}
}
Modified: mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioDatagramAcceptor.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioDatagramAcceptor.java?rev=593782&r1=593781&r2=593782&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioDatagramAcceptor.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioDatagramAcceptor.java Sat Nov 10 06:45:19 2007
@@ -267,6 +267,7 @@
}
public void remove(NioSession session) {
+ getSessionRecycler().remove(session);
getListeners().fireSessionDestroyed(session);
}
Modified: mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java?rev=593782&r1=593781&r2=593782&view=diff
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java Sat Nov 10 06:45:19 2007
@@ -87,63 +87,124 @@
Thread.sleep(1000);
- Assert.assertEquals("CROPSECL", connectorHandler.result);
- Assert.assertEquals("CROPRECL", acceptorHandler.result);
+ Assert.assertEquals("CROPSECL", connectorHandler.result.toString());
+ Assert.assertEquals("CROPRECL", acceptorHandler.result.toString());
+ } finally {
+ acceptor.unbind();
+ }
+ }
+
+ public void testCloseRequest() throws Exception {
+ int port = AvailablePortFinder.getNextAvailable(1024);
+ ExpiringSessionRecycler recycler = new ExpiringSessionRecycler(10, 1);
+
+ MockHandler acceptorHandler = new MockHandler();
+ MockHandler connectorHandler = new MockHandler();
+
+ acceptor.setLocalAddress(new InetSocketAddress(port));
+ acceptor.getSessionConfig().setIdleTime(IdleStatus.READER_IDLE, 1);
+ acceptor.setHandler(acceptorHandler);
+ acceptor.setSessionRecycler(recycler);
+ acceptor.bind();
+
+ try {
+ connector.setHandler(connectorHandler);
+ ConnectFuture future = connector.connect(new InetSocketAddress(
+ "localhost", port));
+ future.awaitUninterruptibly();
+
+ // Write whatever to trigger the acceptor.
+ future.getSession().write(IoBuffer.allocate(1)).awaitUninterruptibly();
+
+ // Make sure the connection is closed before recycler closes it.
+ while (acceptorHandler.session == null) {
+ Thread.yield();
+ }
+ acceptorHandler.session.close();
+ Assert.assertTrue(
+ acceptorHandler.session.getCloseFuture().awaitUninterruptibly(3000));
+
+ IoSession oldSession = acceptorHandler.session;
+
+ // Wait until all events are processed and clear the state.
+ long startTime = System.currentTimeMillis();
+ while (acceptorHandler.result.length() < 8) {
+ Thread.yield();
+ if (System.currentTimeMillis() - startTime > 5000) {
+ throw new Exception();
+ }
+ }
+ acceptorHandler.result.setLength(0);
+ acceptorHandler.session = null;
+
+ // Write whatever to trigger the acceptor again.
+ future.getSession().write(IoBuffer.allocate(1))
+ .awaitUninterruptibly();
+
+ // Make sure the connection is closed before recycler closes it.
+ while (acceptorHandler.session == null) {
+ Thread.yield();
+ }
+ acceptorHandler.session.close();
+ Assert.assertTrue(
+ acceptorHandler.session.getCloseFuture().awaitUninterruptibly(3000));
+
+ future.getSession().close().awaitUninterruptibly();
+
+ Assert.assertNotSame(oldSession, acceptorHandler.session);
} finally {
acceptor.unbind();
}
}
private class MockHandler extends IoHandlerAdapter {
- public IoSession session;
-
- public String result = "";
+ public volatile IoSession session;
+ public final StringBuffer result = new StringBuffer();
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
this.session = session;
- result += "CA";
+ result.append("CA");
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
this.session = session;
- result += "RE";
+ result.append("RE");
}
@Override
public void messageSent(IoSession session, Object message)
throws Exception {
this.session = session;
- result += "SE";
+ result.append("SE");
}
@Override
public void sessionClosed(IoSession session) throws Exception {
this.session = session;
- result += "CL";
+ result.append("CL");
}
@Override
public void sessionCreated(IoSession session) throws Exception {
this.session = session;
- result += "CR";
+ result.append("CR");
}
@Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
this.session = session;
- result += "ID";
+ result.append("ID");
}
@Override
public void sessionOpened(IoSession session) throws Exception {
this.session = session;
- result += "OP";
+ result.append("OP");
}
-
}
}