Merge pull request #1936 from esdrubal/DotNetRelativeOrAbsolute
[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 System;\r
15 using System.Net;\r
16 using System.Collections;\r
17 using System.Runtime.Serialization;\r
18 using Socks = System.Net.Sockets;\r
19 \r
20 \r
21 namespace MonoTests.System.Net {\r
22 \r
23         // WebRequest is abstract\r
24 \r
25         public class NonAbstractWebRequest : WebRequest\r
26         {\r
27 \r
28                 public NonAbstractWebRequest ()\r
29                 {\r
30                 }\r
31 \r
32                 public NonAbstractWebRequest (SerializationInfo si, StreamingContext sc)\r
33                         : base (si, sc)\r
34                 {\r
35                 }\r
36         }\r
37 \r
38         [TestFixture]\r
39         public class WebRequestTest {\r
40 \r
41                 private void Callback (IAsyncResult ar)\r
42                 {\r
43                         Assert.Fail ("Callback");\r
44                 }\r
45 \r
46                 [Test]\r
47                 public void SerializationConstructor ()\r
48                 {\r
49                         NonAbstractWebRequest w = new NonAbstractWebRequest (null, new StreamingContext ());\r
50                         Assert.IsNotNull (w);\r
51                 }\r
52 \r
53                 // properties (only test 'get'ter)\r
54 \r
55                 [Test]\r
56                 [ExpectedException (typeof (NotImplementedException))]\r
57                 public void ConnectionGroupName ()\r
58                 {\r
59                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
60                         Assert.IsNull (w.ConnectionGroupName);\r
61                 }\r
62 \r
63                 [Test]\r
64                 [ExpectedException (typeof (NotImplementedException))]\r
65                 public void ContentLength ()\r
66                 {\r
67                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
68                         Assert.IsNull (w.ContentLength);\r
69                 }\r
70 \r
71                 [Test]\r
72                 [ExpectedException (typeof (NotImplementedException))]\r
73                 public void ContentType ()\r
74                 {\r
75                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
76                         Assert.IsNull (w.ContentType);\r
77                 }\r
78 \r
79                 [Test]\r
80                 [ExpectedException (typeof (NotImplementedException))]\r
81                 public void Credentials ()\r
82                 {\r
83                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
84                         Assert.IsNull (w.Credentials);\r
85                 }\r
86 \r
87                 [Test]\r
88                 [ExpectedException (typeof (NotImplementedException))]\r
89                 public void Headers ()\r
90                 {\r
91                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
92                         Assert.IsNull (w.Headers);\r
93                 }\r
94 \r
95                 [Test]\r
96                 [ExpectedException (typeof (NotImplementedException))]\r
97                 public void Method ()\r
98                 {\r
99                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
100                         Assert.IsNull (w.Method);\r
101                 }\r
102 \r
103                 [Test]\r
104                 [ExpectedException (typeof (NotImplementedException))]\r
105                 public void PreAuthenticate ()\r
106                 {\r
107                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
108                         Assert.IsTrue (w.PreAuthenticate);\r
109                 }\r
110 \r
111                 [Test]\r
112                 [ExpectedException (typeof (NotImplementedException))]\r
113                 public void Proxy ()\r
114                 {\r
115                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
116                         Assert.IsNull (w.Proxy);\r
117                 }\r
118 \r
119                 [Test]\r
120                 [ExpectedException (typeof (NotImplementedException))]\r
121                 public void RequestUri ()\r
122                 {\r
123                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
124                         Assert.IsNull (w.RequestUri);\r
125                 }\r
126 \r
127                 [Test]\r
128                 [ExpectedException (typeof (NotImplementedException))]\r
129                 public void Timeout ()\r
130                 {\r
131                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
132                         Assert.IsNull (w.Timeout);\r
133                 }\r
134 \r
135                 // methods\r
136 \r
137                 [Test]\r
138                 [ExpectedException (typeof (NotImplementedException))]\r
139                 public void Abort ()\r
140                 {\r
141                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
142                         w.Abort ();\r
143                 }\r
144 \r
145                 [Test]\r
146                 [ExpectedException (typeof (NotImplementedException))]\r
147                 public void BeginGetRequestStream ()\r
148                 {\r
149                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
150                         IAsyncResult r = w.BeginGetRequestStream (new AsyncCallback (Callback), w);\r
151                 }\r
152 \r
153                 [Test]\r
154                 [ExpectedException (typeof (NotImplementedException))]\r
155                 public void BeginGetResponse ()\r
156                 {\r
157                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
158                         IAsyncResult r = w.BeginGetResponse (new AsyncCallback (Callback), w);\r
159                 }\r
160 \r
161                 [Test]\r
162                 [ExpectedException (typeof (NotImplementedException))]\r
163                 public void EndGetRequestStream ()\r
164                 {\r
165                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
166                         w.EndGetRequestStream (null);\r
167                 }\r
168 \r
169                 [Test]\r
170                 [ExpectedException (typeof (NotImplementedException))]\r
171                 public void EndGetResponse ()\r
172                 {\r
173                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
174                         w.EndGetResponse (null);\r
175                 }\r
176 \r
177                 [Test]\r
178                 [ExpectedException (typeof (NotImplementedException))]\r
179                 public void GetRequestStream ()\r
180                 {\r
181                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
182                         w.GetRequestStream ();\r
183                 }\r
184 \r
185                 [Test]\r
186                 [ExpectedException (typeof (NotImplementedException))]\r
187                 public void GetResponse ()\r
188                 {\r
189                         NonAbstractWebRequest w = new NonAbstractWebRequest ();\r
190                         w.GetResponse ();\r
191                 }\r
192 \r
193         [Test]\r
194         public void All ()\r
195         {\r
196                 WebRequest req = WebRequest.Create ("http://www.contoso.com");\r
197                 Assert.IsTrue (req is HttpWebRequest, "#1");\r
198                 req = WebRequest.Create ("https://www.contoso.com");\r
199                 Assert.IsTrue (req is HttpWebRequest, "#2");\r
200                 req = WebRequest.Create ("file://www.contoso.com");\r
201                 Assert.IsTrue (req is FileWebRequest, "#3");\r
202                 req = WebRequest.Create ("ftp://www.contoso.com");\r
203                 Assert.IsTrue (req is FtpWebRequest, "#4");\r
204                 WebRequest.RegisterPrefix ("http://www.contoso.com", new TestWebRequestCreator ());\r
205                 bool ret = WebRequest.RegisterPrefix ("http://WWW.contoso.com", new TestWebRequestCreator ());\r
206                 Assert.AreEqual (false, ret, "#5a");\r
207                 ret = WebRequest.RegisterPrefix ("http://www.contoso.com/foo/bar", new TestWebRequestCreator2 ());\r
208                 Assert.AreEqual (true, ret, "#5b");\r
209                 ret = WebRequest.RegisterPrefix ("http://www", new TestWebRequestCreator3 ());\r
210                 Assert.AreEqual (true, ret, "#5c");\r
211 \r
212                 req = WebRequest.Create ("http://WWW.contoso.com");\r
213                 Assert.IsTrue (req is TestWebRequest, "#6"); \r
214 \r
215                 req = WebRequest.Create ("http://WWW.contoso.com/foo/bar/index.html");\r
216                 Assert.IsTrue (req is TestWebRequest2, "#7"); \r
217                 \r
218                 req = WebRequest.Create ("http://WWW.x.com");\r
219                 Assert.IsTrue (req is TestWebRequest3, "#8"); \r
220 \r
221                 req = WebRequest.Create ("http://WWW.c");\r
222                 Assert.IsTrue (req is TestWebRequest3, "#9"); \r
223 \r
224                 req = WebRequest.CreateDefault (new Uri("http://WWW.contoso.com"));\r
225                 Assert.IsTrue (req is HttpWebRequest, "#10");\r
226 \r
227                 try {\r
228                         req = WebRequest.Create ("tcp://www.contoso.com");\r
229                         Assert.Fail ("#11 should have failed with NotSupportedException");\r
230                 } catch (NotSupportedException) {\r
231                 }\r
232         }\r
233 \r
234         [Test]\r
235         public void Create_RequestUriString_Null ()\r
236         {\r
237                 try {\r
238                         WebRequest.Create ((string) null);\r
239                         Assert.Fail ("#1");\r
240                 } catch (ArgumentNullException ex) {\r
241                         Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");\r
242                         Assert.IsNull (ex.InnerException, "#3");\r
243                         Assert.IsNotNull (ex.Message, "#4");\r
244                         Assert.IsNotNull (ex.ParamName, "#5");\r
245                         Assert.AreEqual ("requestUriString", ex.ParamName, "#6");\r
246                 }\r
247         }\r
248 \r
249         [Test]\r
250         public void CreateDefault_RequestUri_Null ()\r
251         {\r
252                 try {\r
253                         WebRequest.CreateDefault ((Uri) null);\r
254                         Assert.Fail ("#1");\r
255                 } catch (ArgumentNullException ex) {\r
256                         Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");\r
257                         Assert.IsNull (ex.InnerException, "#3");\r
258                         Assert.IsNotNull (ex.Message, "#4");\r
259                         Assert.IsNotNull (ex.ParamName, "#5");\r
260                         Assert.AreEqual ("requestUri", ex.ParamName, "#6");\r
261                 }\r
262         }\r
263 \r
264         [Test]\r
265         public void DefaultWebProxy ()\r
266         {\r
267                 WebProxy proxy = new WebProxy ("proxy.intern.com", 83);\r
268 \r
269                 WebRequest.DefaultWebProxy = proxy;\r
270                 Assert.IsNotNull (WebRequest.DefaultWebProxy, "#A1");\r
271                 Assert.AreSame (proxy, WebRequest.DefaultWebProxy, "#A2");\r
272 \r
273                 HttpWebRequest req = (HttpWebRequest) WebRequest.CreateDefault (\r
274                         new Uri ("http://www.mono-project.com"));\r
275                 Assert.IsNotNull (req.Proxy, "#B1");\r
276                 Assert.AreSame (proxy, req.Proxy, "#B2");\r
277 \r
278                 WebRequest.DefaultWebProxy = null;\r
279                 Assert.IsNull (WebRequest.DefaultWebProxy, "#C1");\r
280                 Assert.IsNotNull (req.Proxy, "#C2");\r
281                 Assert.AreSame (proxy, req.Proxy, "#C3");\r
282 \r
283                 req = (HttpWebRequest) WebRequest.CreateDefault (\r
284                         new Uri ("http://www.mono-project.com"));\r
285                 Assert.IsNull (req.Proxy, "#D");\r
286         }\r
287 \r
288         [Test]\r
289         public void RegisterPrefix_Creator_Null ()\r
290         {\r
291                 try {\r
292                         WebRequest.RegisterPrefix ("http://www.mono-project.com", (IWebRequestCreate) null);\r
293                         Assert.Fail ("#1");\r
294                 } catch (ArgumentNullException ex) {\r
295                         Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");\r
296                         Assert.IsNull (ex.InnerException, "#3");\r
297                         Assert.IsNotNull (ex.Message, "#4");\r
298                         Assert.IsNotNull (ex.ParamName, "#5");\r
299                         Assert.AreEqual ("creator", ex.ParamName, "#6");\r
300                 }\r
301         }\r
302 \r
303         [Test]\r
304         public void RegisterPrefix_Prefix_Null ()\r
305         {\r
306                 try {\r
307                         WebRequest.RegisterPrefix ((string) null, new TestWebRequestCreator ());\r
308                         Assert.Fail ("#1");\r
309                 } catch (ArgumentNullException ex) {\r
310                         Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");\r
311                         Assert.IsNull (ex.InnerException, "#3");\r
312                         Assert.IsNotNull (ex.Message, "#4");\r
313                         Assert.IsNotNull (ex.ParamName, "#5");\r
314                         Assert.AreEqual ("prefix", ex.ParamName, "#6");\r
315                 }\r
316         }\r
317 \r
318         [Test] //BNC#323452\r
319         // Throws exception with Status == Timeout. The same code behaves as the test expects when run from a regular app.
320         // Might be an issue with the test suite. To investigate.
321         [Category("AndroidNotWorking")] 
322         public void TestFailedConnection ()\r
323         {\r
324                 try {\r
325                         WebRequest.Create ("http://127.0.0.1:0/non-existant.txt").GetResponse ();\r
326                         Assert.Fail ("Should have raised an exception");\r
327                 } catch (Exception e) {\r
328                         Assert.IsTrue (e is WebException, "Got " + e.GetType ().Name + ": " + e.Message);\r
329                         //#if NET_2_0 e.Message == "Unable to connect to the remote server"\r
330                         //#if NET_1_1 e.Message == "The underlying connection was closed: Unable to connect to the remote server."\r
331 \r
332                         Assert.AreEqual (WebExceptionStatus.ConnectFailure, ((WebException)e).Status);\r
333 \r
334                         //#if !NET_1_1 (this is not true in .NET 1.x)\r
335                         Assert.IsNotNull (e.InnerException);\r
336                         Assert.IsTrue (e.InnerException is Socks.SocketException, "InnerException should be SocketException");\r
337                         //e.Message == "The requested address is not valid in its context 127.0.0.1:0"\r
338                         //#endif\r
339                 }\r
340         }\r
341 \r
342         [Test] //BNC#323452\r
343         [Category ("AndroidNotWorking")] // Fails when ran as part of the entire BCL test suite. Works when only this fixture is ran
344         public void TestFailedResolution ()\r
345         {\r
346                 try {\r
347                         var req = WebRequest.Create ("http://thisdomaindoesnotexist.monotestcase.x/non-existant.txt").GetResponse ();\r
348                         /*\r
349                          * Work around broken t-online.de DNS Server.\r
350                          * \r
351                          * T-Online's DNS Server for DSL Customers resolves\r
352                          * non-exisitng domain names to\r
353                          * http://navigationshilfe1.t-online.de/dnserror?url=....\r
354                          * instead of reporting an error.\r
355                          */\r
356                         if (req.ResponseUri.DnsSafeHost.Equals ("navigationshilfe1.t-online.de"))\r
357                                 Assert.Ignore ("Misbehaving DNS server.");\r
358 \r
359                         Assert.Fail ("Should have raised an exception");\r
360                 } catch (Exception e) {\r
361                         Assert.IsTrue (e is WebException);\r
362                         //#if NET_2_0 e.Message == "The underlying connection was closed: The remote name could not be resolved."\r
363                         //#if NET_1_1 e.Message == "The remote name could not be resolved: 'thisdomaindoesnotexist.monotestcase.x'"\r
364                         Assert.AreEqual (((WebException)e).Status, WebExceptionStatus.NameResolutionFailure);\r
365                         Assert.IsNull (e.InnerException);\r
366                 }\r
367         }\r
368 \r
369         internal class TestWebRequestCreator : IWebRequestCreate\r
370         {\r
371                 internal TestWebRequestCreator () { }\r
372                 \r
373                 public WebRequest Create (Uri uri)\r
374                 {\r
375                         return new TestWebRequest ();\r
376                 }\r
377         }\r
378         \r
379         internal class TestWebRequest : WebRequest\r
380         {\r
381                 internal TestWebRequest () { }\r
382         }\r
383 \r
384         internal class TestWebRequestCreator2 : IWebRequestCreate\r
385         {\r
386                 internal TestWebRequestCreator2 () { }\r
387                 \r
388                 public WebRequest Create (Uri uri)\r
389                 {\r
390                         return new TestWebRequest2 ();\r
391                 }\r
392         }\r
393         \r
394         internal class TestWebRequest2 : WebRequest\r
395         {\r
396                 internal TestWebRequest2 () { }\r
397         }\r
398 \r
399         internal class TestWebRequestCreator3 : IWebRequestCreate\r
400         {\r
401                 internal TestWebRequestCreator3 () { }\r
402                 \r
403                 public WebRequest Create (Uri uri)\r
404                 {\r
405                         return new TestWebRequest3 ();\r
406                 }\r
407         }\r
408         \r
409         internal class TestWebRequest3 : WebRequest\r
410         {\r
411                 internal TestWebRequest3 () { }\r
412         }\r
413 }\r
414 \r
415 }\r
416 \r