[System*] Add category for tests that use API that require BSD sockets.
[mono.git] / mcs / class / System / Test / System.Net / HttpListenerTest.cs
index b316d109390b4ae5a5d5cac84766b2682582d996..8620d1ce32a9b34bd6b98f40ea9ac0805791250a 100644 (file)
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 using System;
+using System.IO;
 using System.Net;
 using System.Net.Sockets;
 using System.Threading;
+using System.Threading.Tasks;
 using NUnit.Framework;
 using MonoTests.Helpers;
 
 namespace MonoTests.System.Net {
        [TestFixture]
+       [Category ("RequiresBSDSockets")]
        public class HttpListenerTest {
 
                int port;
@@ -350,7 +353,7 @@ namespace MonoTests.System.Net {
                public void CloseWhileBegin ()
                {
                        HttpListener listener = new HttpListener ();
-                       listener.Prefixes.Add ("http://127.0.0.1:9001/closewhilebegin/");
+                       listener.Prefixes.Add ("http://127.0.0.1:" + NetworkHelpers.FindFreePort () + "/closewhilebegin/");
                        listener.Start ();
                        CallMe cm = new CallMe ();
                        listener.BeginGetContext (cm.Callback, listener);
@@ -366,7 +369,7 @@ namespace MonoTests.System.Net {
                public void AbortWhileBegin ()
                {
                        HttpListener listener = new HttpListener ();
-                       listener.Prefixes.Add ("http://127.0.0.1:9001/abortwhilebegin/");
+                       listener.Prefixes.Add ("http://127.0.0.1:" + NetworkHelpers.FindFreePort () + "/abortwhilebegin/");
                        listener.Start ();
                        CallMe cm = new CallMe ();
                        listener.BeginGetContext (cm.Callback, listener);
@@ -388,7 +391,7 @@ namespace MonoTests.System.Net {
                        //   at MonoTests.System.Net.HttpListenerTest.CloseWhileGet()
 
                        HttpListener listener = new HttpListener ();
-                       listener.Prefixes.Add ("http://127.0.0.1:9001/closewhileget/");
+                       listener.Prefixes.Add ("http://127.0.0.1:" + NetworkHelpers.FindFreePort () + "/closewhileget/");
                        listener.Start ();
                        RunMe rm = new RunMe (1000, new ThreadStart (listener.Close), new object [0]);
                        rm.Start ();
@@ -405,7 +408,7 @@ namespace MonoTests.System.Net {
                        //   at MonoTests.System.Net.HttpListenerTest.CloseWhileGet()
 
                        HttpListener listener = new HttpListener ();
-                       listener.Prefixes.Add ("http://127.0.0.1:9001/abortwhileget/");
+                       listener.Prefixes.Add ("http://127.0.0.1:" + NetworkHelpers.FindFreePort () + "/abortwhileget/");
                        listener.Start ();
                        RunMe rm = new RunMe (1000, new ThreadStart (listener.Abort), new object [0]);
                        rm.Start ();
@@ -493,7 +496,11 @@ namespace MonoTests.System.Net {
                public IPEndPoint CreateListenerRequest (HttpListener listener, string uri)
                {
                        IPEndPoint ipEndPoint = null;
-                       listener.BeginGetContext ((result) => ipEndPoint = ListenerCallback (result), listener);
+                       var mre = new ManualResetEventSlim ();
+                       listener.BeginGetContext (result => {
+                               ipEndPoint = ListenerCallback (result);
+                               mre.Set ();
+                       }, listener);
 
                        var request = (HttpWebRequest) WebRequest.Create (uri);
                        request.Method = "POST";
@@ -508,6 +515,8 @@ namespace MonoTests.System.Net {
                        // Close response so socket can be reused.
                        response.Close ();
 
+                       mre.Wait ();
+
                        return ipEndPoint;
                }
 
@@ -525,6 +534,53 @@ namespace MonoTests.System.Net {
 
                        return clientEndPoint;
                }
+               
+               [Test]
+               public void HttpClientIsDisconnectedCheckForWriteException()
+               {
+                       string uri = "http://localhost:" + NetworkHelpers.FindFreePort () + "/";
+
+                       AutoResetEvent exceptionOccuredEvent = new AutoResetEvent (false);
+                       HttpListener listener = new HttpListener {
+                               IgnoreWriteExceptions = false
+                       };
+                       listener.Prefixes.Add (uri);
+                       listener.Start ();
+                       listener.BeginGetContext (result =>
+                       {
+                               HttpListenerContext context = listener.EndGetContext (result);
+                               context.Response.SendChunked = true;
+                               context.Request.InputStream.Close ();
+                               
+                               var bytes = new byte [1024];
+                               using(Stream outputStream = context.Response.OutputStream) {
+                                       try {
+                                               while (true) 
+                                                       outputStream.Write (bytes, 0, bytes.Length);
+                                       } catch {
+                                               exceptionOccuredEvent.Set ();
+                                       }
+                               }
+                       }, null);
+
+                       Task.Factory.StartNew (() =>
+                       {
+                               var webRequest = (HttpWebRequest)WebRequest.Create (uri);
+                               webRequest.Method = "POST";
+                               webRequest.KeepAlive = false;
+                               Stream requestStream = webRequest.GetRequestStream ();
+                               requestStream.WriteByte (1);
+                               requestStream.Close ();
+                               using (WebResponse response = webRequest.GetResponse ())
+                               using (Stream stream = response.GetResponseStream ()) {
+                                       byte[] clientBytes = new byte [1024];
+                                       Assert.IsNotNull (stream, "#01");
+                                       stream.Read (clientBytes, 0, clientBytes.Length);
+                               }
+                       });
+
+                       Assert.IsTrue (exceptionOccuredEvent.WaitOne (15 * 1000), "#02");
+               }
        }
 }