You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ja...@apache.org on 2019/08/11 22:05:31 UTC

[camel] branch CAMEL-13853 created (now c7f36cd)

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

janbednar pushed a change to branch CAMEL-13853
in repository https://gitbox.apache.org/repos/asf/camel.git.


      at c7f36cd  CAMEL-13853: Fixed AvailablePortFinder for WSL

This branch includes the following new commits:

     new c7f36cd  CAMEL-13853: Fixed AvailablePortFinder for WSL

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[camel] 01/01: CAMEL-13853: Fixed AvailablePortFinder for WSL

Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

janbednar pushed a commit to branch CAMEL-13853
in repository https://gitbox.apache.org/repos/asf/camel.git

commit c7f36cd646054868340f530c1e82d0710e8315ee
Author: Jan Bednář <ma...@janbednar.eu>
AuthorDate: Sun Aug 11 20:05:28 2019 +0200

    CAMEL-13853: Fixed AvailablePortFinder for WSL
---
 .../org/apache/camel/test/AvailablePortFinder.java | 57 +++++++++++++---------
 .../apache/camel/test/AvailablePortFinderTest.java | 26 +++++++++-
 .../camel/management/util/AvailablePortFinder.java | 57 +++++++++++++---------
 3 files changed, 95 insertions(+), 45 deletions(-)

diff --git a/components/camel-test/src/main/java/org/apache/camel/test/AvailablePortFinder.java b/components/camel-test/src/main/java/org/apache/camel/test/AvailablePortFinder.java
index 310af44..1b83b1b 100644
--- a/components/camel-test/src/main/java/org/apache/camel/test/AvailablePortFinder.java
+++ b/components/camel-test/src/main/java/org/apache/camel/test/AvailablePortFinder.java
@@ -18,6 +18,8 @@ package org.apache.camel.test;
 
 import java.io.IOException;
 import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.net.ServerSocket;
 import java.util.NoSuchElementException;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -61,19 +63,26 @@ public final class AvailablePortFinder {
     private AvailablePortFinder() {
         // Do nothing
     }
-    
+
     static {
         int port = MIN_PORT_NUMBER;
         ServerSocket ss = null;
 
         while (ss == null) {
             try {
-                ss = new ServerSocket(port);
+                ss = new ServerSocket();
+                ss.setReuseAddress(false);
+                ss.bind(new InetSocketAddress(InetAddress.getLocalHost(), port), 0);
             } catch (Exception e) {
+                close(ss);
                 ss = null;
                 port += 200;
+                if (port >= MAX_PORT_NUMBER) {
+                    throw new IllegalStateException("Cannot find port", e);
+                }
             }
-        } 
+        }
+
         LOCK = ss;
         Runtime.getRuntime().addShutdownHook(new Thread() {
             public void run() {
@@ -137,31 +146,35 @@ public final class AvailablePortFinder {
             throw new IllegalArgumentException("Invalid start currentMinPort: " + port);
         }
 
-        ServerSocket ss = null;
-        DatagramSocket ds = null;
         try {
-            ss = new ServerSocket(port);
-            ss.setReuseAddress(true);
-            ds = new DatagramSocket(port);
-            ds.setReuseAddress(true);
-            return true;
-        } catch (IOException e) {
-            // Do nothing
-        } finally {
-            if (ds != null) {
-                ds.close();
+            ServerSocket ss = null;
+            InetAddress addr = InetAddress.getLocalHost();
+            try {
+                ss = new ServerSocket();
+                ss.setReuseAddress(false);
+                ss.bind(new InetSocketAddress(addr, port), 0);
+            } finally {
+                close(ss);
             }
 
-            if (ss != null) {
-                try {
-                    ss.close();
-                } catch (IOException e) {
-                    /* should not be thrown */
-                }
+            try (DatagramSocket ds = new DatagramSocket(null)) {
+                ds.setReuseAddress(false);
+                ds.bind(new InetSocketAddress(addr, port));
             }
+            return true;
+        } catch (IOException ignored) {
         }
 
         return false;
     }
 
-}
+    private static void close(ServerSocket ss) {
+        if (ss != null) {
+            try {
+                ss.close();
+            } catch (IOException e) {
+                /* should not be thrown */
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/components/camel-test/src/test/java/org/apache/camel/test/AvailablePortFinderTest.java b/components/camel-test/src/test/java/org/apache/camel/test/AvailablePortFinderTest.java
index 3e2a236..4d25ea3 100644
--- a/components/camel-test/src/test/java/org/apache/camel/test/AvailablePortFinderTest.java
+++ b/components/camel-test/src/test/java/org/apache/camel/test/AvailablePortFinderTest.java
@@ -16,6 +16,10 @@
  */
 package org.apache.camel.test;
 
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.MulticastSocket;
 import java.net.ServerSocket;
 
 import org.junit.Assert;
@@ -40,7 +44,7 @@ public class AvailablePortFinderTest {
 
 
     @Test
-    public void testNotAvailablePort() throws Exception {
+    public void testNotAvailableTcpPort() throws Exception {
         int p1 = AvailablePortFinder.getNextAvailable(11000);
         ServerSocket socket = new ServerSocket(p1);
         int p2 = AvailablePortFinder.getNextAvailable(p1);
@@ -48,6 +52,26 @@ public class AvailablePortFinderTest {
         socket.close();
     }
 
+    @Test
+    public void testNotAvailableUdpPort() throws Exception {
+        int p1 = AvailablePortFinder.getNextAvailable(11000);
+        DatagramSocket socket = new DatagramSocket(p1);
+        int p2 = AvailablePortFinder.getNextAvailable(p1);
+        Assert.assertFalse("Port " + p1 + " Port2 " + p2, p1 == p2);
+        socket.close();
+    }
+
+    @Test
+    public void testNotAvailableMulticastPort() throws Exception {
+        int p1 = AvailablePortFinder.getNextAvailable(11000);
+        MulticastSocket socket = new MulticastSocket(null);
+        socket.setReuseAddress(false); // true is default for MulticastSocket, we wan to fail if port is occupied
+        socket.bind(new InetSocketAddress(InetAddress.getLocalHost(), p1));
+        int p2 = AvailablePortFinder.getNextAvailable(p1);
+        Assert.assertFalse("Port " + p1 + " Port2 " + p2, p1 == p2);
+        socket.close();
+    }
+
     @Test (expected = IllegalArgumentException.class)
     public void getMinOutOfRangePort() throws Exception {
         AvailablePortFinder.getNextAvailable(AvailablePortFinder.MIN_PORT_NUMBER - 1);
diff --git a/core/camel-management-impl/src/test/java/org/apache/camel/management/util/AvailablePortFinder.java b/core/camel-management-impl/src/test/java/org/apache/camel/management/util/AvailablePortFinder.java
index 04a14b2..09691ed 100644
--- a/core/camel-management-impl/src/test/java/org/apache/camel/management/util/AvailablePortFinder.java
+++ b/core/camel-management-impl/src/test/java/org/apache/camel/management/util/AvailablePortFinder.java
@@ -18,6 +18,8 @@ package org.apache.camel.management.util;
 
 import java.io.IOException;
 import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.net.ServerSocket;
 import java.util.NoSuchElementException;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -61,19 +63,26 @@ public final class AvailablePortFinder {
     private AvailablePortFinder() {
         // Do nothing
     }
-    
+
     static {
         int port = MIN_PORT_NUMBER;
         ServerSocket ss = null;
 
         while (ss == null) {
             try {
-                ss = new ServerSocket(port);
+                ss = new ServerSocket();
+                ss.setReuseAddress(false);
+                ss.bind(new InetSocketAddress(InetAddress.getLocalHost(), port), 0);
             } catch (Exception e) {
+                close(ss);
                 ss = null;
                 port += 200;
+                if (port >= MAX_PORT_NUMBER) {
+                    throw new IllegalStateException("Cannot find port", e);
+                }
             }
-        } 
+        }
+
         LOCK = ss;
         Runtime.getRuntime().addShutdownHook(new Thread() {
             public void run() {
@@ -137,31 +146,35 @@ public final class AvailablePortFinder {
             throw new IllegalArgumentException("Invalid start currentMinPort: " + port);
         }
 
-        ServerSocket ss = null;
-        DatagramSocket ds = null;
         try {
-            ss = new ServerSocket(port);
-            ss.setReuseAddress(true);
-            ds = new DatagramSocket(port);
-            ds.setReuseAddress(true);
-            return true;
-        } catch (IOException e) {
-            // Do nothing
-        } finally {
-            if (ds != null) {
-                ds.close();
+            ServerSocket ss = null;
+            InetAddress addr = InetAddress.getLocalHost();
+            try {
+                ss = new ServerSocket();
+                ss.setReuseAddress(false);
+                ss.bind(new InetSocketAddress(addr, port), 0);
+            } finally {
+                close(ss);
             }
 
-            if (ss != null) {
-                try {
-                    ss.close();
-                } catch (IOException e) {
-                    /* should not be thrown */
-                }
+            try (DatagramSocket ds = new DatagramSocket(null)) {
+                ds.setReuseAddress(false);
+                ds.bind(new InetSocketAddress(addr, port));
             }
+            return true;
+        } catch (IOException ignored) {
         }
 
         return false;
     }
 
-}
+    private static void close(ServerSocket ss) {
+        if (ss != null) {
+            try {
+                ss.close();
+            } catch (IOException e) {
+                /* should not be thrown */
+            }
+        }
+    }
+}
\ No newline at end of file