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");
         }
-
     }
 }