[#600] mvn clean package on OSX throws Exception
* Choose port randomly * Ensure SO_REUSEADDR is not set at any case * Ensure the port works for both wildcard and localhost
This commit is contained in:
parent
94838ee274
commit
1bb5ac110f
@ -15,13 +15,38 @@
|
|||||||
*/
|
*/
|
||||||
package io.netty.testsuite.util;
|
package io.netty.testsuite.util;
|
||||||
|
|
||||||
|
import io.netty.util.NetworkConstants;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
import java.net.ServerSocket;
|
import java.net.ServerSocket;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class TestUtils {
|
public class TestUtils {
|
||||||
|
|
||||||
private static int START_PORT = 20000;
|
private static final int START_PORT = 32768;
|
||||||
private static int END_PORT = 30000;
|
private static final int END_PORT = 65536;
|
||||||
|
private static final int NUM_CANDIDATES = END_PORT - START_PORT;
|
||||||
|
|
||||||
|
private static final List<Integer> PORTS = new ArrayList<Integer>();
|
||||||
|
private static Iterator<Integer> PORTS_ITERATOR;
|
||||||
|
|
||||||
|
static {
|
||||||
|
for (int i = START_PORT; i < END_PORT; i ++) {
|
||||||
|
PORTS.add(i);
|
||||||
|
}
|
||||||
|
Collections.shuffle(PORTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int nextCandidatePort() {
|
||||||
|
if (PORTS_ITERATOR == null || !PORTS_ITERATOR.hasNext()) {
|
||||||
|
PORTS_ITERATOR = PORTS.iterator();
|
||||||
|
}
|
||||||
|
return PORTS_ITERATOR.next();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a free port which can be used to bind to
|
* Return a free port which can be used to bind to
|
||||||
@ -29,19 +54,28 @@ public class TestUtils {
|
|||||||
* @return port
|
* @return port
|
||||||
*/
|
*/
|
||||||
public static int getFreePort() {
|
public static int getFreePort() {
|
||||||
for(int start = START_PORT; start <= END_PORT; start++) {
|
for (int i = 0; i < NUM_CANDIDATES; i ++) {
|
||||||
|
int port = nextCandidatePort();
|
||||||
try {
|
try {
|
||||||
ServerSocket socket = new ServerSocket(start);
|
// Ensure it is possible to bind on both wildcard and loopback.
|
||||||
socket.setReuseAddress(true);
|
ServerSocket ss;
|
||||||
socket.close();
|
ss = new ServerSocket();
|
||||||
START_PORT = start + 1;
|
ss.setReuseAddress(false);
|
||||||
return start;
|
ss.bind(new InetSocketAddress(port));
|
||||||
|
ss.close();
|
||||||
|
|
||||||
|
ss = new ServerSocket();
|
||||||
|
ss.setReuseAddress(false);
|
||||||
|
ss.bind(new InetSocketAddress(NetworkConstants.LOCALHOST, port));
|
||||||
|
ss.close();
|
||||||
|
|
||||||
|
return port;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
// ignore
|
// ignore
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
throw new RuntimeException("Unable to find a free port....");
|
|
||||||
|
throw new RuntimeException("unable to find a free port");
|
||||||
}
|
}
|
||||||
|
|
||||||
private TestUtils() { }
|
private TestUtils() { }
|
||||||
|
Loading…
Reference in New Issue
Block a user