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;
\r
17 using System.Threading;
\r
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
196 #if FEATURE_NO_BSD_SOCKETS
\r
197 [ExpectedException (typeof (PlatformNotSupportedException))]
\r
201 WebRequest req = WebRequest.Create ("http://www.contoso.com");
\r
202 Assert.IsTrue (req is HttpWebRequest, "#1");
\r
203 req = WebRequest.Create ("https://www.contoso.com");
\r
204 Assert.IsTrue (req is HttpWebRequest, "#2");
\r
205 req = WebRequest.Create ("file://www.contoso.com");
\r
206 Assert.IsTrue (req is FileWebRequest, "#3");
\r
207 req = WebRequest.Create ("ftp://www.contoso.com");
\r
208 Assert.IsTrue (req is FtpWebRequest, "#4");
\r
209 WebRequest.RegisterPrefix ("http://www.contoso.com", new TestWebRequestCreator ());
\r
210 bool ret = WebRequest.RegisterPrefix ("http://WWW.contoso.com", new TestWebRequestCreator ());
\r
211 Assert.AreEqual (false, ret, "#5a");
\r
212 ret = WebRequest.RegisterPrefix ("http://www.contoso.com/foo/bar", new TestWebRequestCreator2 ());
\r
213 Assert.AreEqual (true, ret, "#5b");
\r
214 ret = WebRequest.RegisterPrefix ("http://www", new TestWebRequestCreator3 ());
\r
215 Assert.AreEqual (true, ret, "#5c");
\r
217 req = WebRequest.Create ("http://WWW.contoso.com");
\r
218 Assert.IsTrue (req is TestWebRequest, "#6");
\r
220 req = WebRequest.Create ("http://WWW.contoso.com/foo/bar/index.html");
\r
221 Assert.IsTrue (req is TestWebRequest2, "#7");
\r
223 req = WebRequest.Create ("http://WWW.x.com");
\r
224 Assert.IsTrue (req is TestWebRequest3, "#8");
\r
226 req = WebRequest.Create ("http://WWW.c");
\r
227 Assert.IsTrue (req is TestWebRequest3, "#9");
\r
229 req = WebRequest.CreateDefault (new Uri("http://WWW.contoso.com"));
\r
230 Assert.IsTrue (req is HttpWebRequest, "#10");
\r
233 req = WebRequest.Create ("tcp://www.contoso.com");
\r
234 Assert.Fail ("#11 should have failed with NotSupportedException");
\r
235 } catch (NotSupportedException) {
\r
240 public void Create_RequestUriString_Null ()
\r
243 WebRequest.Create ((string) null);
\r
244 Assert.Fail ("#1");
\r
245 } catch (ArgumentNullException ex) {
\r
246 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
247 Assert.IsNull (ex.InnerException, "#3");
\r
248 Assert.IsNotNull (ex.Message, "#4");
\r
249 Assert.IsNotNull (ex.ParamName, "#5");
\r
250 Assert.AreEqual ("requestUriString", ex.ParamName, "#6");
\r
255 public void CreateDefault_RequestUri_Null ()
\r
258 WebRequest.CreateDefault ((Uri) null);
\r
259 Assert.Fail ("#1");
\r
260 } catch (ArgumentNullException ex) {
\r
261 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
262 Assert.IsNull (ex.InnerException, "#3");
\r
263 Assert.IsNotNull (ex.Message, "#4");
\r
264 Assert.IsNotNull (ex.ParamName, "#5");
\r
265 Assert.AreEqual ("requestUri", ex.ParamName, "#6");
\r
270 #if FEATURE_NO_BSD_SOCKETS
\r
271 [ExpectedException (typeof (PlatformNotSupportedException))]
\r
273 public void DefaultWebProxy ()
\r
275 WebProxy proxy = new WebProxy ("proxy.intern.com", 83);
\r
277 WebRequest.DefaultWebProxy = proxy;
\r
278 Assert.IsNotNull (WebRequest.DefaultWebProxy, "#A1");
\r
279 Assert.AreSame (proxy, WebRequest.DefaultWebProxy, "#A2");
\r
281 HttpWebRequest req = (HttpWebRequest) WebRequest.CreateDefault (
\r
282 new Uri ("http://www.mono-project.com"));
\r
283 Assert.IsNotNull (req.Proxy, "#B1");
\r
284 Assert.AreSame (proxy, req.Proxy, "#B2");
\r
286 WebRequest.DefaultWebProxy = null;
\r
287 Assert.IsNull (WebRequest.DefaultWebProxy, "#C1");
\r
288 Assert.IsNotNull (req.Proxy, "#C2");
\r
289 Assert.AreSame (proxy, req.Proxy, "#C3");
\r
291 req = (HttpWebRequest) WebRequest.CreateDefault (
\r
292 new Uri ("http://www.mono-project.com"));
\r
293 Assert.IsNull (req.Proxy, "#D");
\r
297 public void RegisterPrefix_Creator_Null ()
\r
300 WebRequest.RegisterPrefix ("http://www.mono-project.com", (IWebRequestCreate) null);
\r
301 Assert.Fail ("#1");
\r
302 } catch (ArgumentNullException ex) {
\r
303 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
304 Assert.IsNull (ex.InnerException, "#3");
\r
305 Assert.IsNotNull (ex.Message, "#4");
\r
306 Assert.IsNotNull (ex.ParamName, "#5");
\r
307 Assert.AreEqual ("creator", ex.ParamName, "#6");
\r
312 public void RegisterPrefix_Prefix_Null ()
\r
315 WebRequest.RegisterPrefix ((string) null, new TestWebRequestCreator ());
\r
316 Assert.Fail ("#1");
\r
317 } catch (ArgumentNullException ex) {
\r
318 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
\r
319 Assert.IsNull (ex.InnerException, "#3");
\r
320 Assert.IsNotNull (ex.Message, "#4");
\r
321 Assert.IsNotNull (ex.ParamName, "#5");
\r
322 Assert.AreEqual ("prefix", ex.ParamName, "#6");
\r
326 [Test] //BNC#323452
\r
327 // Throws exception with Status == Timeout. The same code behaves as the test expects when run from a regular app.
\r
328 // Might be an issue with the test suite. To investigate.
\r
329 [Category("AndroidNotWorking")]
\r
330 public void TestFailedConnection ()
\r
333 WebRequest.Create ("http://127.0.0.1:0/non-existant.txt").GetResponse ();
\r
334 Assert.Fail ("Should have raised an exception");
\r
335 #if FEATURE_NO_BSD_SOCKETS
\r
336 } catch (PlatformNotSupportedException) {
\r
339 } catch (Exception e) {
\r
340 Assert.IsTrue (e is WebException, "Got " + e.GetType ().Name + ": " + e.Message);
\r
341 //#if NET_2_0 e.Message == "Unable to connect to the remote server"
\r
342 //#if NET_1_1 e.Message == "The underlying connection was closed: Unable to connect to the remote server."
\r
344 Assert.AreEqual (WebExceptionStatus.ConnectFailure, ((WebException)e).Status);
\r
346 //#if !NET_1_1 (this is not true in .NET 1.x)
\r
347 Assert.IsNotNull (e.InnerException);
\r
348 Assert.IsTrue (e.InnerException is Socks.SocketException, "InnerException should be SocketException");
\r
349 //e.Message == "The requested address is not valid in its context 127.0.0.1:0"
\r
354 [Test] //BNC#323452
\r
355 [Category ("AndroidNotWorking")] // Fails when ran as part of the entire BCL test suite. Works when only this fixture is ran
\r
356 public void TestFailedResolution ()
\r
359 var req = WebRequest.Create ("http://thisdomaindoesnotexist.monotestcase.x/non-existant.txt").GetResponse ();
\r
361 * Work around broken t-online.de DNS Server.
\r
363 * T-Online's DNS Server for DSL Customers resolves
\r
364 * non-exisitng domain names to
\r
365 * http://navigationshilfe1.t-online.de/dnserror?url=....
\r
366 * instead of reporting an error.
\r
368 if (req.ResponseUri.DnsSafeHost.Equals ("navigationshilfe1.t-online.de"))
\r
369 Assert.Ignore ("Misbehaving DNS server.");
\r
371 Assert.Fail ("Should have raised an exception");
\r
372 #if FEATURE_NO_BSD_SOCKETS
\r
373 } catch (PlatformNotSupportedException) {
\r
376 } catch (Exception e) {
\r
377 Assert.IsTrue (e is WebException);
\r
378 //#if NET_2_0 e.Message == "The underlying connection was closed: The remote name could not be resolved."
\r
379 //#if NET_1_1 e.Message == "The remote name could not be resolved: 'thisdomaindoesnotexist.monotestcase.x'"
\r
380 Assert.AreEqual (((WebException)e).Status, WebExceptionStatus.NameResolutionFailure);
\r
381 Assert.IsNull (e.InnerException);
\r
385 internal class TestWebRequestCreator : IWebRequestCreate
\r
387 internal TestWebRequestCreator () { }
\r
389 public WebRequest Create (Uri uri)
\r
391 return new TestWebRequest ();
\r
395 internal class TestWebRequest : WebRequest
\r
397 internal TestWebRequest () { }
\r
400 internal class TestWebRequestCreator2 : IWebRequestCreate
\r
402 internal TestWebRequestCreator2 () { }
\r
404 public WebRequest Create (Uri uri)
\r
406 return new TestWebRequest2 ();
\r
410 internal class TestWebRequest2 : WebRequest
\r
412 internal TestWebRequest2 () { }
\r
415 internal class TestWebRequestCreator3 : IWebRequestCreate
\r
417 internal TestWebRequestCreator3 () { }
\r
419 public WebRequest Create (Uri uri)
\r
421 return new TestWebRequest3 ();
\r
425 internal class TestWebRequest3 : WebRequest
\r
427 internal TestWebRequest3 () { }
\r
430 [Test] // Covers #41477
\r
431 #if FEATURE_NO_BSD_SOCKETS
\r
432 [ExpectedException (typeof (PlatformNotSupportedException))]
\r
434 public void TestReceiveCancelation ()
\r
436 var uri = "http://localhost:" + NetworkHelpers.FindFreePort () + "/";
\r
438 HttpListener listener = new HttpListener ();
\r
439 listener.Prefixes.Add (uri);
\r
443 for (var i = 0; i < 10; i++) {
\r
444 var request = WebRequest.CreateHttp (uri);
\r
445 request.Method = "GET";
\r
447 var tokenSource = new CancellationTokenSource ();
\r
448 tokenSource.Token.Register(() => request.Abort ());
\r
450 var responseTask = request.GetResponseAsync ();
\r
452 var context = listener.GetContext ();
\r
453 byte[] outBuffer = new byte[8 * 1024];
\r
454 context.Response.OutputStream.WriteAsync (outBuffer, 0, outBuffer.Length);
\r
456 Assert.IsTrue (responseTask.Wait (1000), "Timeout #1");
\r
458 WebResponse response = responseTask.Result;
\r
459 var stream = response.GetResponseStream ();
\r
461 byte[] buffer = new byte[8 * 1024];
\r
462 var taskRead = stream.ReadAsync (buffer, 0, buffer.Length, tokenSource.Token);
\r
464 tokenSource.Cancel ();
\r
466 Assert.IsTrue (taskRead.Wait (1000), "Timeout #2");
\r
468 var byteRead = taskRead.Result;
\r
470 } catch (AggregateException ex) {
\r
471 var webEx = ex.InnerException as WebException;
\r
472 Assert.IsNotNull(webEx, "Inner exception is not a WebException");
\r
473 Assert.AreEqual (webEx.Status, WebExceptionStatus.RequestCanceled);
\r