This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch 2.2.X
in repository https://gitbox.apache.org/repos/asf/mina.git


The following commit(s) were added to refs/heads/2.2.X by this push:
     new e22760eff Replaced the call to AvailablePortFinder by a call to 
AcceptorBindUtil.tryBind() which will try 10 times instea do bailing out
e22760eff is described below

commit e22760eff36f89b49fa9b94a2a19c3904c4ba9a7
Author: emmanuel lecharny <[email protected]>
AuthorDate: Fri Oct 2 00:24:42 2026 +0200

    Replaced the call to AvailablePortFinder by a call to 
AcceptorBindUtil.tryBind() which will try 10 times instea do bailing out
---
 .../service/AbstractIoServiceDIRMINA1076Test.java  | 11 +--
 .../SSLTestHandshakeExceptionDIRMINA1077Test.java  | 12 +--
 .../ssl/SslFilterScheduledWriteMessagesTest.java   |  8 +-
 .../filter/ssl/SslIdentificationAlgorithmTest.java |  5 +-
 .../stream/AbstractStreamWriteFilterTest.java      | 18 ++---
 .../apache/mina/transport/AbstractBindTest.java    | 53 +++---------
 .../mina/transport/AbstractConnectorTest.java      |  5 +-
 .../mina/transport/AbstractFileRegionTest.java     |  5 +-
 .../apache/mina/transport/EchoProtocolHandler.java | 76 +++++++++++++++++
 .../mina/transport/socket/nio/DIRMINA1041Test.java | 11 ++-
 .../mina/transport/socket/nio/DIRMINA777Test.java  |  5 +-
 .../transport/socket/nio/DatagramBindTest.java     | 37 +++++++++
 .../transport/socket/nio/DatagramConfigTest.java   |  6 +-
 .../transport/socket/nio/DatagramRecyclerTest.java |  9 +--
 .../socket/nio/DatagramSessionIdleTest.java        | 10 ++-
 .../socket/nio/PollingIoProcessorTest.java         |  8 +-
 .../transport/socket/nio/SocketAcceptorTest.java   |  5 +-
 .../mina/transport/socket/nio/SocketBindTest.java  | 36 ++++++++-
 .../mina/transport/vmpipe/VmPipeBindTest.java      | 32 ++++++++
 .../org/apache/mina/util/AcceptorBindUtil.java     | 94 ++++++++++++++++++++++
 20 files changed, 337 insertions(+), 109 deletions(-)

diff --git 
a/mina-core/src/test/java/org/apache/mina/core/service/AbstractIoServiceDIRMINA1076Test.java
 
b/mina-core/src/test/java/org/apache/mina/core/service/AbstractIoServiceDIRMINA1076Test.java
index 4f766fac3..501ca85d9 100644
--- 
a/mina-core/src/test/java/org/apache/mina/core/service/AbstractIoServiceDIRMINA1076Test.java
+++ 
b/mina-core/src/test/java/org/apache/mina/core/service/AbstractIoServiceDIRMINA1076Test.java
@@ -30,13 +30,11 @@ import org.apache.mina.filter.codec.ProtocolCodecFilter;
 import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 import org.apache.mina.transport.socket.nio.NioSocketConnector;
-import org.apache.mina.util.AvailablePortFinder;
+import org.apache.mina.util.AcceptorBindUtil;
 import org.junit.Ignore;
 import org.junit.Test;
 
-import java.io.IOException;
 import java.net.InetSocketAddress;
-import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.util.concurrent.CountDownLatch;
 
@@ -69,12 +67,7 @@ public class AbstractIoServiceDIRMINA1076Test {
 
                     acceptor.getSessionConfig().setReadBufferSize( 2048 );
                     acceptor.getSessionConfig().setIdleTime( 
IdleStatus.BOTH_IDLE, 10 );
-                    int nextAvailable = AvailablePortFinder.getNextAvailable();
-                    try {
-                        acceptor.bind( new InetSocketAddress( nextAvailable ) 
);
-                    } catch ( IOException e1 ) {
-                        throw new RuntimeException( e1 );
-                    }
+                    int nextAvailable = AcceptorBindUtil.tryBind( acceptor );
 
                     final NioSocketConnector connector = new 
NioSocketConnector();
 
diff --git 
a/mina-core/src/test/java/org/apache/mina/core/service/SSLTestHandshakeExceptionDIRMINA1077Test.java
 
b/mina-core/src/test/java/org/apache/mina/core/service/SSLTestHandshakeExceptionDIRMINA1077Test.java
index 157e5a2e3..3ba50ddc0 100644
--- 
a/mina-core/src/test/java/org/apache/mina/core/service/SSLTestHandshakeExceptionDIRMINA1077Test.java
+++ 
b/mina-core/src/test/java/org/apache/mina/core/service/SSLTestHandshakeExceptionDIRMINA1077Test.java
@@ -43,7 +43,7 @@ import 
org.apache.mina.filter.codec.textline.TextLineCodecFactory;
 import org.apache.mina.filter.ssl.SslFilter;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 import org.apache.mina.transport.socket.nio.NioSocketConnector;
-import org.apache.mina.util.AvailablePortFinder;
+import org.apache.mina.util.AcceptorBindUtil;
 import org.junit.Ignore;
 import org.junit.Test;
 
@@ -54,7 +54,7 @@ import org.junit.Test;
  * @author chrjohn
  */
 public class SSLTestHandshakeExceptionDIRMINA1077Test {
-    private int port = AvailablePortFinder.getNextAvailable();
+    private int port;
     private static InetAddress address;
     private static NioSocketAcceptor acceptor;
 
@@ -83,7 +83,7 @@ public class SSLTestHandshakeExceptionDIRMINA1077Test {
      * Starts a Server with the SSL Filter and a simple text line 
      * protocol codec filter
      */
-    private void startServer(int port) throws Exception {
+    private int startServer(int port) throws Exception {
         acceptor = new NioSocketAcceptor();
 
         acceptor.setReuseAddress(true);
@@ -98,7 +98,8 @@ public class SSLTestHandshakeExceptionDIRMINA1077Test {
         filters.addLast("text", new ProtocolCodecFilter(new 
TextLineCodecFactory()));
 
         acceptor.setHandler(new TestHandler());
-        acceptor.bind(new InetSocketAddress(port));
+        
+        return AcceptorBindUtil.tryBind( acceptor );
     }
     
     private static void stopServer() {
@@ -157,9 +158,8 @@ public class SSLTestHandshakeExceptionDIRMINA1077Test {
         // without DIRMINA-1076/1077 fixed, the test will hang after short time
         while (System.currentTimeMillis() < startTime + 10000) {
             try {
-                port = AvailablePortFinder.getNextAvailable();
                 final CountDownLatch disposalLatch = new CountDownLatch( 1 );
-                startServer(port);
+                port = startServer(port);
                 
                 Thread t = new Thread() {
                     public void run() {
diff --git 
a/mina-core/src/test/java/org/apache/mina/filter/ssl/SslFilterScheduledWriteMessagesTest.java
 
b/mina-core/src/test/java/org/apache/mina/filter/ssl/SslFilterScheduledWriteMessagesTest.java
index e6bb137b4..b01141668 100644
--- 
a/mina-core/src/test/java/org/apache/mina/filter/ssl/SslFilterScheduledWriteMessagesTest.java
+++ 
b/mina-core/src/test/java/org/apache/mina/filter/ssl/SslFilterScheduledWriteMessagesTest.java
@@ -30,7 +30,7 @@ import org.apache.mina.filter.codec.ProtocolCodecFilter;
 import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 import org.apache.mina.transport.socket.nio.NioSocketConnector;
-import org.apache.mina.util.AvailablePortFinder;
+import org.apache.mina.util.AcceptorBindUtil;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -71,7 +71,6 @@ public class SslFilterScheduledWriteMessagesTest {
     public void setUp() {
         handshakeDone = new CountDownLatch(2);
         sessionsOpened = new CountDownLatch(2);
-        port = AvailablePortFinder.getNextAvailable(5555);
     }
 
     @Test
@@ -206,7 +205,8 @@ public class SslFilterScheduledWriteMessagesTest {
         filters.addLast("text", new ProtocolCodecFilter(new 
TextLineCodecFactory()));
 
         acceptor.setHandler(handler);
-        acceptor.bind(new InetSocketAddress(port));
+        
+        port = AcceptorBindUtil.tryBind(acceptor);
 
         return acceptor;
     }
@@ -223,7 +223,7 @@ public class SslFilterScheduledWriteMessagesTest {
         filters.addLast("text", new ProtocolCodecFilter(new 
TextLineCodecFactory()));
 
         acceptor.setHandler(handler);
-        acceptor.bind(new InetSocketAddress(port));
+        port = AcceptorBindUtil.tryBind(acceptor);
 
         return acceptor;
     }
diff --git 
a/mina-core/src/test/java/org/apache/mina/filter/ssl/SslIdentificationAlgorithmTest.java
 
b/mina-core/src/test/java/org/apache/mina/filter/ssl/SslIdentificationAlgorithmTest.java
index 03f03d6cc..65a3e7349 100644
--- 
a/mina-core/src/test/java/org/apache/mina/filter/ssl/SslIdentificationAlgorithmTest.java
+++ 
b/mina-core/src/test/java/org/apache/mina/filter/ssl/SslIdentificationAlgorithmTest.java
@@ -28,7 +28,7 @@ import org.apache.mina.filter.codec.ProtocolCodecFilter;
 import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 import org.apache.mina.transport.socket.nio.NioSocketConnector;
-import org.apache.mina.util.AvailablePortFinder;
+import org.apache.mina.util.AcceptorBindUtil;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -154,7 +154,6 @@ public class SslIdentificationAlgorithmTest {
 
     @Before
     public void setUp() {
-        port = AvailablePortFinder.getNextAvailable(5555);
         handshakeDone = new CountDownLatch(2);
     }
 
@@ -277,7 +276,7 @@ public class SslIdentificationAlgorithmTest {
             }
         });
 
-        acceptor.bind(new InetSocketAddress(port));
+        port = AcceptorBindUtil.tryBind(acceptor);
     }
 
     private void startConnector(SSLContext sslContext, String sni) {
diff --git 
a/mina-core/src/test/java/org/apache/mina/filter/stream/AbstractStreamWriteFilterTest.java
 
b/mina-core/src/test/java/org/apache/mina/filter/stream/AbstractStreamWriteFilterTest.java
index 798891f54..c12a1ce54 100644
--- 
a/mina-core/src/test/java/org/apache/mina/filter/stream/AbstractStreamWriteFilterTest.java
+++ 
b/mina-core/src/test/java/org/apache/mina/filter/stream/AbstractStreamWriteFilterTest.java
@@ -45,7 +45,7 @@ import org.apache.mina.core.write.DefaultWriteRequest;
 import org.apache.mina.core.write.WriteRequest;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 import org.apache.mina.transport.socket.nio.NioSocketConnector;
-import org.apache.mina.util.AvailablePortFinder;
+import org.apache.mina.util.AcceptorBindUtil;
 import org.easymock.IArgumentMatcher;
 import org.easymock.EasyMock;
 import org.junit.Test;
@@ -325,27 +325,27 @@ public abstract class AbstractStreamWriteFilterTest<M, U 
extends AbstractStreamW
 
     @Test
     public void testWriteUsingSocketTransport() throws Exception {
-        NioSocketAcceptor acceptor = new NioSocketAcceptor();
-        acceptor.setReuseAddress(true);
-        SocketAddress address = new InetSocketAddress("localhost", 
AvailablePortFinder.getNextAvailable());
-
-        NioSocketConnector connector = new NioSocketConnector();
-
         // Generate 4MB of random data
         byte[] data = new byte[4 * 1024 * 1024];
         new Random().nextBytes(data);
 
         byte[] expectedMd5 = MessageDigest.getInstance("MD5").digest(data);
-
         M message = createMessage(data);
 
+        // Create the acceptor
+        NioSocketAcceptor acceptor = new NioSocketAcceptor();
         SenderHandler sender = new SenderHandler(message);
         ReceiverHandler receiver = new ReceiverHandler(data.length);
 
         acceptor.setHandler(sender);
+        acceptor.setReuseAddress(true);
+
+        int nextAvailable = AcceptorBindUtil.tryBind( acceptor );
+        SocketAddress address = new InetSocketAddress("localhost", 
nextAvailable);
+
+        NioSocketConnector connector = new NioSocketConnector();
         connector.setHandler(receiver);
 
-        acceptor.bind(address);
         connector.connect(address);
         sender.latch.await();
         receiver.latch.await();
diff --git 
a/mina-core/src/test/java/org/apache/mina/transport/AbstractBindTest.java 
b/mina-core/src/test/java/org/apache/mina/transport/AbstractBindTest.java
index 860810ea2..c0bf4a652 100644
--- a/mina-core/src/test/java/org/apache/mina/transport/AbstractBindTest.java
+++ b/mina-core/src/test/java/org/apache/mina/transport/AbstractBindTest.java
@@ -37,11 +37,8 @@ import org.apache.mina.core.service.IoConnector;
 import org.apache.mina.core.service.IoHandlerAdapter;
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
-import org.apache.mina.transport.socket.DatagramAcceptor;
-import org.apache.mina.transport.socket.DatagramSessionConfig;
-import org.apache.mina.transport.socket.SocketAcceptor;
 import org.apache.mina.transport.socket.SocketSessionConfig;
-import org.apache.mina.util.AvailablePortFinder;
+
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Ignore;
@@ -69,42 +66,9 @@ public abstract class AbstractBindTest {
 
     protected abstract IoConnector newConnector();
 
-    protected void bind(boolean reuseAddress) throws IOException {
-        acceptor.setHandler(new EchoProtocolHandler());
-
-        setReuseAddress(reuseAddress);
-
-        // Find an available test port and bind to it.
-        boolean socketBound = false;
-
-        // Let's start from port #1 to detect possible resource leak
-        // because test will fail in port 1-1023 if user run this test
-        // as a normal user.
-        port = AvailablePortFinder.getNextAvailable();
-        socketBound = false;
-        try {
-            acceptor.setDefaultLocalAddress(createSocketAddress(port));
-            acceptor.bind();
-            socketBound = true;
-        } catch (IOException e) {
-            //System.out.println(e.getMessage());
-        }
-
-        // If there is no port available, test fails.
-        if (!socketBound) {
-            throw new IOException("Cannot bind any test port.");
-        }
-
-        //System.out.println( "Using port " + port + " for testing." );
-    }
-
-    private void setReuseAddress(boolean reuseAddress) {
-        if (acceptor instanceof DatagramAcceptor) {
-            ((DatagramSessionConfig) 
acceptor.getSessionConfig()).setReuseAddress(reuseAddress);
-        } else if (acceptor instanceof SocketAcceptor) {
-            ((SocketAcceptor) acceptor).setReuseAddress(reuseAddress);
-        }
-    }
+    protected abstract void bind(boolean reuseAddress) throws IOException;
+    
+    protected abstract void setReuseAddress(boolean reuseAddress) throws 
IOException;
 
     @After
     public void tearDown() {
@@ -160,12 +124,17 @@ public abstract class AbstractBindTest {
     public void testManyTimes() throws IOException, InterruptedException {
         bind(true);
 
+        //long t0 = System.nanoTime();
         for (int i = 0; i < 1024; i++) {
             Assert.assertTrue("Bound addresses is empty", 
acceptor.getLocalAddresses().size() > 0);
             acceptor.unbind();
-            Thread.sleep(5);
+            //Thread.sleep(2);
             Assert.assertTrue("Bound addresses is not empty", 
acceptor.getLocalAddresses().size() == 0);
             acceptor.bind();
+            //long t1 = System.nanoTime();
+
+            //System.out.println("Iteration #" + i + " in " + (t1 - t0) + 
"ns");
+            //t0 = t1;
         }
 
         acceptor.unbind();
@@ -264,7 +233,7 @@ public abstract class AbstractBindTest {
         bind(false);
     }
 
-    private static class EchoProtocolHandler extends IoHandlerAdapter {
+    protected static class EchoProtocolHandler extends IoHandlerAdapter {
         private static final Logger LOG = 
LoggerFactory.getLogger(EchoProtocolHandler.class);
 
         /**
diff --git 
a/mina-core/src/test/java/org/apache/mina/transport/AbstractConnectorTest.java 
b/mina-core/src/test/java/org/apache/mina/transport/AbstractConnectorTest.java
index 82a79beac..0c5568e41 100644
--- 
a/mina-core/src/test/java/org/apache/mina/transport/AbstractConnectorTest.java
+++ 
b/mina-core/src/test/java/org/apache/mina/transport/AbstractConnectorTest.java
@@ -38,6 +38,7 @@ import org.apache.mina.core.service.IoConnector;
 import org.apache.mina.core.service.IoHandlerAdapter;
 import org.apache.mina.core.session.IoSession;
 import org.apache.mina.core.session.IoSessionInitializer;
+import org.apache.mina.util.AcceptorBindUtil;
 import org.apache.mina.util.AvailablePortFinder;
 import org.junit.Test;
 
@@ -54,10 +55,10 @@ public abstract class AbstractConnectorTest {
 
     @Test
     public void testConnectFutureSuccessTiming() throws Exception {
-        int port = AvailablePortFinder.getNextAvailable(1025);
         IoAcceptor acceptor = createAcceptor();
         acceptor.setHandler(new IoHandlerAdapter());
-        acceptor.bind(new InetSocketAddress(port));
+        
+        int port = AcceptorBindUtil.tryBind( acceptor );
 
         try {
             final StringBuffer buf = new StringBuffer();
diff --git 
a/mina-core/src/test/java/org/apache/mina/transport/AbstractFileRegionTest.java 
b/mina-core/src/test/java/org/apache/mina/transport/AbstractFileRegionTest.java
index 965822160..90b24a29b 100644
--- 
a/mina-core/src/test/java/org/apache/mina/transport/AbstractFileRegionTest.java
+++ 
b/mina-core/src/test/java/org/apache/mina/transport/AbstractFileRegionTest.java
@@ -37,7 +37,7 @@ import org.apache.mina.core.service.IoConnector;
 import org.apache.mina.core.service.IoHandlerAdapter;
 import org.apache.mina.core.session.IoSession;
 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
-import org.apache.mina.util.AvailablePortFinder;
+import org.apache.mina.util.AcceptorBindUtil;
 import org.junit.Test;
 
 /**
@@ -62,7 +62,6 @@ public abstract class AbstractFileRegionTest {
         final boolean[] success = { false };
         final Throwable[] exception = { null };
 
-        int port = AvailablePortFinder.getNextAvailable(1025);
         IoAcceptor acceptor = createAcceptor();
         IoConnector connector = createConnector();
 
@@ -107,7 +106,7 @@ public abstract class AbstractFileRegionTest {
 
             ((NioSocketAcceptor) acceptor).setReuseAddress(true);
 
-            acceptor.bind(new InetSocketAddress(port));
+            int port = AcceptorBindUtil.tryBind( acceptor );
 
             connector.setHandler(new IoHandlerAdapter() {
                 @Override
diff --git 
a/mina-core/src/test/java/org/apache/mina/transport/EchoProtocolHandler.java 
b/mina-core/src/test/java/org/apache/mina/transport/EchoProtocolHandler.java
new file mode 100644
index 000000000..d0f299864
--- /dev/null
+++ b/mina-core/src/test/java/org/apache/mina/transport/EchoProtocolHandler.java
@@ -0,0 +1,76 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.mina.transport;
+
+import org.apache.mina.core.buffer.IoBuffer;
+import org.apache.mina.core.service.IoHandlerAdapter;
+import org.apache.mina.core.session.IdleStatus;
+import org.apache.mina.core.session.IoSession;
+import org.apache.mina.transport.socket.SocketSessionConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/** 
+ * A test IoHandler that just return what it receives to teh client
+ * 
+ * @author <a href="http://mina.apache.org";>Apache MINA Project</a>
+ */
+public class EchoProtocolHandler extends IoHandlerAdapter {
+    private static final Logger LOG = 
LoggerFactory.getLogger(EchoProtocolHandler.class);
+
+    /**
+     * Default constructor
+     */
+    public EchoProtocolHandler() {
+        super();
+    }
+
+    @Override
+    public void sessionCreated(IoSession session) {
+        if (session.getConfig() instanceof SocketSessionConfig) {
+            ((SocketSessionConfig) 
session.getConfig()).setReceiveBufferSize(2048);
+        }
+
+        session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
+    }
+
+    @Override
+    public void sessionIdle(IoSession session, IdleStatus status) {
+        LOG.info("*** IDLE #" + session.getIdleCount(IdleStatus.BOTH_IDLE) + " 
***");
+    }
+
+    @Override
+    public void exceptionCaught(IoSession session, Throwable cause) {
+        //cause.printStackTrace();
+        session.closeNow();
+    }
+
+    @Override
+    public void messageReceived(IoSession session, Object message) throws 
Exception {
+        if (!(message instanceof IoBuffer)) {
+            return;
+        }
+
+        IoBuffer rb = (IoBuffer) message;
+        // Write the received data back to remote peer
+        IoBuffer wb = rb.duplicate();
+        session.write(wb);
+    }
+}
diff --git 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DIRMINA1041Test.java
 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DIRMINA1041Test.java
index 0ddff9930..86a021f2b 100644
--- 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DIRMINA1041Test.java
+++ 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DIRMINA1041Test.java
@@ -19,7 +19,6 @@
  */
 package org.apache.mina.transport.socket.nio;
 
-import org.apache.mina.core.buffer.IoBuffer;
 import org.apache.mina.core.future.CloseFuture;
 import org.apache.mina.core.future.ConnectFuture;
 import org.apache.mina.core.future.WriteFuture;
@@ -29,7 +28,7 @@ import org.apache.mina.filter.codec.ProtocolCodecFilter;
 import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
 import org.apache.mina.transport.socket.SocketAcceptor;
 import org.apache.mina.transport.socket.SocketConnector;
-import org.apache.mina.util.AvailablePortFinder;
+import org.apache.mina.util.AcceptorBindUtil;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -44,7 +43,7 @@ public class DIRMINA1041Test {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(DIRMINA1041Test.class);
     private static final String HOST = "localhost";
-    private static final int PORT = AvailablePortFinder.getNextAvailable(); 
+    private int port; 
     private static final long TIMEOUT = 10000L;
     private static int counter = 0;
     private SocketAcceptor acceptor;
@@ -55,7 +54,7 @@ public class DIRMINA1041Test {
         acceptor = new NioSocketAcceptor();
         acceptor.setReuseAddress(true);
         acceptor.setHandler(new SomeAcceptHandler());
-        acceptor.bind(new InetSocketAddress(HOST, PORT));
+        port = AcceptorBindUtil.tryBind( acceptor );
 
         connector = new NioSocketConnector();
         connector.getSessionConfig().setReuseAddress(true);
@@ -65,7 +64,7 @@ public class DIRMINA1041Test {
 
     @Test
     public void testWrite() throws InterruptedException {
-        SocketAddress address = new InetSocketAddress(HOST, PORT);
+        SocketAddress address = new InetSocketAddress(HOST, port);
         
         try {
             for (int i = 0; i < 10000; i++) {
@@ -112,7 +111,7 @@ public class DIRMINA1041Test {
     }
 
     private IoSession getSession() {
-        ConnectFuture future = connector.connect(new InetSocketAddress(HOST, 
PORT));
+        ConnectFuture future = connector.connect(new InetSocketAddress(HOST, 
port));
         if (!future.awaitUninterruptibly(TIMEOUT)) {
             
             Assert.fail("ConnectFuture did not complete.");
diff --git 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DIRMINA777Test.java
 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DIRMINA777Test.java
index 630fe97fe..9571484b5 100644
--- 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DIRMINA777Test.java
+++ 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DIRMINA777Test.java
@@ -30,7 +30,7 @@ import org.apache.mina.core.future.ReadFuture;
 import org.apache.mina.core.service.IoConnector;
 import org.apache.mina.core.service.IoHandlerAdapter;
 import org.apache.mina.core.session.IoSession;
-import org.apache.mina.util.AvailablePortFinder;
+import org.apache.mina.util.AcceptorBindUtil;
 import org.junit.Test;
 
 /**
@@ -42,7 +42,6 @@ public class DIRMINA777Test {
 
     @Test
     public void checkReadFuture() throws Throwable {
-        int port = AvailablePortFinder.getNextAvailable();
         NioSocketAcceptor acceptor = new NioSocketAcceptor();
         acceptor.setReuseAddress(true);
         acceptor.setHandler(new IoHandlerAdapter() {
@@ -57,7 +56,7 @@ public class DIRMINA777Test {
 
         });
 
-        acceptor.bind(new InetSocketAddress(port));
+        int port = AcceptorBindUtil.tryBind( acceptor );
 
         try {
             IoConnector connector = new NioSocketConnector();
diff --git 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DatagramBindTest.java
 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DatagramBindTest.java
index c01502209..f2b2a0b7a 100644
--- 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DatagramBindTest.java
+++ 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DatagramBindTest.java
@@ -19,11 +19,14 @@
  */
 package org.apache.mina.transport.socket.nio;
 
+import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 
 import org.apache.mina.core.service.IoConnector;
 import org.apache.mina.transport.AbstractBindTest;
+import org.apache.mina.transport.socket.DatagramSessionConfig;
+import org.apache.mina.util.AvailablePortFinder;
 
 /**
  * Tests {@link NioDatagramAcceptor} resource leakage.
@@ -50,4 +53,38 @@ public class DatagramBindTest extends AbstractBindTest {
     protected IoConnector newConnector() {
         return new NioDatagramConnector();
     }
+
+    @Override
+    protected void bind( boolean reuseAddress ) throws IOException
+    {
+        acceptor.setHandler(new EchoProtocolHandler());
+
+        setReuseAddress(reuseAddress);
+
+        // Find an available test port and bind to it.
+        int nbTry = 10;
+        
+        while (true) {
+            try {
+                port = AvailablePortFinder.getNextAvailable();
+                acceptor.setDefaultLocalAddress(createSocketAddress(port));
+                acceptor.bind();
+                break;
+            } catch (RuntimeException re ) {
+                nbTry--;
+                
+                System.out.println( "Retrying #" + ( 10 - nbTry) );
+                
+                if (nbTry == 0) {
+                    throw new IOException("Cannot bind any test port.");
+                }
+            }
+        }
+    }
+
+    @Override
+    protected void setReuseAddress( boolean reuseAddress ) throws IOException
+    {
+        ((DatagramSessionConfig) 
acceptor.getSessionConfig()).setReuseAddress(reuseAddress);
+    }
 }
diff --git 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DatagramConfigTest.java
 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DatagramConfigTest.java
index c9735c052..be121b12b 100644
--- 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DatagramConfigTest.java
+++ 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DatagramConfigTest.java
@@ -35,7 +35,7 @@ import org.apache.mina.core.service.IoConnector;
 import org.apache.mina.core.service.IoHandler;
 import org.apache.mina.core.service.IoHandlerAdapter;
 import org.apache.mina.core.session.IoSession;
-import org.apache.mina.util.AvailablePortFinder;
+import org.apache.mina.util.AcceptorBindUtil;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -71,13 +71,13 @@ public class DatagramConfigTest {
 
     @Test
     public void testAcceptorFilterChain() throws Exception {
-        int port = AvailablePortFinder.getNextAvailable(1024 + 1000);
         IoFilter mockFilter = new MockFilter();
         IoHandler mockHandler = new MockHandler();
 
         acceptor.getFilterChain().addLast("mock", mockFilter);
         acceptor.setHandler(mockHandler);
-        acceptor.bind(new InetSocketAddress(port));
+        
+        int port = AcceptorBindUtil.tryBind( acceptor );
 
         try {
             connector.setHandler(new IoHandlerAdapter());
diff --git 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java
 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java
index 38427084d..6d18d8e90 100644
--- 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java
+++ 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DatagramRecyclerTest.java
@@ -32,7 +32,7 @@ import org.apache.mina.core.service.IoHandlerAdapter;
 import org.apache.mina.core.session.ExpiringSessionRecycler;
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
-import org.apache.mina.util.AvailablePortFinder;
+import org.apache.mina.util.AcceptorBindUtil;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -65,7 +65,6 @@ public class DatagramRecyclerTest {
 
     @Test
     public void testDatagramRecycler() throws Exception {
-        int port = AvailablePortFinder.getNextAvailable(1024);
         ExpiringSessionRecycler recycler = new ExpiringSessionRecycler(1, 1);
 
         MockHandler acceptorHandler = new MockHandler();
@@ -73,7 +72,7 @@ public class DatagramRecyclerTest {
 
         acceptor.setHandler(acceptorHandler);
         acceptor.setSessionRecycler(recycler);
-        acceptor.bind(new InetSocketAddress(port));
+        int port = AcceptorBindUtil.tryBind( acceptor );
 
         try {
             connector.setHandler(connectorHandler);
@@ -110,7 +109,6 @@ public class DatagramRecyclerTest {
 
     @Test
     public void testCloseRequest() throws Exception {
-        int port = AvailablePortFinder.getNextAvailable(1024);
         ExpiringSessionRecycler recycler = new ExpiringSessionRecycler(10, 1);
 
         MockHandler acceptorHandler = new MockHandler();
@@ -119,7 +117,8 @@ public class DatagramRecyclerTest {
         acceptor.getSessionConfig().setIdleTime(IdleStatus.READER_IDLE, 1);
         acceptor.setHandler(acceptorHandler);
         acceptor.setSessionRecycler(recycler);
-        acceptor.bind(new InetSocketAddress(port));
+        
+        int port = AcceptorBindUtil.tryBind( acceptor );
 
         try {
             connector.setHandler(connectorHandler);
diff --git 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DatagramSessionIdleTest.java
 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DatagramSessionIdleTest.java
index 8d72bc1f7..b4fffdca5 100644
--- 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DatagramSessionIdleTest.java
+++ 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/DatagramSessionIdleTest.java
@@ -24,11 +24,12 @@ import static org.junit.Assert.assertTrue;
 
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
+import java.net.SocketAddress;
 
 import org.apache.mina.core.service.IoHandlerAdapter;
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
-import org.apache.mina.util.AvailablePortFinder;
+import org.apache.mina.util.AcceptorBindUtil;
 import org.junit.Test;
 
 /**
@@ -76,11 +77,12 @@ public class DatagramSessionIdleTest {
         acceptor.getSessionConfig().setBothIdleTime(BOTH_IDLE_TIME);
         acceptor.getSessionConfig().setReaderIdleTime(READER_IDLE_TIME);
         acceptor.getSessionConfig().setWriterIdleTime(WRITER_IDLE_TIME);
-        InetSocketAddress bindAddress = new 
InetSocketAddress(AvailablePortFinder.getNextAvailable());
         acceptor.setHandler(new TestHandler());
-        acceptor.bind(bindAddress);
+        int port = AcceptorBindUtil.tryBind(acceptor);
+        SocketAddress bindAddress = new InetSocketAddress(port);
+
         IoSession session = acceptor.newSession(
-                new InetSocketAddress(InetAddress.getByName(null), 
AvailablePortFinder.getNextAvailable()), bindAddress);
+                new InetSocketAddress(InetAddress.getByName(null), port), 
bindAddress);
 
         //check properties to be copied from acceptor to session
         assertEquals(BOTH_IDLE_TIME, session.getConfig().getBothIdleTime());
diff --git 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/PollingIoProcessorTest.java
 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/PollingIoProcessorTest.java
index 224b2fe83..96a73cde2 100644
--- 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/PollingIoProcessorTest.java
+++ 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/PollingIoProcessorTest.java
@@ -38,7 +38,7 @@ import org.apache.mina.core.service.IoConnector;
 import org.apache.mina.core.service.IoHandlerAdapter;
 import org.apache.mina.core.session.IoSession;
 import org.apache.mina.core.session.SessionState;
-import org.apache.mina.util.AvailablePortFinder;
+import org.apache.mina.util.AcceptorBindUtil;
 import org.junit.Ignore;
 import org.junit.Test;
 
@@ -172,10 +172,8 @@ public class PollingIoProcessorTest {
         IoAcceptor acceptor = new NioSocketAcceptor();
         acceptor.setHandler(new IoHandlerAdapter());
 
-        InetSocketAddress addr = new InetSocketAddress("localhost", 
AvailablePortFinder.getNextAvailable(20000));
-
-        acceptor.bind(addr);
-        ConnectFuture future = connector.connect(addr);
+        int port = AcceptorBindUtil.tryBind( acceptor );
+        ConnectFuture future = connector.connect(new 
InetSocketAddress("localhost", port));
         future.awaitUninterruptibly();
         IoSession session = future.getSession();
         WriteFuture wf = 
session.write(IoBuffer.allocate(1)).awaitUninterruptibly();
diff --git 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/SocketAcceptorTest.java
 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/SocketAcceptorTest.java
index 3c09ccc87..6b5995435 100644
--- 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/SocketAcceptorTest.java
+++ 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/SocketAcceptorTest.java
@@ -24,7 +24,7 @@ import java.util.Collection;
 import java.util.concurrent.CountDownLatch;
 
 import org.apache.mina.core.service.IoHandlerAdapter;
-import org.apache.mina.util.AvailablePortFinder;
+import org.apache.mina.util.AcceptorBindUtil;
 import org.junit.Test;
 
 public class SocketAcceptorTest {
@@ -58,9 +58,8 @@ public class SocketAcceptorTest {
         acceptor.setReuseAddress(true);
         acceptor.setHandler(new IoHandlerAdapter());
         try {
-            int port = AvailablePortFinder.getNextAvailable(1025);
+            int port = AcceptorBindUtil.tryBind(acceptor);
             InetSocketAddress address = new InetSocketAddress("127.0.0.1", 
port);
-            acceptor.bind(address);
             acceptor.unbind(address);
             acceptor.bind(address);
             acceptor.unbind(address);
diff --git 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/SocketBindTest.java
 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/SocketBindTest.java
index 9018e9d73..880cf7873 100644
--- 
a/mina-core/src/test/java/org/apache/mina/transport/socket/nio/SocketBindTest.java
+++ 
b/mina-core/src/test/java/org/apache/mina/transport/socket/nio/SocketBindTest.java
@@ -19,11 +19,14 @@
  */
 package org.apache.mina.transport.socket.nio;
 
+import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 
 import org.apache.mina.core.service.IoConnector;
 import org.apache.mina.transport.AbstractBindTest;
+import org.apache.mina.transport.socket.SocketAcceptor;
+import org.apache.mina.util.AvailablePortFinder;
 
 /**
  * Tests {@link NioSocketAcceptor} resource leakage.
@@ -31,9 +34,8 @@ import org.apache.mina.transport.AbstractBindTest;
  * @author <a href="http://mina.apache.org";>Apache MINA Project</a>
  */
 public class SocketBindTest extends AbstractBindTest {
-
     public SocketBindTest() {
-        super(new NioSocketAcceptor());
+        super(new NioSocketAcceptor() );
     }
 
     @Override
@@ -50,4 +52,34 @@ public class SocketBindTest extends AbstractBindTest {
     protected IoConnector newConnector() {
         return new NioSocketConnector();
     }
+    
+    @Override
+    protected void setReuseAddress(boolean reuseAddress) {
+        ((SocketAcceptor) acceptor).setReuseAddress(reuseAddress);
+    }
+
+    @Override
+    protected void bind(boolean reuseAddress) throws IOException {
+        acceptor.setHandler(new EchoProtocolHandler());
+
+        setReuseAddress(reuseAddress);
+
+        // Find an available test port and bind to it.
+        int nbTry = 10;
+        
+        while (true) {
+            try {
+                port = AvailablePortFinder.getNextAvailable();
+                acceptor.setDefaultLocalAddress(createSocketAddress(port));
+                acceptor.bind();
+                break;
+            } catch (RuntimeException re ) {
+                nbTry--;
+                
+                if (nbTry == 0) {
+                    throw new IOException("Cannot bind any test port.");
+                }
+            }
+        }
+    }
 }
diff --git 
a/mina-core/src/test/java/org/apache/mina/transport/vmpipe/VmPipeBindTest.java 
b/mina-core/src/test/java/org/apache/mina/transport/vmpipe/VmPipeBindTest.java
index 322240221..0ba407b38 100644
--- 
a/mina-core/src/test/java/org/apache/mina/transport/vmpipe/VmPipeBindTest.java
+++ 
b/mina-core/src/test/java/org/apache/mina/transport/vmpipe/VmPipeBindTest.java
@@ -19,10 +19,12 @@
  */
 package org.apache.mina.transport.vmpipe;
 
+import java.io.IOException;
 import java.net.SocketAddress;
 
 import org.apache.mina.core.service.IoConnector;
 import org.apache.mina.transport.AbstractBindTest;
+import org.apache.mina.util.AvailablePortFinder;
 
 /**
  * Tests {@link VmPipeAcceptor} bind and unbind.
@@ -49,4 +51,34 @@ public class VmPipeBindTest extends AbstractBindTest {
     protected IoConnector newConnector() {
         return new VmPipeConnector();
     }
+
+    @Override
+    protected void bind( boolean reuseAddress ) throws IOException
+    {
+        acceptor.setHandler(new EchoProtocolHandler());
+
+        // Find an available test port and bind to it.
+        int nbTry = 10;
+        
+        while (true) {
+            try {
+                port = AvailablePortFinder.getNextAvailable();
+                acceptor.setDefaultLocalAddress(createSocketAddress(port));
+                acceptor.bind();
+                break;
+            } catch (RuntimeException re ) {
+                nbTry--;
+                
+                if (nbTry == 0) {
+                    throw new IOException("Cannot bind any test port.");
+                }
+            }
+        }
+    }
+
+    @Override
+    protected void setReuseAddress( boolean reuseAddress ) throws IOException
+    {
+        // Nothing to do for VmPipe
+    }
 }
diff --git a/mina-core/src/test/java/org/apache/mina/util/AcceptorBindUtil.java 
b/mina-core/src/test/java/org/apache/mina/util/AcceptorBindUtil.java
new file mode 100644
index 000000000..251214171
--- /dev/null
+++ b/mina-core/src/test/java/org/apache/mina/util/AcceptorBindUtil.java
@@ -0,0 +1,94 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+
+package org.apache.mina.util;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
+import org.apache.mina.core.service.IoAcceptor;
+
+/**
+ * An unitily class containing a method to bind an acceptor with
+ * a retry mechanism, in case the port has already been taken when the 
+ * bind occurs.
+ * 
+ * May be useful to avoid random test failures...
+ * 
+ */
+public class AcceptorBindUtil {
+    /** The default number of tries */
+    private static final int NB_TRIES = 10;
+    
+    /**
+     * Try to bind an IoAcceptor, using a random port, but retrying
+     * if the port get used between the moment it's picked and the moment 
+     * the bind occurs. If it fails, we get a untimeException
+     * 
+     * @param acceptor The IoAccceptor we try to bind
+     * @return The port to which the IoAcceptor is bound to
+     */
+    public static final int tryBind(IoAcceptor acceptor) {
+        int nbTry = NB_TRIES;
+        
+        while (true) {
+            int nextAvailable = AvailablePortFinder.getNextAvailable();
+            try {
+                acceptor.bind(new InetSocketAddress(nextAvailable));
+                
+                System.out.println( "-------------> " + nextAvailable );
+                
+                return nextAvailable;
+            } catch ( IOException e ) {
+                nbTry--;
+                
+                if (nbTry == 0) {
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+    }
+    
+    /**
+     * Try to bind an IoAcceptor, using a random port, but retrying
+     * if the port get used between the moment it's picked and the moment 
+     * the bind occurs. If it fails, we get a untimeException
+     * 
+     * @param acceptor The IoAccceptor we try to bind
+     * @param nbTries The number of times it tries
+     * @return The port to which the IoAcceptor is bound to
+     */
+    public static final int tryBind(IoAcceptor acceptor, int nbTries) {
+        while (true) {
+            int nextAvailable = AvailablePortFinder.getNextAvailable();
+            try {
+                acceptor.bind(new InetSocketAddress(nextAvailable));
+                
+                return nextAvailable;
+            } catch ( IOException e ) {
+                nbTries--;
+                
+                if (nbTries == 0) {
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+    }
+}

Reply via email to