[bcl] Remove the ValueAdd and InetAccess NUnit categories (#2212)
[mono.git] / mcs / class / System / Test / System.Net / ServicePointTest.cs
1 //
2 // ServicePointTest.cs - NUnit Test Cases for System.Net.ServicePoint
3 //
4 // Authors:
5 //   Lawrence Pit (loz@cable.a2000.nl)
6 //   Martin Willemoes Hansen (mwh@sysrq.dk)
7 //
8 // (C) 2003 Martin Willemoes Hansen
9 //
10
11 using NUnit.Framework;
12 using System;
13 using System.Collections;
14 using System.IO;
15 using System.Net;
16 using System.Reflection;
17 using System.Threading;
18
19 namespace MonoTests.System.Net
20 {
21
22 [TestFixture]
23 public class ServicePointTest
24 {
25         static private int max;
26
27 #if !FEATURE_NO_BSD_SOCKETS
28         [SetUp]
29         public void SaveMax () {
30                 max = ServicePointManager.MaxServicePoints;
31                 ServicePointManager.MaxServicePoints = 0;
32         }
33
34         [TearDown]
35         public void RestoreMax () {
36                 ServicePointManager.MaxServicePoints = max;
37         }
38 #endif
39
40         [Test]
41                 [Category ("NotWorking")]
42         public void All ()
43         {
44                 ServicePoint p = ServicePointManager.FindServicePoint (new Uri ("mailto:xx@yyy.com"));
45                 //WriteServicePoint ("A servicepoint that isn't really", p);                    
46                 
47                 ServicePointManager.MaxServicePoints = 2;
48                 ServicePoint google = ServicePointManager.FindServicePoint (new Uri ("http://www.google.com"));
49                 try {                   
50                         ServicePoint slashdot = ServicePointManager.FindServicePoint (new Uri ("http://www.slashdot.org"));
51                         Assert.Fail ("#1");
52                 } catch (InvalidOperationException) { }
53                 ServicePointManager.MaxServicePoints = 0;
54                 
55                 //WriteServicePoint ("google before getting a webrequest", google);
56                 
57                 HttpWebRequest req = (HttpWebRequest) WebRequest.Create ("http://www.google.com");
58                 HttpWebResponse res = (HttpWebResponse) req.GetResponse ();                     
59                 
60 #if FOUND_SOME_OTHER_URL
61                 // URL is no longer found, disabled the test until a more reliable URL is found :P
62                 //WriteServicePoint ("google after getting a response", google);
63                 ServicePoint google2 = ServicePointManager.FindServicePoint (new Uri ("http://www.google.com/dilbert.html"));
64                 Assert.AreEqual (google, google2, "#equals");
65                 res.Close ();
66 #endif
67                 
68                 // in both instances property CurrentConnections is 0 according to ms.net.
69                 // let's see what it says when we do async operations...
70                 
71                 HttpWebRequest req2 = (HttpWebRequest) WebRequest.Create ("http://www.google.com");
72                 req2.Method = "PUT";
73                 IAsyncResult async = req2.BeginGetRequestStream (null, null);
74                 //WriteServicePoint ("after async BeginGetRequestStream", google);
75                 // CurrentConnections: 1
76                 Stream stream2 = req2.EndGetRequestStream (async);
77                 //WriteServicePoint ("after async EndGetRequestStream", google);
78                 // CurrentConnections: 1
79                 stream2.Close ();
80                 
81                 req2 = (HttpWebRequest) WebRequest.Create ("http://www.google.com");
82                 async = req2.BeginGetResponse (null, null);
83                 //WriteServicePoint ("after async BeginGetResponse", google);
84                 // CurrentConnections: 2
85                 WebResponse res2 = req2.EndGetResponse (async);
86                 //WriteServicePoint ("after async EndGetResponse", google);
87                 // CurrentConnections: 0                        
88                 // curious that after you get the webresponse object CurrentConnections is set to 0.
89                 // you'd think that you'd still be connected until you close the webresponse..
90                 //Console.WriteLine ("ContentLength: " + res2.ContentLength);
91                 res2.Close ();
92                 
93                 ServicePoint sp2;
94 #if FOUND_SOME_OTHER_URL
95                 // unless of course some buffering is taking place.. let's check
96                 Uri uri2 = new Uri ("http://freedesktop.org/Software/pkgconfig/releases/pkgconfig-0.15.0.tar.gz");
97                 sp2 = ServicePointManager.FindServicePoint (uri2);
98                 req2 = (HttpWebRequest) WebRequest.Create (uri2);
99                 async = req2.BeginGetResponse (null, null);
100                 //WriteServicePoint ("Large file: after async BeginGetResponse", sp2);
101                 // CurrentConnections: 1
102                 res2 = req2.EndGetResponse (async);
103                 //WriteServicePoint ("Large file: after async EndGetResponse", sp2);
104                 // CurrentConnections: 1
105                 // and so it shows
106                 //Console.WriteLine ("ContentLength: " + res2.ContentLength);
107                 res2.Close ();
108 #endif
109                 
110                 
111                 // what's the limit of the cache?
112                 req2 = (HttpWebRequest) WebRequest.Create ("http://www.apache.org/");
113                 res2 = req2.GetResponse ();
114                 sp2 = ServicePointManager.FindServicePoint (new Uri("http://www.apache.org/"));
115                 //WriteServicePoint ("apache", sp2);
116                 //Console.WriteLine ("ContentLength: " + res2.ContentLength);
117                 // CurrentConnections: 1
118                 res2.Close ();
119                 // curious other effect: address is actually the full Uri of the previous request
120                 // anyways, buffer is probably 4096 bytes
121         }
122
123         // try getting the stream to 5 web response objects     
124         // while ConnectionLimit equals 2
125
126         [Test]
127         [Category ("NotWorking")]
128         public void ConnectionLimit ()
129         {               
130                 // the default is already 2, just in case it isn't..
131                 ServicePointManager.DefaultConnectionLimit = 5;
132                 
133                 Uri uri = new Uri ("http://www.go-mono.com/");
134                 ServicePoint sp = ServicePointManager.FindServicePoint (uri);                   
135                 WebResponse [] res = new WebResponse [5];
136                 for (int i = 0; i < 5; i++) {
137                         //Console.WriteLine ("GOT1 : " + i);
138                         HttpWebRequest req = (HttpWebRequest) WebRequest.Create (uri);
139                         //Console.WriteLine ("GOT2 : " + i);
140                         res [i] = req.GetResponse ();
141                         //WriteServicePoint ("after getting " + (i + 1) + " web response objects", sp);
142                 }
143                 
144                 for (int i = 0; i < 5; i++) {
145                         Stream stream = res [i].GetResponseStream();
146                         //Console.WriteLine ("Reading stream: " + i + " : " + stream);
147                         int len = 0;
148                         while (stream.ReadByte () != -1)
149                                 len++;
150                         //Console.WriteLine ("Finished reading: " + len + " bytes");
151                 }
152                 
153                 for (int i = 0; i < 5; i++) {
154                         res [i].Close ();
155                 }
156         }
157
158         [Test]
159         [Category ("NotWorking")] // #A1 fails
160         public void EndPointBind ()
161         {
162                 Uri uri = new Uri ("http://www.go-mono.com/");
163                 ServicePoint sp = ServicePointManager.FindServicePoint (uri);
164
165                 HttpWebRequest req = (HttpWebRequest) WebRequest.Create (uri);
166
167                 bool called = false;
168                 sp.BindIPEndPointDelegate = delegate {
169                         Assert.IsTrue (!called);
170                         called = true;
171                         return null;
172                 };
173                 req.GetResponse ().Close ();
174
175                 Assert.IsTrue (called, "#A1");
176
177                 req = (HttpWebRequest) WebRequest.Create (uri);
178                 called = false;
179                 sp.BindIPEndPointDelegate = delegate(ServicePoint point, IPEndPoint remote, int times) {
180                         Assert.IsTrue (times < 5);
181                         called = true;
182                         return new IPEndPoint(IPAddress.Parse("0.0.0.0"), 12345 + times);
183                 };
184                 req.GetResponse ().Close ();
185
186                 Assert.IsTrue (called, "#A2");
187         }
188
189         public static void GetRequestStreamCallback (IAsyncResult asynchronousResult)
190         {
191         }
192
193         [Test] //Covers #19823
194 #if FEATURE_NO_BSD_SOCKETS
195         // This test uses HttpWebRequest
196         [ExpectedException (typeof (PlatformNotSupportedException))]
197 #endif
198         public void CloseConnectionGroupConcurency ()
199         {
200                 // Try with multiple service points
201                 for (var i = 0; i < 10; i++) {
202                         Uri targetUri = new Uri ("http://" + i + ".mono-project.com");
203                         var req = (HttpWebRequest) HttpWebRequest.Create (targetUri);
204                         req.ContentType = "application/x-www-form-urlencoded";
205                         req.Method = "POST";
206                         req.ConnectionGroupName = "" + i;
207                         req.ServicePoint.MaxIdleTime = 1;
208
209                         req.BeginGetRequestStream (new AsyncCallback (GetRequestStreamCallback), req);
210                         Thread.Sleep (1);
211                         req.ServicePoint.CloseConnectionGroup (req.ConnectionGroupName);
212                 }
213         }
214
215
216         [Test]
217         [Category ("RequiresBSDSockets")] // Tests internals, so it doesn't make sense to assert that PlatformNotSupportedExceptions are thrown.
218         public void DnsRefreshTimeout ()
219         {
220                 const int dnsRefreshTimeout = 2000;
221
222                 ServicePoint sp;
223                 IPHostEntry host0, host1, host2;
224                 Uri uri;
225                 PropertyInfo hostEntryProperty;
226
227                 ServicePointManager.DnsRefreshTimeout = dnsRefreshTimeout;
228
229                 uri = new Uri ("http://localhost/");
230                 sp = ServicePointManager.FindServicePoint (uri);
231
232                 hostEntryProperty = typeof (ServicePoint).GetProperty ("HostEntry", BindingFlags.NonPublic | BindingFlags.Instance);
233
234                 host0 = hostEntryProperty.GetValue (sp, null) as IPHostEntry;
235                 host1 = hostEntryProperty.GetValue (sp, null) as IPHostEntry;
236
237                 Assert.AreSame (host0, host1, "HostEntry should result in the same IPHostEntry object.");
238
239                 Thread.Sleep (dnsRefreshTimeout * 2);
240                 host2 = hostEntryProperty.GetValue (sp, null) as IPHostEntry;
241
242                 Assert.AreNotSame(host0, host2, "HostEntry should result in a new IPHostEntry " +
243                                 "object when DnsRefreshTimeout is reached.");
244         }
245
246 // Debug code not used now, but could be useful later
247 /*
248         private void WriteServicePoint (string label, ServicePoint sp)
249         {
250                 Console.WriteLine ("\n" + label);
251                 Console.WriteLine ("Address: " + sp.Address);
252                 Console.WriteLine ("ConnectionLimit: " + sp.ConnectionLimit);
253                 Console.WriteLine ("ConnectionName: " + sp.ConnectionName);
254                 Console.WriteLine ("CurrentConnections: " + sp.CurrentConnections);
255                 Console.WriteLine ("IdleSince: " + sp.IdleSince);
256                 Console.WriteLine ("MaxIdletime: " + sp.MaxIdleTime);
257                 Console.WriteLine ("ProtocolVersion: " + sp.ProtocolVersion);
258                 Console.WriteLine ("SupportsPipelining: " + sp.SupportsPipelining);             
259         }
260 */
261 }
262 }
263