[bcl] Deduplicate the SocketResponder test helper class.
authorAlex Rønne Petersen <alexrp@xamarin.com>
Wed, 13 Jan 2016 04:54:43 +0000 (05:54 +0100)
committerAlex Rønne Petersen <alexrp@xamarin.com>
Thu, 14 Jan 2016 02:32:23 +0000 (03:32 +0100)
A number of fixes were made to the version in System but these fixes were never
applied to the System.Web.Services version. Merge the two and place the class
in the test-helpers directory to avoid this sort of maintenance problem.

mcs/class/Makefile
mcs/class/System.Web.Services/System.Web.Services_test.dll.sources
mcs/class/System.Web.Services/Test/System.Web.Services.Protocols/SoapHttpClientProtocolTest.cs
mcs/class/System.Web.Services/Test/System.Web.Services.Protocols/SocketResponder.cs [deleted file]
mcs/class/System/System_test.dll.sources
mcs/class/System/Test/System.Net.Sockets/TcpClientTest.cs
mcs/class/System/Test/System.Net/SocketResponder.cs [deleted file]
mcs/class/test-helpers/SocketResponder.cs [new file with mode: 0644]

index 64790f2005f35d3b1e2fcc2b9500325668655ba9..ae9651fc59e5beaa755cf690483571fd7e33c72d 100644 (file)
@@ -324,6 +324,7 @@ DISTFILES = \
        notes/BitVecto32.txt    \
        MicrosoftAjaxLibrary/License.htm        \
        test-helpers/NetworkHelpers.cs  \
+       test-helpers/SocketResponder.cs \
        $(monolite_files)
 
 .PHONY: all-local $(STD_TARGETS:=-local)
index a2a540c685a814c84d0061fc4e0c558100e94f98..1d055d9cdafa9deda9d411059535ccdbb94f7c27 100644 (file)
@@ -31,6 +31,6 @@ System.Web.Services.Description/WebReferenceOptionsTest.cs
 System.Web.Services.Description/WebServicesInteroperabilityTest.cs
 System.Web.Services.Protocols/LogicalMethodInfoTest.cs
 System.Web.Services.Protocols/SoapHttpClientProtocolTest.cs
-System.Web.Services.Protocols/SocketResponder.cs
 System.Web.Services.Protocols/WebClientProtocolTest.cs
 System.Web.Services.Protocols/SoapServerTypeTest.cs
+../../test-helpers/SocketResponder.cs
index 68673dbac40b9d0be29d680b9001bfaff54ffdbb..008730700360843fd4abcf313964439e7e2e2a2e 100755 (executable)
@@ -39,6 +39,8 @@ using System.Xml.Serialization;
 
 using NUnit.Framework;
 
+using MonoTests.Helpers;
+
 namespace MonoTests.System.Web.Services.Protocols
 {
        [TestFixture]
diff --git a/mcs/class/System.Web.Services/Test/System.Web.Services.Protocols/SocketResponder.cs b/mcs/class/System.Web.Services/Test/System.Web.Services.Protocols/SocketResponder.cs
deleted file mode 100644 (file)
index 8e26ee6..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-//
-// SocketResponder.cs - Utility class for tests that require a listener
-//
-// Author:
-//     Gert Driesen (drieseng@users.sourceforge.net)
-//
-// Copyright (C) 2007 Gert Driesen
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-// 
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-// 
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-using System;
-using System.Globalization;
-using System.IO;
-using System.Net;
-using System.Net.Sockets;
-using System.Text;
-using System.Threading;
-
-namespace MonoTests.System.Web.Services.Protocols
-{
-       public delegate byte [] SocketRequestHandler (Socket socket);
-
-       public class SocketResponder : IDisposable
-       {
-               private TcpListener tcpListener;
-               private readonly IPEndPoint _localEndPoint;
-               private Thread listenThread;
-               private SocketRequestHandler _requestHandler;
-               private bool _stopped = true;
-               private readonly object _syncRoot = new object ();
-
-               private const int SOCKET_CLOSED = 10004;
-
-               public SocketResponder (IPEndPoint localEP, SocketRequestHandler requestHandler)
-               {
-                       _localEndPoint = localEP;
-                       _requestHandler = requestHandler;
-               }
-
-               public IPEndPoint LocalEndPoint
-               {
-                       get { return _localEndPoint; }
-               }
-
-               public void Dispose ()
-               {
-                       Stop ();
-               }
-
-               public bool IsStopped
-               {
-                       get
-                       {
-                               lock (_syncRoot) {
-                                       return _stopped;
-                               }
-                       }
-               }
-
-               public void Start ()
-               {
-                       lock (_syncRoot) {
-                               if (!_stopped)
-                                       return;
-                               _stopped = false;
-                               listenThread = new Thread (new ThreadStart (Listen));
-                               listenThread.Start ();
-                               Thread.Sleep (20); // allow listener to start
-                       }
-               }
-
-               public void Stop ()
-               {
-                       lock (_syncRoot) {
-                               if (_stopped)
-                                       return;
-                               _stopped = true;
-                               if (tcpListener != null) {
-                                       tcpListener.Stop ();
-                                       tcpListener = null;
-                               }
-                       }
-               }
-
-               private void Listen ()
-               {
-                       tcpListener = new TcpListener (LocalEndPoint);
-                       tcpListener.Start ();
-                       try {
-                               Socket socket = tcpListener.AcceptSocket ();
-                               socket.Send (_requestHandler (socket));
-                               socket.Close ();
-                       } catch (SocketException ex) {
-                               // ignore interruption of blocking call
-                               if (ex.ErrorCode != SOCKET_CLOSED)
-                                       throw;
-                       }
-               }
-       }
-}
index 22e57b5086ca492771418a85e09944a6bf2bb7e2..7d07dd75041141098ea61d99b056e993dc454d55 100644 (file)
@@ -231,7 +231,6 @@ System.Net/ServicePointManagerTest.cs
 System.Net/ServicePointTest.cs
 System.Net/SocketPermissionAttributeTest.cs
 System.Net/SocketPermissionTest.cs
-System.Net/SocketResponder.cs
 System.Net/WebHeaderCollectionTest.cs
 System.Net/WebPermissionAttributeTest.cs
 System.Net/WebPermissionTest.cs
@@ -510,3 +509,4 @@ System.Collections.Concurrent/CollectionStressTestHelper.cs
 System.Collections.Concurrent/ParallelTestHelper.cs
 System.Net.WebSockets/ClientWebSocketTest.cs
 ../../test-helpers/NetworkHelpers.cs
+../../test-helpers/SocketResponder.cs
index a02e150915b70a06f5f7964ca09f55a038370fdb..d4769eb811bc6eeb297046a2b44df0c597c9d36a 100644 (file)
@@ -13,6 +13,8 @@ using System.Net;
 using System.Net.Sockets;
 using NUnit.Framework;
 
+using MonoTests.Helpers;
+
 namespace MonoTests.System.Net.Sockets
 {
        /// <summary>
diff --git a/mcs/class/System/Test/System.Net/SocketResponder.cs b/mcs/class/System/Test/System.Net/SocketResponder.cs
deleted file mode 100644 (file)
index 7cb3fd4..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-//
-// SocketResponder.cs - Utility class for tests that require a listener
-//
-// Author:
-//     Gert Driesen (drieseng@users.sourceforge.net)
-//
-// Copyright (C) 2007 Gert Driesen
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-// 
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-// 
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-using System;
-using System.Globalization;
-using System.IO;
-using System.Net;
-using System.Net.Sockets;
-using System.Text;
-using System.Threading;
-
-namespace MonoTests.System.Net
-{
-       public delegate byte [] SocketRequestHandler (Socket socket);
-
-       public class SocketResponder : IDisposable
-       {
-               private TcpListener tcpListener;
-               private readonly IPEndPoint _localEndPoint;
-               private Thread listenThread;
-               private Socket listenSocket;
-               private SocketRequestHandler _requestHandler;
-               private int _state = 0;
-               private readonly object _syncRoot = new object ();
-
-               private const int SOCKET_CLOSED = 10004;
-               private const int SOCKET_INVALID_ARGS = 10022;
-
-               private const int STATE_UNINITIALIZED = 0;
-               private const int STATE_RUNNING = 1;
-               private const int STATE_STOPPED = 2;
-
-               public SocketResponder (IPEndPoint localEP, SocketRequestHandler requestHandler)
-               {
-                       _localEndPoint = localEP;
-                       _requestHandler = requestHandler;
-               }
-
-               public IPEndPoint LocalEndPoint
-               {
-                       get { return _localEndPoint; }
-               }
-
-               public void Dispose ()
-               {
-                       Stop ();
-               }
-
-               public bool IsStopped
-               {
-                       get
-                       {
-                               lock (_syncRoot) {
-                                       return _state != STATE_RUNNING;
-                               }
-                       }
-               }
-
-               public void Start ()
-               {
-                       lock (_syncRoot) {
-                               if (_state != STATE_UNINITIALIZED)
-                                       throw new InvalidOperationException ("cannot restart SocketResponder");
-                               _state = STATE_RUNNING;
-                               tcpListener = new TcpListener (LocalEndPoint);
-                               tcpListener.Start ();
-                               listenThread = new Thread (new ThreadStart (Listen));
-                               listenThread.Start ();
-                       }
-               }
-
-               public void Stop ()
-               {
-                       lock (_syncRoot) {
-                               if (_state != STATE_RUNNING)
-                                       return;
-                               _state = STATE_STOPPED;
-                               if (tcpListener != null) {
-                                       tcpListener.Stop ();
-                                       tcpListener = null;
-                                       if (listenSocket != null)
-                                               listenSocket.Close ();
-                                       Thread.Sleep (50);
-                               }
-                       }
-               }
-
-               private void Listen ()
-               {
-                       while (_state == STATE_RUNNING) {
-                               listenSocket = null;
-                               try {
-                                       listenSocket = tcpListener.AcceptSocket ();
-                                       listenSocket.Send (_requestHandler (listenSocket));
-                                       try {
-                                               listenSocket.Shutdown (SocketShutdown.Receive);
-                                               listenSocket.Shutdown (SocketShutdown.Send);
-                                       } catch {
-                                       }
-                               } catch (SocketException ex) {
-                                       // ignore interruption of blocking call
-                                       if (ex.ErrorCode != SOCKET_CLOSED && ex.ErrorCode != SOCKET_INVALID_ARGS && _state != STATE_STOPPED)
-                                               throw;
-                               } catch (ObjectDisposedException ex) {
-                                       Console.WriteLine (ex);
-                                       if (_state != STATE_STOPPED)
-                                               throw;
-#if MOBILE
-                               } catch (InvalidOperationException ex) {
-                                       // This breaks some tests running on Android. The problem is that the stack trace
-                                       // doesn't point to where the exception is actually thrown from but the entire process
-                                       // is aborted because of unhandled exception.
-                                       Console.WriteLine ("SocketResponder.Listen failed:");
-                                       Console.WriteLine (ex);
-#endif
-                               } finally {
-                                       Thread.Sleep (500);
-                                       if (listenSocket != null)
-                                               listenSocket.Close ();
-                               }
-                       }
-               }
-       }
-}
diff --git a/mcs/class/test-helpers/SocketResponder.cs b/mcs/class/test-helpers/SocketResponder.cs
new file mode 100644 (file)
index 0000000..40c9a37
--- /dev/null
@@ -0,0 +1,149 @@
+//
+// SocketResponder.cs - Utility class for tests that require a listener
+//
+// Author:
+//     Gert Driesen (drieseng@users.sourceforge.net)
+//
+// Copyright (C) 2007 Gert Driesen
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Globalization;
+using System.IO;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading;
+
+namespace MonoTests.Helpers
+{
+       public delegate byte [] SocketRequestHandler (Socket socket);
+
+       public class SocketResponder : IDisposable
+       {
+               private TcpListener tcpListener;
+               private readonly IPEndPoint _localEndPoint;
+               private Thread listenThread;
+               private Socket listenSocket;
+               private SocketRequestHandler _requestHandler;
+               private int _state = 0;
+               private readonly object _syncRoot = new object ();
+
+               private const int SOCKET_CLOSED = 10004;
+               private const int SOCKET_INVALID_ARGS = 10022;
+
+               private const int STATE_UNINITIALIZED = 0;
+               private const int STATE_RUNNING = 1;
+               private const int STATE_STOPPED = 2;
+
+               public SocketResponder (IPEndPoint localEP, SocketRequestHandler requestHandler)
+               {
+                       _localEndPoint = localEP;
+                       _requestHandler = requestHandler;
+               }
+
+               public IPEndPoint LocalEndPoint
+               {
+                       get { return _localEndPoint; }
+               }
+
+               public void Dispose ()
+               {
+                       Stop ();
+               }
+
+               public bool IsStopped
+               {
+                       get
+                       {
+                               lock (_syncRoot) {
+                                       return _state != STATE_RUNNING;
+                               }
+                       }
+               }
+
+               public void Start ()
+               {
+                       lock (_syncRoot) {
+                               if (_state != STATE_UNINITIALIZED)
+                                       throw new InvalidOperationException ("cannot restart SocketResponder");
+                               _state = STATE_RUNNING;
+                               tcpListener = new TcpListener (LocalEndPoint);
+                               tcpListener.Start ();
+                               listenThread = new Thread (new ThreadStart (Listen));
+                               listenThread.Start ();
+                       }
+               }
+
+               public void Stop ()
+               {
+                       lock (_syncRoot) {
+                               if (_state != STATE_RUNNING)
+                                       return;
+                               _state = STATE_STOPPED;
+                               if (tcpListener != null) {
+                                       tcpListener.Stop ();
+                                       tcpListener = null;
+                                       if (listenSocket != null)
+                                               listenSocket.Close ();
+                                       Thread.Sleep (50);
+                               }
+                       }
+               }
+
+               private void Listen ()
+               {
+                       while (_state == STATE_RUNNING) {
+                               listenSocket = null;
+                               try {
+                                       listenSocket = tcpListener.AcceptSocket ();
+                                       listenSocket.Send (_requestHandler (listenSocket));
+                                       try {
+                                               listenSocket.Shutdown (SocketShutdown.Receive);
+                                               listenSocket.Shutdown (SocketShutdown.Send);
+                                       } catch {
+                                       }
+                               } catch (SocketException ex) {
+                                       // ignore interruption of blocking call
+                                       if (ex.ErrorCode != SOCKET_CLOSED && ex.ErrorCode != SOCKET_INVALID_ARGS && _state != STATE_STOPPED)
+                                               throw;
+                               } catch (ObjectDisposedException ex) {
+                                       Console.WriteLine (ex);
+                                       if (_state != STATE_STOPPED)
+                                               throw;
+#if MOBILE
+                               } catch (InvalidOperationException ex) {
+                                       // This breaks some tests running on Android. The problem is that the stack trace
+                                       // doesn't point to where the exception is actually thrown from but the entire process
+                                       // is aborted because of unhandled exception.
+                                       Console.WriteLine ("SocketResponder.Listen failed:");
+                                       Console.WriteLine (ex);
+#endif
+                               } finally {
+                                       Thread.Sleep (500);
+                                       if (listenSocket != null)
+                                               listenSocket.Close ();
+                               }
+                       }
+               }
+       }
+}