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