diff --git a/spring-integration-test/src/main/java/org/springframework/integration/test/util/SocketUtils.java b/spring-integration-test/src/main/java/org/springframework/integration/test/util/SocketUtils.java index b57d959ca7..412204a339 100644 --- a/spring-integration-test/src/main/java/org/springframework/integration/test/util/SocketUtils.java +++ b/spring-integration-test/src/main/java/org/springframework/integration/test/util/SocketUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package org.springframework.integration.test.util; import java.net.DatagramSocket; +import java.net.InetAddress; import java.net.ServerSocket; import java.util.ArrayList; import java.util.List; @@ -26,37 +27,33 @@ import javax.net.ServerSocketFactory; import org.springframework.util.Assert; /** - * * Contains several socket-specific utility methods. For example, you may have * test cases that require an open port. Rather than hard-coding the relevant port, * it will be better to use methods from this utility class to automatically select * an open port, therefore improving the portability of your test-cases across * systems. - * * @author Gunnar Hillert + * @author Gary Russell * @since 2.2 - * */ public final class SocketUtils { public static final int DEFAULT_PORT_RANGE_MIN = 10000; + public static final int DEFAULT_PORT_RANGE_MAX = 60000; /** * The constructor is intentionally public. In several test cases you may have * the need to use the methods of this class multiple times from within your * Spring Application Context XML file using SpEL. Of course you can do: - * *
 	 * {@code
 	 * ...port="#{T(org.springframework.integration.test.util.SocketUtils).findAvailableServerSocket(12000)}"
 	 * }
 	 * 
- * * But unfortunately, you would need to repeat the package for each usage. * This will be acceptable for single use, but if you need to invoke the * methods numerous time, you may instead want to do this: - * *
 	 * {@code
 	 * 
@@ -64,18 +61,16 @@ public final class SocketUtils {
 	 * ...port="#{tcpIpUtils.findAvailableServerSocket(12000)}"
 	 * }
 	 * 
- * */ - public SocketUtils() { } + private SocketUtils() { + } /** * Determines a free available server socket (port) using the 'seed' value as * the starting port. The utility methods will probe for 200 sockets but will * return as soon an open port is found. - * * @param seed The starting port, which must not be negative. * @return An available port number - * * @throws IllegalStateException when no open port was found. */ public static int findAvailableServerSocket(int seed) { @@ -87,11 +82,9 @@ public final class SocketUtils { * Determines a free available server socket (port) using the 'seed' value as * the starting port. The utility methods will probe for 200 sockets but will * return as soon an open port is found. - * - * @param seed The starting port, which must not be negative. + * @param seed The starting port, which must not be negative. * @param numberOfRequestedPorts How many open ports shall be retrieved? * @return A list containing the requested number of open ports - * * @throws IllegalStateException when no open port was found. */ public static List findAvailableServerSockets(int seed, int numberOfRequestedPorts) { @@ -101,9 +94,10 @@ public final class SocketUtils { final List openPorts = new ArrayList(numberOfRequestedPorts); - for (int i = seed; i < seed+200; i++) { + for (int i = seed; i < seed + 200; i++) { try { - ServerSocket sock = ServerSocketFactory.getDefault().createServerSocket(i); + ServerSocket sock = ServerSocketFactory.getDefault() + .createServerSocket(i, 1, InetAddress.getByName("localhost")); sock.close(); openPorts.add(i); @@ -111,18 +105,19 @@ public final class SocketUtils { return openPorts; } - } catch (Exception e) { } + } + catch (Exception e) { + } } - throw new IllegalStateException(String.format("Cannot find a free server socket (%s requested)", numberOfRequestedPorts)); + throw new IllegalStateException(String.format("Cannot find a free server socket (%s requested)", + numberOfRequestedPorts)); } /** * Determines a free available server socket (port) using an automatically * chosen start seed port. - * * @return An available port number - * * @throws IllegalStateException when no open port was found. */ public static int findAvailableServerSocket() { @@ -134,12 +129,9 @@ public final class SocketUtils { * Determines a free available Udp socket (port) using the 'seed' value as * the starting port. The utility methods will probe for 200 sockets but will * return as soon an open port is found. - * * @param seed The starting port, which must not be negative. * @return An available port number - * * @throws IllegalStateException when no open port was found. - * */ public static int findAvailableUdpSocket(int seed) { final List openPorts = findAvailableUdpSockets(seed, 1); @@ -150,11 +142,9 @@ public final class SocketUtils { * Determines free available udp socket(s) (port) using the 'seed' value as * the starting port. The utility methods will probe for 200 sockets but will * return as soon an open port is found. - * - * @param seed The starting port, which must not be negative. + * @param seed The starting port, which must not be negative. * @param numberOfRequestedPorts How many open ports shall be retrieved? * @return A list containing the requested number of open ports - * * @throws IllegalStateException when no open port was found. */ public static List findAvailableUdpSockets(int seed, int numberOfRequestedPorts) { @@ -164,9 +154,9 @@ public final class SocketUtils { final List openPorts = new ArrayList(numberOfRequestedPorts); - for (int i = seed; i < seed+200; i++) { + for (int i = seed; i < seed + 200; i++) { try { - DatagramSocket sock = new DatagramSocket(i); + DatagramSocket sock = new DatagramSocket(i, InetAddress.getByName("localhost")); sock.close(); Thread.sleep(100); @@ -176,19 +166,19 @@ public final class SocketUtils { return openPorts; } - } catch (Exception e) { } + } + catch (Exception e) { + } } - throw new IllegalStateException(String.format("Cannot find a free server socket (%s requested)", numberOfRequestedPorts)); - + throw new IllegalStateException(String.format("Cannot find a free server socket (%s requested)", + numberOfRequestedPorts)); } /** * Determines a free available Udp socket using an automatically * chosen start seed port. - * * @return An available port number - * * @throws IllegalStateException when no open port was found. */ public static int findAvailableUdpSocket() { @@ -199,16 +189,10 @@ public final class SocketUtils { /** * Determines a random seed port number within the port range * {@value #DEFAULT_PORT_RANGE_MIN} and {@value #DEFAULT_PORT_RANGE_MAX}. - * * @return A number with the the specified range */ public static int getRandomSeedPort() { - - final Random random = new Random(); - - int randomNumber = random.nextInt(DEFAULT_PORT_RANGE_MAX - DEFAULT_PORT_RANGE_MIN + 1) + DEFAULT_PORT_RANGE_MIN; - - return randomNumber; + return new Random().nextInt(DEFAULT_PORT_RANGE_MAX - DEFAULT_PORT_RANGE_MIN + 1) + DEFAULT_PORT_RANGE_MIN; } } diff --git a/spring-integration-test/src/test/java/org/springframework/integration/test/util/SocketUtilsTests.java b/spring-integration-test/src/test/java/org/springframework/integration/test/util/SocketUtilsTests.java index 66aa12ab97..b0f7d9a491 100644 --- a/spring-integration-test/src/test/java/org/springframework/integration/test/util/SocketUtilsTests.java +++ b/spring-integration-test/src/test/java/org/springframework/integration/test/util/SocketUtilsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,12 +15,20 @@ */ package org.springframework.integration.test.util; -import org.junit.Assert; +import static org.junit.Assert.assertNotEquals; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.ServerSocket; + +import javax.net.ServerSocketFactory; + +import org.junit.Assert; import org.junit.Test; /** * @author Gunnar Hillert + * @author Gary Russell */ public class SocketUtilsTests { @@ -54,4 +62,21 @@ public class SocketUtilsTests { Assert.fail("Expected an IllegalArgumentException to be thrown."); } + @Test + public void testTcpLocalhost() throws Exception { + int available = SocketUtils.findAvailableServerSocket(); + ServerSocket ss = ServerSocketFactory.getDefault().createServerSocket(available, 1, + InetAddress.getByName("localhost")); + assertNotEquals(available, SocketUtils.findAvailableServerSocket(available)); + ss.close(); + } + + @Test + public void testUdpLocalhost() throws Exception { + int available = SocketUtils.findAvailableUdpSocket(2000); + DatagramSocket dgs = new DatagramSocket(available, InetAddress.getByName("localhost")); + assertNotEquals(available, SocketUtils.findAvailableUdpSocket(available)); + dgs.close(); + } + }