From 072a384a8855b45984ac5387ccb2f1034c2e6c44 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Thu, 2 Dec 2021 09:33:35 +0100 Subject: [PATCH 1/2] JAVA-8748: Make each test get available port on its own --- ...ualTest.java => FindFreePortUnitTest.java} | 65 ++++++++++++------- 1 file changed, 40 insertions(+), 25 deletions(-) rename core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/{FindFreePortManualTest.java => FindFreePortUnitTest.java} (78%) diff --git a/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/FindFreePortManualTest.java b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/FindFreePortUnitTest.java similarity index 78% rename from core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/FindFreePortManualTest.java rename to core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/FindFreePortUnitTest.java index 3e533b3fc0..679503cb6d 100644 --- a/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/FindFreePortManualTest.java +++ b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/FindFreePortUnitTest.java @@ -4,37 +4,27 @@ import org.apache.catalina.LifecycleException; import org.apache.catalina.startup.Tomcat; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.springframework.util.SocketUtils; import java.io.IOException; import java.net.ServerSocket; +import java.util.Random; -import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; -// fixing in JAVA-8748 -public class FindFreePortManualTest { +public class FindFreePortUnitTest { - private static int FREE_PORT_NUMBER; - private static int[] FREE_PORT_RANGE; - - @BeforeAll - public static void getExplicitFreePortNumberAndRange() { - try (ServerSocket serverSocket = new ServerSocket(0)) { - FREE_PORT_NUMBER = serverSocket.getLocalPort(); - FREE_PORT_RANGE = new int[] {FREE_PORT_NUMBER, FREE_PORT_NUMBER + 1, FREE_PORT_NUMBER + 2}; - } catch (IOException e) { - fail("No free port is available"); - } - } + private static final int DEFAULT_RANDOM_PORT = 34307; @Test public void givenExplicitFreePort_whenCreatingServerSocket_thenThatPortIsAssigned() { - try (ServerSocket serverSocket = new ServerSocket(FREE_PORT_NUMBER)) { + int freePort = getFreePort(); + + try (ServerSocket serverSocket = new ServerSocket(freePort)) { assertThat(serverSocket).isNotNull(); - assertThat(serverSocket.getLocalPort()).isEqualTo(FREE_PORT_NUMBER); + assertThat(serverSocket.getLocalPort()).isEqualTo(freePort); } catch (IOException e) { fail("Port is not available"); } @@ -42,8 +32,10 @@ public class FindFreePortManualTest { @Test public void givenExplicitOccupiedPort_whenCreatingServerSocket_thenExceptionIsThrown() { - try (ServerSocket serverSocket = new ServerSocket(FREE_PORT_NUMBER)) { - new ServerSocket(FREE_PORT_NUMBER); + int freePort = getFreePort(); + + try (ServerSocket serverSocket = new ServerSocket(freePort)) { + new ServerSocket(freePort); fail("Same port cannot be used twice"); } catch (IOException e) { assertThat(e).hasMessageContaining("Address already in use"); @@ -52,7 +44,7 @@ public class FindFreePortManualTest { @Test public void givenExplicitPortRange_whenCreatingServerSocket_thenOnePortIsAssigned() { - for (int port : FREE_PORT_RANGE) { + for (int port : getFreePorts()) { try (ServerSocket serverSocket = new ServerSocket(port)) { assertThat(serverSocket).isNotNull(); assertThat(serverSocket.getLocalPort()).isEqualTo(port); @@ -105,11 +97,12 @@ public class FindFreePortManualTest { public void givenExplicitFreePort_whenCreatingJettyServer_thenThatPortIsAssigned() throws Exception { Server jettyServer = new Server(); ServerConnector serverConnector = new ServerConnector(jettyServer); - serverConnector.setPort(FREE_PORT_NUMBER); + int freePort = getFreePort(); + serverConnector.setPort(freePort); jettyServer.addConnector(serverConnector); try { jettyServer.start(); - assertThat(serverConnector.getLocalPort()).isEqualTo(FREE_PORT_NUMBER); + assertThat(serverConnector.getLocalPort()).isEqualTo(freePort); } catch (Exception e) { fail("Failed to start Jetty server"); } finally { @@ -136,10 +129,11 @@ public class FindFreePortManualTest { @Test public void givenExplicitFreePort_whenCreatingTomcatServer_thenThatPortIsAssigned() throws Exception { Tomcat tomcatServer = new Tomcat(); - tomcatServer.setPort(FREE_PORT_NUMBER); + int freePort = getFreePort(); + tomcatServer.setPort(freePort); try { tomcatServer.start(); - assertThat(tomcatServer.getConnector().getLocalPort()).isEqualTo(FREE_PORT_NUMBER); + assertThat(tomcatServer.getConnector().getLocalPort()).isEqualTo(freePort); } catch (LifecycleException e) { fail("Failed to start Tomcat server"); } finally { @@ -148,4 +142,25 @@ public class FindFreePortManualTest { } } + private int[] getFreePorts() { + int freePort = getFreePort(); + return new int[]{freePort - 1, freePort, freePort + 1}; + } + + private int getFreePort() { + return new Random() + .ints(36000, 65000) + .filter(FindFreePortUnitTest::isFree) + .findFirst() + .orElse(DEFAULT_RANDOM_PORT); + } + + private static boolean isFree(int port) { + try { + new ServerSocket(port).close(); + return true; + } catch (IOException e) { + return false; + } + } } From 78c15bc8387d565b71144d5a7d9b227178e44173 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Thu, 2 Dec 2021 12:58:13 +0100 Subject: [PATCH 2/2] JAVA-8748: Use ServerSocket(0) approach to get free port --- .../baeldung/socket/FindFreePortUnitTest.java | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/FindFreePortUnitTest.java b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/FindFreePortUnitTest.java index 679503cb6d..4dfc114438 100644 --- a/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/FindFreePortUnitTest.java +++ b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/FindFreePortUnitTest.java @@ -9,7 +9,6 @@ import org.springframework.util.SocketUtils; import java.io.IOException; import java.net.ServerSocket; -import java.util.Random; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; @@ -148,19 +147,10 @@ public class FindFreePortUnitTest { } private int getFreePort() { - return new Random() - .ints(36000, 65000) - .filter(FindFreePortUnitTest::isFree) - .findFirst() - .orElse(DEFAULT_RANDOM_PORT); - } - - private static boolean isFree(int port) { - try { - new ServerSocket(port).close(); - return true; - } catch (IOException e) { - return false; + try(ServerSocket serverSocket = new ServerSocket(0)){ + return serverSocket.getLocalPort(); + } catch (IOException ex){ + return DEFAULT_RANDOM_PORT; } } }