[System] Test ReadAsync Cancellation.
authorMarcos Henrich <marcos.henrich@xamarin.com>
Thu, 7 Jul 2016 13:00:59 +0000 (14:00 +0100)
committerMarcos Henrich <marcos.henrich@xamarin.com>
Fri, 8 Jul 2016 13:42:51 +0000 (14:42 +0100)
Covers #41477

mcs/class/System/Test/System.Net/WebRequestTest.cs

index 908dadb35c2cac90143898e69a39dc5440019d7b..a3ddb3af8438429c7edd7c0809135dd4a0ba0402 100644 (file)
 //\r
 \r
 using NUnit.Framework;\r
+using MonoTests.Helpers;
 using System;\r
 using System.Net;\r
+using System.Threading;
 using System.Collections;\r
 using System.Runtime.Serialization;\r
 using Socks = System.Net.Sockets;\r
@@ -410,6 +412,52 @@ namespace MonoTests.System.Net {
        {\r
                internal TestWebRequest3 () { }\r
        }\r
+
+       [Test] // Covers #41477
+       public void TestReceiveCancelation ()
+       {
+               var uri = "http://localhost:" + NetworkHelpers.FindFreePort () + "/";
+
+               HttpListener listener = new HttpListener ();
+               listener.Prefixes.Add (uri);
+               listener.Start ();
+
+               try {
+                       for (var i = 0; i < 10; i++) {
+                               var request = WebRequest.CreateHttp (uri);
+                               request.Method = "GET";
+
+                               var tokenSource = new CancellationTokenSource ();
+                               tokenSource.Token.Register(() => request.Abort ());
+
+                               var responseTask = request.GetResponseAsync ();
+
+                               var context = listener.GetContext ();
+                               byte[] outBuffer = new byte[8 * 1024];
+                               context.Response.OutputStream.WriteAsync (outBuffer, 0, outBuffer.Length);
+
+                               Assert.IsTrue (responseTask.Wait (1000), "Timeout #1");
+
+                               WebResponse response = responseTask.Result;
+                               var stream = response.GetResponseStream ();
+
+                               byte[] buffer = new byte[8 * 1024];
+                               var taskRead = stream.ReadAsync (buffer, 0, buffer.Length, tokenSource.Token);
+
+                               tokenSource.Cancel ();
+
+                               Assert.IsTrue (taskRead.Wait (1000), "Timeout #2");
+
+                               var byteRead = taskRead.Result;
+                       }
+               } catch (AggregateException ex) {
+                       var webEx = ex.InnerException as WebException;
+                       Assert.IsNotNull(webEx, "Inner exception is not a WebException");
+                       Assert.AreEqual (webEx.Status, WebExceptionStatus.RequestCanceled);
+               }
+
+               listener.Close ();
+       }
 }\r
 \r
 }\r