2 // WebRequestTest.cs - NUnit Test Cases for System.Net.WebRequest
\r
5 // Lawrence Pit (loz@cable.a2000.nl)
\r
6 // Martin Willemoes Hansen (mwh@sysrq.dk)
\r
7 // Sebastien Pouliot <sebastien@ximian.com>
\r
9 // (C) 2003 Martin Willemoes Hansen
\r
10 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
\r
13 using NUnit.Framework;
\r
14 using MonoTests.Helpers;
17 using System.Threading;
18 using System.Collections;
\r
19 using System.Runtime.Serialization;
\r
20 using Socks = System.Net.Sockets;
\r
23 namespace MonoTests.System.Net {
\r
25 // WebRequest is abstract
\r
27 public class NonAbstractWebRequest : WebRequest
\r
30 public NonAbstractWebRequest ()
\r
34 public NonAbstractWebRequest (SerializationInfo si, StreamingContext sc)
\r
41 public class WebRequestTest {
\r
43 private void Callback (IAsyncResult ar)
\r
45 Assert.Fail ("Callback");
\r
49 public void SerializationConstructor ()
\r
51 NonAbstractWebRequest w = new NonAbstractWebRequest (null, new StreamingContext ());
\r
52 Assert.IsNotNull (w);
\r
55 // properties (only test 'get'ter)
\r
58 [ExpectedException (typeof (NotImplementedException))]
\r
59 public void ConnectionGroupName ()
\r
61 NonAbstractWebRequest w = new NonAbstractWebRequest ();
\r
62 Assert.IsNull (w.ConnectionGroupName);
\r
66 [ExpectedException (typeof (NotImplementedException))]
\r
67 public void ContentLength ()
\r
69 NonAbstractWebRequest w = new NonAbstractWebRequest ();
\r
70 Assert.IsNull (w.ContentLength);
\r
74 [ExpectedException (typeof (NotImplementedException))]
\r
75 public void ContentType ()
\r
77 NonAbstractWebRequest w = new NonAbstractWebRequest ();
\r
78 Assert.IsNull (w.ContentType);
\r
82 [ExpectedException (typeof (NotImplementedException))]
\r
83 public void Credentials ()
\r
85 NonAbstractWebRequest w = new NonAbstractWebRequest ();
\r
86 Assert.IsNull (w.Credentials);
\r
90 [ExpectedException (typeof (NotImplementedException))]
\r
91 public void Headers ()
\r
93 NonAbstractWebRequest w = new NonAbstractWebRequest ();
\r
94 Assert.IsNull (w.Headers);
\r
98 [ExpectedException (typeof (NotImplementedException))]
\r
99 public void Method ()
\r
101 NonAbstractWebRequest w = new NonAbstractWebRequest ();
\r
102 Assert.IsNull (w.Method);
\r
106 [ExpectedException (typeof (NotImplementedException))]
\r
107 public void PreAuthenticate ()
\r
109 NonAbstractWebRequest w = new NonAbstractWebRequest ();
\r
110 Assert.IsTrue (w.PreAuthenticate);
\r
114 [ExpectedException (typeof (NotImplementedException))]
\r
115 public void Proxy ()
\r
117 NonAbstractWebRequest w = new NonAbstractWebRequest ();
\r
118 Assert.IsNull (w.Proxy);
\r
122 [ExpectedException (typeof (NotImplementedException))]
\r
123 public void RequestUri ()
\r
125 NonAbstractWebRequest w = new NonAbstractWebRequest ();
\r
126 Assert.IsNull (w.RequestUri);
\r
130 [ExpectedException (typeof (NotImplementedException))]
\r
131 public void Timeout ()
\r
133 NonAbstractWebRequest w = new NonAbstractWebRequest ();
\r
134 Assert.IsNull (w.Timeout);
\r
140 [ExpectedException (typeof (NotImplementedException))]
\r
141 public void Abort ()
\r
143 NonAbstractWebRequest w = new NonAbstractWebRequest ();
\r
148 [ExpectedException (typeof (NotImplementedException))]
\r
149 public void BeginGetRequestStream ()
\r
151 NonAbstractWebRequest w = new NonAbstractWebRequest ();
\r
152 IAsyncResult r = w.BeginGetRequestStream (new AsyncCallback (Callback), w);
\r
156 [ExpectedException (typeof (NotImplementedException))]
\r
157 public void BeginGetResponse ()
\r
159 NonAbstractWebRequest w = new NonAbstractWebRequest ();
\r
160 IAsyncResult r = w.BeginGetResponse (new AsyncCallback (Callback), w);
\r
164 [ExpectedException (typeof (NotImplementedException))]
\r
165 public void EndGetRequestStream ()
\r
167 NonAbstractWebRequest w = new NonAbstractWebRequest ();
\r
168 w.EndGetRequestStream (null);
\r
172 [ExpectedException (typeof (NotImplementedException))]
\r
173 public void EndGetResponse ()
\r
175 NonAbstractWebRequest w = new NonAbstractWebRequest ();
\r
176 w.EndGetResponse (null);
\r
180 [ExpectedException (typeof (NotImplementedException))]
\r
181 public void GetRequestStream ()
\r
183 NonAbstractWebRequest w = new NonAbstractWebRequest ();
\r
184 w.GetRequestStream ();
\r
188 [ExpectedException (typeof (NotImplementedException))]
\r
189 public void GetResponse ()
\r
191 NonAbstractWebRequest w = new NonAbstractWebRequest ();
\r
198 WebRequest req = WebRequest.Create ("http://www.contoso.com");
\r
199 Assert.IsTrue (req is HttpWebRequest, "#1");
\r
200 req = WebRequest.Create ("https://www.contoso.com");
\r
201 Assert.IsTrue (req is HttpWebRequest, "#2");
\r
202 req = WebRequest.Create ("file://www.contoso.com");
\r
203 Assert.IsTrue (req is FileWebRequest, "#3");
\r
204 req = WebRequest.Create ("ftp://www.contoso.com");
\r
205 Assert.IsTrue (req is FtpWebRequest, "#4");
\r
206 WebRequest.RegisterPrefix ("http://www.contoso.com", new TestWebRequestCreator ());
\r
207 bool ret = WebRequest.RegisterPrefix ("http://WWW.contoso.com", new TestWebRequestCreator ());
\r
208 Assert.AreEqual (false, ret, "#5a");
\r
209 ret = WebRequest.RegisterPrefix ("http://www.contoso.com/foo/bar", new TestWebRequestCreator2 ());
\r
210 Assert.AreEqual (true, ret, "#5b");
\r
211 ret = WebRequest.RegisterPrefix ("http://www", new TestWebRequestCreator3 ());
\r
212 Assert.AreEqual (true, ret, "#5c");
\r
214 req = WebRequest.Create ("http://WWW.contoso.com");
\r
215 Assert.IsTrue (req is TestWebRequest, "#6");
\r
217 req = WebRequest.Create ("http://WWW.contoso.com/foo/bar/index.html");
\r
218 Assert.IsTrue (req is TestWebRequest2, "#7");
\r
220 req = WebRequest.Create ("http://WWW.x.com");
\r
221 Assert.IsTrue (req is TestWebRequest3, "#8");
\r
223 req = WebRequest.Create ("http://WWW.c");
\r
224 Assert.IsTrue (req is TestWebRequest3, "#9");
\r
226 req = WebRequest.CreateDefault (new Uri("http://WWW.contoso.com"));
\r
227 Assert.IsTrue (req is HttpWebRequest, "#10");
\r
230 req = WebRequest.Create ("tcp://www.contoso.com");
\r
231 Assert.Fail ("#11 should have failed with NotSupportedException");
\r
232 } catch (NotSupportedException) {
\r
237 public void Create_RequestUriString_Null ()
\r
240 WebRequest.Create ((string) null);
\r
241 Assert.Fail ("#1");
\r
242 } catch (ArgumentNullException ex) {
\r
243 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
244 Assert.IsNull (ex.InnerException, "#3");
\r
245 Assert.IsNotNull (ex.Message, "#4");
\r
246 Assert.IsNotNull (ex.ParamName, "#5");
\r
247 Assert.AreEqual ("requestUriString", ex.ParamName, "#6");
\r
252 public void CreateDefault_RequestUri_Null ()
\r
255 WebRequest.CreateDefault ((Uri) null);
\r
256 Assert.Fail ("#1");
\r
257 } catch (ArgumentNullException ex) {
\r
258 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
259 Assert.IsNull (ex.InnerException, "#3");
\r
260 Assert.IsNotNull (ex.Message, "#4");
\r
261 Assert.IsNotNull (ex.ParamName, "#5");
\r
262 Assert.AreEqual ("requestUri", ex.ParamName, "#6");
\r
267 public void DefaultWebProxy ()
\r
269 WebProxy proxy = new WebProxy ("proxy.intern.com", 83);
\r
271 WebRequest.DefaultWebProxy = proxy;
\r
272 Assert.IsNotNull (WebRequest.DefaultWebProxy, "#A1");
\r
273 Assert.AreSame (proxy, WebRequest.DefaultWebProxy, "#A2");
\r
275 HttpWebRequest req = (HttpWebRequest) WebRequest.CreateDefault (
\r
276 new Uri ("http://www.mono-project.com"));
\r
277 Assert.IsNotNull (req.Proxy, "#B1");
\r
278 Assert.AreSame (proxy, req.Proxy, "#B2");
\r
280 WebRequest.DefaultWebProxy = null;
\r
281 Assert.IsNull (WebRequest.DefaultWebProxy, "#C1");
\r
282 Assert.IsNotNull (req.Proxy, "#C2");
\r
283 Assert.AreSame (proxy, req.Proxy, "#C3");
\r
285 req = (HttpWebRequest) WebRequest.CreateDefault (
\r
286 new Uri ("http://www.mono-project.com"));
\r
287 Assert.IsNull (req.Proxy, "#D");
\r
291 public void RegisterPrefix_Creator_Null ()
\r
294 WebRequest.RegisterPrefix ("http://www.mono-project.com", (IWebRequestCreate) null);
\r
295 Assert.Fail ("#1");
\r
296 } catch (ArgumentNullException ex) {
\r
297 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
298 Assert.IsNull (ex.InnerException, "#3");
\r
299 Assert.IsNotNull (ex.Message, "#4");
\r
300 Assert.IsNotNull (ex.ParamName, "#5");
\r
301 Assert.AreEqual ("creator", ex.ParamName, "#6");
\r
306 public void RegisterPrefix_Prefix_Null ()
\r
309 WebRequest.RegisterPrefix ((string) null, new TestWebRequestCreator ());
\r
310 Assert.Fail ("#1");
\r
311 } catch (ArgumentNullException ex) {
\r
312 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
313 Assert.IsNull (ex.InnerException, "#3");
\r
314 Assert.IsNotNull (ex.Message, "#4");
\r
315 Assert.IsNotNull (ex.ParamName, "#5");
\r
316 Assert.AreEqual ("prefix", ex.ParamName, "#6");
\r
320 [Test] //BNC#323452
\r
321 // Throws exception with Status == Timeout. The same code behaves as the test expects when run from a regular app.
322 // Might be an issue with the test suite. To investigate.
323 [Category("AndroidNotWorking")]
324 public void TestFailedConnection ()
\r
327 WebRequest.Create ("http://127.0.0.1:0/non-existant.txt").GetResponse ();
\r
328 Assert.Fail ("Should have raised an exception");
\r
329 } catch (Exception e) {
\r
330 Assert.IsTrue (e is WebException, "Got " + e.GetType ().Name + ": " + e.Message);
\r
331 //#if NET_2_0 e.Message == "Unable to connect to the remote server"
\r
332 //#if NET_1_1 e.Message == "The underlying connection was closed: Unable to connect to the remote server."
\r
334 Assert.AreEqual (WebExceptionStatus.ConnectFailure, ((WebException)e).Status);
\r
336 //#if !NET_1_1 (this is not true in .NET 1.x)
\r
337 Assert.IsNotNull (e.InnerException);
\r
338 Assert.IsTrue (e.InnerException is Socks.SocketException, "InnerException should be SocketException");
\r
339 //e.Message == "The requested address is not valid in its context 127.0.0.1:0"
\r
344 [Test] //BNC#323452
\r
345 [Category ("AndroidNotWorking")] // Fails when ran as part of the entire BCL test suite. Works when only this fixture is ran
346 public void TestFailedResolution ()
\r
349 var req = WebRequest.Create ("http://thisdomaindoesnotexist.monotestcase.x/non-existant.txt").GetResponse ();
\r
351 * Work around broken t-online.de DNS Server.
\r
353 * T-Online's DNS Server for DSL Customers resolves
\r
354 * non-exisitng domain names to
\r
355 * http://navigationshilfe1.t-online.de/dnserror?url=....
\r
356 * instead of reporting an error.
\r
358 if (req.ResponseUri.DnsSafeHost.Equals ("navigationshilfe1.t-online.de"))
\r
359 Assert.Ignore ("Misbehaving DNS server.");
\r
361 Assert.Fail ("Should have raised an exception");
\r
362 } catch (Exception e) {
\r
363 Assert.IsTrue (e is WebException);
\r
364 //#if NET_2_0 e.Message == "The underlying connection was closed: The remote name could not be resolved."
\r
365 //#if NET_1_1 e.Message == "The remote name could not be resolved: 'thisdomaindoesnotexist.monotestcase.x'"
\r
366 Assert.AreEqual (((WebException)e).Status, WebExceptionStatus.NameResolutionFailure);
\r
367 Assert.IsNull (e.InnerException);
\r
371 internal class TestWebRequestCreator : IWebRequestCreate
\r
373 internal TestWebRequestCreator () { }
\r
375 public WebRequest Create (Uri uri)
\r
377 return new TestWebRequest ();
\r
381 internal class TestWebRequest : WebRequest
\r
383 internal TestWebRequest () { }
\r
386 internal class TestWebRequestCreator2 : IWebRequestCreate
\r
388 internal TestWebRequestCreator2 () { }
\r
390 public WebRequest Create (Uri uri)
\r
392 return new TestWebRequest2 ();
\r
396 internal class TestWebRequest2 : WebRequest
\r
398 internal TestWebRequest2 () { }
\r
401 internal class TestWebRequestCreator3 : IWebRequestCreate
\r
403 internal TestWebRequestCreator3 () { }
\r
405 public WebRequest Create (Uri uri)
\r
407 return new TestWebRequest3 ();
\r
411 internal class TestWebRequest3 : WebRequest
\r
413 internal TestWebRequest3 () { }
\r
416 [Test] // Covers #41477
417 [Category ("RequiresBSDSockets")]
418 public void TestReceiveCancelation ()
420 var uri = "http://localhost:" + NetworkHelpers.FindFreePort () + "/";
422 HttpListener listener = new HttpListener ();
423 listener.Prefixes.Add (uri);
427 for (var i = 0; i < 10; i++) {
428 var request = WebRequest.CreateHttp (uri);
429 request.Method = "GET";
431 var tokenSource = new CancellationTokenSource ();
432 tokenSource.Token.Register(() => request.Abort ());
434 var responseTask = request.GetResponseAsync ();
436 var context = listener.GetContext ();
437 byte[] outBuffer = new byte[8 * 1024];
438 context.Response.OutputStream.WriteAsync (outBuffer, 0, outBuffer.Length);
440 Assert.IsTrue (responseTask.Wait (1000), "Timeout #1");
442 WebResponse response = responseTask.Result;
443 var stream = response.GetResponseStream ();
445 byte[] buffer = new byte[8 * 1024];
446 var taskRead = stream.ReadAsync (buffer, 0, buffer.Length, tokenSource.Token);
448 tokenSource.Cancel ();
450 Assert.IsTrue (taskRead.Wait (1000), "Timeout #2");
452 var byteRead = taskRead.Result;
454 } catch (AggregateException ex) {
455 var webEx = ex.InnerException as WebException;
456 Assert.IsNotNull(webEx, "Inner exception is not a WebException");
457 Assert.AreEqual (webEx.Status, WebExceptionStatus.RequestCanceled);