From: Marek Safar Date: Fri, 15 Sep 2017 09:10:31 +0000 (+0200) Subject: Update tests network helper to be reliable in multi-threaded tests X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=mono.git;a=commitdiff_plain;h=eaea54ed547571e905f53e44d49ecbbf2920f62b Update tests network helper to be reliable in multi-threaded tests --- diff --git a/mcs/class/test-helpers/NetworkHelpers.cs b/mcs/class/test-helpers/NetworkHelpers.cs index 9d5eb114081..262b8d33232 100644 --- a/mcs/class/test-helpers/NetworkHelpers.cs +++ b/mcs/class/test-helpers/NetworkHelpers.cs @@ -1,12 +1,14 @@ using System; using System.Net; using System.Net.Sockets; +using System.Collections.Generic; namespace MonoTests.Helpers { public static class NetworkHelpers { static Random rndPort = new Random (); + static HashSet portsTable = new HashSet (); public static int FindFreePort () { @@ -15,17 +17,32 @@ namespace MonoTests.Helpers { public static IPEndPoint LocalEphemeralEndPoint () { - while (true) { - var ep = new IPEndPoint (IPAddress.Loopback, rndPort.Next (10000, 60000)); - - try { - using (var socket = new Socket (ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp)) { - socket.Bind (ep); - socket.Close (); - } - return ep; - } catch (SocketException) { } + int counter = 0; + + while (counter < 1000) { + var testingPort = rndPort.Next (10000, 60000); + + var ep = new IPEndPoint (IPAddress.Loopback, testingPort); + + lock (portsTable) { + if (portsTable.Contains (testingPort)) + continue; + + ++counter; + + try { + using (var socket = new Socket (ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp)) { + socket.Bind (ep); + socket.Close (); + } + + portsTable.Add (testingPort); + return ep; + } catch (SocketException) { } + } } + + throw new ApplicationException ($"Could not find available local port after {counter} retries"); } } }