[System*] Throw a PlatformNotSupported exception when using the networking stack...
[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;\r
15 using System;\r
16 using System.Net;\r
17 using System.Threading;\r
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 #if FEATURE_NO_BSD_SOCKETS\r
197         [ExpectedException (typeof (PlatformNotSupportedException))]\r
198 #endif\r
199         public void All ()\r
200         {\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
216 \r
217                 req = WebRequest.Create ("http://WWW.contoso.com");\r
218                 Assert.IsTrue (req is TestWebRequest, "#6"); \r
219 \r
220                 req = WebRequest.Create ("http://WWW.contoso.com/foo/bar/index.html");\r
221                 Assert.IsTrue (req is TestWebRequest2, "#7"); \r
222                 \r
223                 req = WebRequest.Create ("http://WWW.x.com");\r
224                 Assert.IsTrue (req is TestWebRequest3, "#8"); \r
225 \r
226                 req = WebRequest.Create ("http://WWW.c");\r
227                 Assert.IsTrue (req is TestWebRequest3, "#9"); \r
228 \r
229                 req = WebRequest.CreateDefault (new Uri("http://WWW.contoso.com"));\r
230                 Assert.IsTrue (req is HttpWebRequest, "#10");\r
231 \r
232                 try {\r
233                         req = WebRequest.Create ("tcp://www.contoso.com");\r
234                         Assert.Fail ("#11 should have failed with NotSupportedException");\r
235                 } catch (NotSupportedException) {\r
236                 }\r
237         }\r
238 \r
239         [Test]\r
240         public void Create_RequestUriString_Null ()\r
241         {\r
242                 try {\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
251                 }\r
252         }\r
253 \r
254         [Test]\r
255         public void CreateDefault_RequestUri_Null ()\r
256         {\r
257                 try {\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
266                 }\r
267         }\r
268 \r
269         [Test]\r
270 #if FEATURE_NO_BSD_SOCKETS\r
271         [ExpectedException (typeof (PlatformNotSupportedException))]\r
272 #endif\r
273         public void DefaultWebProxy ()\r
274         {\r
275                 WebProxy proxy = new WebProxy ("proxy.intern.com", 83);\r
276 \r
277                 WebRequest.DefaultWebProxy = proxy;\r
278                 Assert.IsNotNull (WebRequest.DefaultWebProxy, "#A1");\r
279                 Assert.AreSame (proxy, WebRequest.DefaultWebProxy, "#A2");\r
280 \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
285 \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
290 \r
291                 req = (HttpWebRequest) WebRequest.CreateDefault (\r
292                         new Uri ("http://www.mono-project.com"));\r
293                 Assert.IsNull (req.Proxy, "#D");\r
294         }\r
295 \r
296         [Test]\r
297         public void RegisterPrefix_Creator_Null ()\r
298         {\r
299                 try {\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
308                 }\r
309         }\r
310 \r
311         [Test]\r
312         public void RegisterPrefix_Prefix_Null ()\r
313         {\r
314                 try {\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
323                 }\r
324         }\r
325 \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
331         {\r
332                 try {\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
337                         // Expected\r
338 #endif\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
343 \r
344                         Assert.AreEqual (WebExceptionStatus.ConnectFailure, ((WebException)e).Status);\r
345 \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
350                         //#endif\r
351                 }\r
352         }\r
353 \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
357         {\r
358                 try {\r
359                         var req = WebRequest.Create ("http://thisdomaindoesnotexist.monotestcase.x/non-existant.txt").GetResponse ();\r
360                         /*\r
361                          * Work around broken t-online.de DNS Server.\r
362                          * \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
367                          */\r
368                         if (req.ResponseUri.DnsSafeHost.Equals ("navigationshilfe1.t-online.de"))\r
369                                 Assert.Ignore ("Misbehaving DNS server.");\r
370 \r
371                         Assert.Fail ("Should have raised an exception");\r
372 #if FEATURE_NO_BSD_SOCKETS\r
373                 } catch (PlatformNotSupportedException) {\r
374                         // Expected\r
375 #endif\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
382                 }\r
383         }\r
384 \r
385         internal class TestWebRequestCreator : IWebRequestCreate\r
386         {\r
387                 internal TestWebRequestCreator () { }\r
388                 \r
389                 public WebRequest Create (Uri uri)\r
390                 {\r
391                         return new TestWebRequest ();\r
392                 }\r
393         }\r
394         \r
395         internal class TestWebRequest : WebRequest\r
396         {\r
397                 internal TestWebRequest () { }\r
398         }\r
399 \r
400         internal class TestWebRequestCreator2 : IWebRequestCreate\r
401         {\r
402                 internal TestWebRequestCreator2 () { }\r
403                 \r
404                 public WebRequest Create (Uri uri)\r
405                 {\r
406                         return new TestWebRequest2 ();\r
407                 }\r
408         }\r
409         \r
410         internal class TestWebRequest2 : WebRequest\r
411         {\r
412                 internal TestWebRequest2 () { }\r
413         }\r
414 \r
415         internal class TestWebRequestCreator3 : IWebRequestCreate\r
416         {\r
417                 internal TestWebRequestCreator3 () { }\r
418                 \r
419                 public WebRequest Create (Uri uri)\r
420                 {\r
421                         return new TestWebRequest3 ();\r
422                 }\r
423         }\r
424         \r
425         internal class TestWebRequest3 : WebRequest\r
426         {\r
427                 internal TestWebRequest3 () { }\r
428         }\r
429 \r
430         [Test] // Covers #41477\r
431 #if FEATURE_NO_BSD_SOCKETS\r
432         [ExpectedException (typeof (PlatformNotSupportedException))]\r
433 #endif\r
434         public void TestReceiveCancelation ()\r
435         {\r
436                 var uri = "http://localhost:" + NetworkHelpers.FindFreePort () + "/";\r
437 \r
438                 HttpListener listener = new HttpListener ();\r
439                 listener.Prefixes.Add (uri);\r
440                 listener.Start ();\r
441 \r
442                 try {\r
443                         for (var i = 0; i < 10; i++) {\r
444                                 var request = WebRequest.CreateHttp (uri);\r
445                                 request.Method = "GET";\r
446 \r
447                                 var tokenSource = new CancellationTokenSource ();\r
448                                 tokenSource.Token.Register(() => request.Abort ());\r
449 \r
450                                 var responseTask = request.GetResponseAsync ();\r
451 \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
455 \r
456                                 Assert.IsTrue (responseTask.Wait (1000), "Timeout #1");\r
457 \r
458                                 WebResponse response = responseTask.Result;\r
459                                 var stream = response.GetResponseStream ();\r
460 \r
461                                 byte[] buffer = new byte[8 * 1024];\r
462                                 var taskRead = stream.ReadAsync (buffer, 0, buffer.Length, tokenSource.Token);\r
463 \r
464                                 tokenSource.Cancel ();\r
465 \r
466                                 Assert.IsTrue (taskRead.Wait (1000), "Timeout #2");\r
467 \r
468                                 var byteRead = taskRead.Result;\r
469                         }\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
474                 }\r
475 \r
476                 listener.Close ();\r
477         }\r
478 }\r
479 \r
480 }\r
481 \r