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