From d032774aa0d5b717c40ac1e79564cb567b573a83 Mon Sep 17 00:00:00 2001 From: TomPallister Date: Wed, 11 Mar 2020 19:52:24 +0000 Subject: [PATCH] small refactor of RandomPortFinder --- .../RandomPortFinder.cs | 77 ++++++++++--------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/test/Ocelot.AcceptanceTests/RandomPortFinder.cs b/test/Ocelot.AcceptanceTests/RandomPortFinder.cs index ef166fa1..1bb6b9f4 100644 --- a/test/Ocelot.AcceptanceTests/RandomPortFinder.cs +++ b/test/Ocelot.AcceptanceTests/RandomPortFinder.cs @@ -1,55 +1,58 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Net.Sockets; -using System.Text; - -namespace Ocelot.AcceptanceTests +namespace Ocelot.AcceptanceTests { + using System; + using System.Collections.Concurrent; + using System.Linq; + using System.Net; + using System.Net.Sockets; + public static class RandomPortFinder { - private static readonly int TrialNumber = 100; - private static readonly int BeginPortRange = 20000; - private static readonly int EndPortRange = 45000; - - private static Random random = new Random(); - private static ConcurrentBag usedPorts = new ConcurrentBag(); + private const int TrialNumber = 100; + private const int BeginPortRange = 20000; + private const int EndPortRange = 45000; + private static readonly Random Random = new Random(); + private static readonly ConcurrentBag UsedPorts = new ConcurrentBag(); public static int GetRandomPort() { - int randomPort = 0; - for (int i = 0; i < TrialNumber; i++) + for (var i = 0; i < TrialNumber; i++) { - randomPort = random.Next(BeginPortRange, EndPortRange); - if (usedPorts.Any(p => p == randomPort)) - { - continue; - } - else - { - usedPorts.Add(randomPort); - } + var randomPort = Random.Next(BeginPortRange, EndPortRange); - try + if (!PortInUse(randomPort)) { - IPEndPoint ipe = new IPEndPoint(IPAddress.Loopback, randomPort); - using (var socket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp)) + try { - socket.Bind(ipe); - socket.Close(); - return randomPort; + return UsePort(randomPort); + } + catch (Exception) + { + // ignored } } - catch (Exception) - { - continue; - } } throw new Exception("Cannot find available port to bind to."); } + + private static int UsePort(int randomPort) + { + UsedPorts.Add(randomPort); + + var ipe = new IPEndPoint(IPAddress.Loopback, randomPort); + + using (var socket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp)) + { + socket.Bind(ipe); + socket.Close(); + return randomPort; + } + } + + private static bool PortInUse(int randomPort) + { + return UsedPorts.Any(p => p == randomPort); + } } }