34ce1a370a1d4ed737bfe721ce2d4e03104c27b0
[mono.git] / mcs / class / System / Test / System.Net / WebRequestTest.cs
1 //\r
2 // WebRequestTest.cs - NUnit Test Cases for System.Net.WebRequest\r
3 //\r
4 // Authors:\r
5 //      Lawrence Pit (loz@cable.a2000.nl)\r
6 //      Martin Willemoes Hansen (mwh@sysrq.dk)\r
7 //      Sebastien Pouliot  <sebastien@ximian.com>\r
8 //\r
9 // (C) 2003 Martin Willemoes Hansen\r
10 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)\r
11 //\r
12 \r
13 using NUnit.Framework;\r
14 using MonoTests.Helpers;
15 using System;\r
16 using System.Net;\r
17 using System.Threading;
18 using System.Collections;\r
19 using System.Runtime.Serialization;\r
20 using Socks = System.Net.Sockets;\r
21 \r
22 \r
23 namespace MonoTests.System.Net {\r
24 \r
25         // WebRequest is abstract\r
26 \r
27         public class NonAbstractWebRequest : WebRequest\r
28         {\r
29 \r
30                 public NonAbstractWebRequest ()\r
31                 {\r
32                 }\r
33 \r
34                 public NonAbstractWebRequest (SerializationInfo si, StreamingContext sc)\r
35                         : base (si, sc)\r
36                 {\r
37                 }\r
38         }\r
39 \r
40         [TestFixture]\r
41         public class WebRequestTest {\r
42 \r
43                 private void Callback (IAsyncResult ar)\r
44                 {\r
45                         Assert.Fail ("Callback");\r
46                 }\r
47 \r
48                 [Test]\r
49                 public void SerializationConstructor ()\r
50                 {\r
51                         NonAbstractWebRequest w = new NonAbstractWebRequest (null, new StreamingContext ());\r
52                         Assert.IsNotNull (w);\r
53                 }\r
54 \r
55                 // properties (only test 'get'ter)\r
56 \r
57                 [Test]\r
58                 [ExpectedException (typeof (NotImplementedException))]\r
59                 public void ConnectionGroupName ()\r
60                 {\r
61                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
62                         Assert.IsNull (w.ConnectionGroupName);\r
63                 }\r
64 \r
65                 [Test]\r
66                 [ExpectedException (typeof (NotImplementedException))]\r
67                 public void ContentLength ()\r
68                 {\r
69                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
70                         Assert.IsNull (w.ContentLength);\r
71                 }\r
72 \r
73                 [Test]\r
74                 [ExpectedException (typeof (NotImplementedException))]\r
75                 public void ContentType ()\r
76                 {\r
77                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
78                         Assert.IsNull (w.ContentType);\r
79                 }\r
80 \r
81                 [Test]\r
82                 [ExpectedException (typeof (NotImplementedException))]\r
83                 public void Credentials ()\r
84                 {\r
85                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
86                         Assert.IsNull (w.Credentials);\r
87                 }\r
88 \r
89                 [Test]\r
90                 [ExpectedException (typeof (NotImplementedException))]\r
91                 public void Headers ()\r
92                 {\r
93                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
94                         Assert.IsNull (w.Headers);\r
95                 }\r
96 \r
97                 [Test]\r
98                 [ExpectedException (typeof (NotImplementedException))]\r
99                 public void Method ()\r
100                 {\r
101                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
102                         Assert.IsNull (w.Method);\r
103                 }\r
104 \r
105                 [Test]\r
106                 [ExpectedException (typeof (NotImplementedException))]\r
107                 public void PreAuthenticate ()\r
108                 {\r
109                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
110                         Assert.IsTrue (w.PreAuthenticate);\r
111                 }\r
112 \r
113                 [Test]\r
114                 [ExpectedException (typeof (NotImplementedException))]\r
115                 public void Proxy ()\r
116                 {\r
117                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
118                         Assert.IsNull (w.Proxy);\r
119                 }\r
120 \r
121                 [Test]\r
122                 [ExpectedException (typeof (NotImplementedException))]\r
123                 public void RequestUri ()\r
124                 {\r
125                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
126                         Assert.IsNull (w.RequestUri);\r
127                 }\r
128 \r
129                 [Test]\r
130                 [ExpectedException (typeof (NotImplementedException))]\r
131                 public void Timeout ()\r
132                 {\r
133                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
134                         Assert.IsNull (w.Timeout);\r
135                 }\r
136 \r
137                 // methods\r
138 \r
139                 [Test]\r
140                 [ExpectedException (typeof (NotImplementedException))]\r
141                 public void Abort ()\r
142                 {\r
143                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
144                         w.Abort ();\r
145                 }\r
146 \r
147                 [Test]\r
148                 [ExpectedException (typeof (NotImplementedException))]\r
149                 public void BeginGetRequestStream ()\r
150                 {\r
151                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
152                         IAsyncResult r = w.BeginGetRequestStream (new AsyncCallback (Callback), w);\r
153                 }\r
154 \r
155                 [Test]\r
156                 [ExpectedException (typeof (NotImplementedException))]\r
157                 public void BeginGetResponse ()\r
158                 {\r
159                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
160                         IAsyncResult r = w.BeginGetResponse (new AsyncCallback (Callback), w);\r
161                 }\r
162 \r
163                 [Test]\r
164                 [ExpectedException (typeof (NotImplementedException))]\r
165                 public void EndGetRequestStream ()\r
166                 {\r
167                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
168                         w.EndGetRequestStream (null);\r
169                 }\r
170 \r
171                 [Test]\r
172                 [ExpectedException (typeof (NotImplementedException))]\r
173                 public void EndGetResponse ()\r
174                 {\r
175                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
176                         w.EndGetResponse (null);\r
177                 }\r
178 \r
179                 [Test]\r
180                 [ExpectedException (typeof (NotImplementedException))]\r
181                 public void GetRequestStream ()\r
182                 {\r
183                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
184                         w.GetRequestStream ();\r
185                 }\r
186 \r
187                 [Test]\r
188                 [ExpectedException (typeof (NotImplementedException))]\r
189                 public void GetResponse ()\r
190                 {\r
191                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
192                         w.GetResponse ();\r
193                 }\r
194 \r
195         [Test]\r
196         public void All ()\r
197         {\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
213 \r
214                 req = WebRequest.Create ("http://WWW.contoso.com");\r
215                 Assert.IsTrue (req is TestWebRequest, "#6"); \r
216 \r
217                 req = WebRequest.Create ("http://WWW.contoso.com/foo/bar/index.html");\r
218                 Assert.IsTrue (req is TestWebRequest2, "#7"); \r
219                 \r
220                 req = WebRequest.Create ("http://WWW.x.com");\r
221                 Assert.IsTrue (req is TestWebRequest3, "#8"); \r
222 \r
223                 req = WebRequest.Create ("http://WWW.c");\r
224                 Assert.IsTrue (req is TestWebRequest3, "#9"); \r
225 \r
226                 req = WebRequest.CreateDefault (new Uri("http://WWW.contoso.com"));\r
227                 Assert.IsTrue (req is HttpWebRequest, "#10");\r
228 \r
229                 try {\r
230                         req = WebRequest.Create ("tcp://www.contoso.com");\r
231                         Assert.Fail ("#11 should have failed with NotSupportedException");\r
232                 } catch (NotSupportedException) {\r
233                 }\r
234         }\r
235 \r
236         [Test]\r
237         public void Create_RequestUriString_Null ()\r
238         {\r
239                 try {\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
248                 }\r
249         }\r
250 \r
251         [Test]\r
252         public void CreateDefault_RequestUri_Null ()\r
253         {\r
254                 try {\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
263                 }\r
264         }\r
265 \r
266         [Test]\r
267         public void DefaultWebProxy ()\r
268         {\r
269                 WebProxy proxy = new WebProxy ("proxy.intern.com", 83);\r
270 \r
271                 WebRequest.DefaultWebProxy = proxy;\r
272                 Assert.IsNotNull (WebRequest.DefaultWebProxy, "#A1");\r
273                 Assert.AreSame (proxy, WebRequest.DefaultWebProxy, "#A2");\r
274 \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
279 \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
284 \r
285                 req = (HttpWebRequest) WebRequest.CreateDefault (\r
286                         new Uri ("http://www.mono-project.com"));\r
287                 Assert.IsNull (req.Proxy, "#D");\r
288         }\r
289 \r
290         [Test]\r
291         public void RegisterPrefix_Creator_Null ()\r
292         {\r
293                 try {\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
302                 }\r
303         }\r
304 \r
305         [Test]\r
306         public void RegisterPrefix_Prefix_Null ()\r
307         {\r
308                 try {\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
317                 }\r
318         }\r
319 \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
325         {\r
326                 try {\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
333 \r
334                         Assert.AreEqual (WebExceptionStatus.ConnectFailure, ((WebException)e).Status);\r
335 \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
340                         //#endif\r
341                 }\r
342         }\r
343 \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
347         {\r
348                 try {\r
349                         var req = WebRequest.Create ("http://thisdomaindoesnotexist.monotestcase.x/non-existant.txt").GetResponse ();\r
350                         /*\r
351                          * Work around broken t-online.de DNS Server.\r
352                          * \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
357                          */\r
358                         if (req.ResponseUri.DnsSafeHost.Equals ("navigationshilfe1.t-online.de"))\r
359                                 Assert.Ignore ("Misbehaving DNS server.");\r
360 \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
368                 }\r
369         }\r
370 \r
371         internal class TestWebRequestCreator : IWebRequestCreate\r
372         {\r
373                 internal TestWebRequestCreator () { }\r
374                 \r
375                 public WebRequest Create (Uri uri)\r
376                 {\r
377                         return new TestWebRequest ();\r
378                 }\r
379         }\r
380         \r
381         internal class TestWebRequest : WebRequest\r
382         {\r
383                 internal TestWebRequest () { }\r
384         }\r
385 \r
386         internal class TestWebRequestCreator2 : IWebRequestCreate\r
387         {\r
388                 internal TestWebRequestCreator2 () { }\r
389                 \r
390                 public WebRequest Create (Uri uri)\r
391                 {\r
392                         return new TestWebRequest2 ();\r
393                 }\r
394         }\r
395         \r
396         internal class TestWebRequest2 : WebRequest\r
397         {\r
398                 internal TestWebRequest2 () { }\r
399         }\r
400 \r
401         internal class TestWebRequestCreator3 : IWebRequestCreate\r
402         {\r
403                 internal TestWebRequestCreator3 () { }\r
404                 \r
405                 public WebRequest Create (Uri uri)\r
406                 {\r
407                         return new TestWebRequest3 ();\r
408                 }\r
409         }\r
410         \r
411         internal class TestWebRequest3 : WebRequest\r
412         {\r
413                 internal TestWebRequest3 () { }\r
414         }\r
415
416         [Test] // Covers #41477
417         [Category ("RequiresBSDSockets")]
418         public void TestReceiveCancelation ()
419         {
420                 var uri = "http://localhost:" + NetworkHelpers.FindFreePort () + "/";
421
422                 HttpListener listener = new HttpListener ();
423                 listener.Prefixes.Add (uri);
424                 listener.Start ();
425
426                 try {
427                         for (var i = 0; i < 10; i++) {
428                                 var request = WebRequest.CreateHttp (uri);
429                                 request.Method = "GET";
430
431                                 var tokenSource = new CancellationTokenSource ();
432                                 tokenSource.Token.Register(() => request.Abort ());
433
434                                 var responseTask = request.GetResponseAsync ();
435
436                                 var context = listener.GetContext ();
437                                 byte[] outBuffer = new byte[8 * 1024];
438                                 context.Response.OutputStream.WriteAsync (outBuffer, 0, outBuffer.Length);
439
440                                 Assert.IsTrue (responseTask.Wait (1000), "Timeout #1");
441
442                                 WebResponse response = responseTask.Result;
443                                 var stream = response.GetResponseStream ();
444
445                                 byte[] buffer = new byte[8 * 1024];
446                                 var taskRead = stream.ReadAsync (buffer, 0, buffer.Length, tokenSource.Token);
447
448                                 tokenSource.Cancel ();
449
450                                 Assert.IsTrue (taskRead.Wait (1000), "Timeout #2");
451
452                                 var byteRead = taskRead.Result;
453                         }
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);
458                 }
459
460                 listener.Close ();
461         }
462 }\r
463 \r
464 }\r
465 \r