* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / class / System / Test / System.Net / FileWebRequestTest.cs
1 //\r
2 // FileWebRequestTest.cs - NUnit Test Cases for System.Net.FileWebRequest\r
3 //\r
4 // Authors:\r
5 //   Lawrence Pit (loz@cable.a2000.nl)\r
6 //   Martin Willemoes Hansen (mwh@sysrq.dk)\r
7 //\r
8 // (C) 2003 Martin Willemoes Hansen\r
9 //\r
10 \r
11 using NUnit.Framework;\r
12 using System;\r
13 using System.IO;\r
14 using System.Net;\r
15 using System.Collections;\r
16 using System.Security;\r
17 using System.Security.Permissions;\r
18 \r
19 namespace MonoTests.System.Net\r
20 {\r
21 \r
22 [TestFixture]\r
23 public class FileWebRequestTest\r
24 {\r
25         [Test]\r
26         public void Async ()\r
27         {\r
28                 string tmpFilename = GetFilename ();\r
29                 if (tmpFilename == null) {\r
30                         Console.WriteLine ("\n\nSet environment variable TMPDIR to a temporary directory to test FileWebRequest\n");\r
31                         return;\r
32                 }\r
33                 \r
34                 try {\r
35                         if (File.Exists (tmpFilename)) \r
36                                 File.Delete (tmpFilename);\r
37                         \r
38                         Uri uri = new Uri ("file:///" + tmpFilename);\r
39                         \r
40                         WebRequest req = WebRequest.Create (uri);\r
41                         req.Method = "PUT";\r
42                         \r
43                         req.Timeout = 2 * 1000;\r
44                         IAsyncResult async = req.BeginGetRequestStream (null, null);\r
45                         try {\r
46                                 req.BeginGetRequestStream (null, null);\r
47                                 Assertion.Fail ("#1 should've failed");\r
48                         } catch (InvalidOperationException) { \r
49                                 //Console.WriteLine ("GOT1: " + e.Message + "\n" + e.StackTrace);                               \r
50                                 // Cannot re-call BeginGetRequestStream/BeginGetResponse while\r
51                                 // a previous call is still in progress\r
52                         }\r
53                         /*\r
54                         try {\r
55                                 req.BeginGetResponse (null, null);\r
56                                 Assertion.Fail ("#2 should've failed");\r
57                         } catch (InvalidOperationException) { }\r
58                         */\r
59                         try {\r
60                                 req.GetRequestStream ();\r
61                                 Assertion.Fail ("#3 should've failed");\r
62                         } catch (InvalidOperationException) { \r
63                                 // Console.WriteLine ("GOT3: " + e.Message + "\n" + e.StackTrace);\r
64                                 // Cannot re-call BeginGetRequestStream/BeginGetResponse while\r
65                                 // a previous call is still in progress\r
66                         }\r
67 \r
68                         try {\r
69                                 req.GetResponse ();\r
70                                 Assertion.Fail ("#4 should've failed");\r
71                         } catch (WebException) { \r
72                                 // Console.WriteLine ("4: " + e.Message + "\n" + e.StackTrace);                         \r
73                                 // The operation has timed out\r
74                         }\r
75 \r
76                         try {\r
77                                 IAsyncResult async0 = req.BeginGetResponse (null, null);\r
78                                 req.EndGetResponse (async0);\r
79                                 // Console.WriteLine ("X5c");\r
80                                 Assertion.Fail ("#5 should've failed");\r
81                         } catch (InvalidOperationException) { \r
82                                 // Console.WriteLine ("5e: " + e.Message + "\n" + e.StackTrace);\r
83                                 // Cannot re-call BeginGetRequestStream/BeginGetResponse while\r
84                                 // a previous call is still in progress\r
85                         }\r
86                         \r
87                         // Console.WriteLine ("WEBHEADERS: " + req.Headers);\r
88                         \r
89                         Stream wstream = req.EndGetRequestStream (async);\r
90                         Assertion.AssertEquals ("#1r", false, wstream.CanRead);\r
91                         Assertion.AssertEquals ("#1w", true, wstream.CanWrite);\r
92                         Assertion.AssertEquals ("#1s", true, wstream.CanSeek);\r
93 \r
94                         wstream.WriteByte (72);\r
95                         wstream.WriteByte (101);\r
96                         wstream.WriteByte (108);\r
97                         wstream.WriteByte (108);\r
98                         wstream.WriteByte (111);\r
99                         wstream.Close ();\r
100                         \r
101                         // stream written\r
102 \r
103                         req = WebRequest.Create (uri);\r
104                         WebResponse res = req.GetResponse ();   \r
105                         \r
106                         try {\r
107                                 req.BeginGetRequestStream (null, null);\r
108                                 Assertion.Fail ("#20: should've failed");\r
109                         } catch (InvalidOperationException) { \r
110                                 // Console.WriteLine ("20: " + e.Message + "\n" + e.StackTrace);                                \r
111                                 // Cannot send a content-body with this verb-type\r
112                         }\r
113                         \r
114                         try {\r
115                                 req.Method = "PUT";\r
116                                 req.BeginGetRequestStream (null, null);\r
117                                 Assertion.Fail ("#21: should've failed");\r
118                         } catch (InvalidOperationException) { \r
119                                 // Console.WriteLine ("21: " + e.Message + "\n" + e.StackTrace);                                \r
120                                 // This operation cannot be perfomed after the request has been submitted.\r
121                         }\r
122                         \r
123                         try {\r
124                                 //IAsyncResult async2 = req.BeginGetResponse (null, null);\r
125                                 //Console.WriteLine ("OK!");\r
126                                 req.GetResponse ();\r
127                                 //Assertion.Fail ("#22: should've failed");\r
128                         } catch (InvalidOperationException) { \r
129                                 //Console.WriteLine ("22: " + e.Message + "\n" + e.StackTrace);\r
130                                 // Cannot re-call BeginGetRequestStream/BeginGetResponse while\r
131                                 // a previous call is still in progress\r
132                                 Assertion.Fail ("#22: should not have failed");\r
133                         }                       \r
134                         \r
135                         try {\r
136                                 IAsyncResult async2 = req.BeginGetResponse (null, null);\r
137                                 \r
138                                 // this succeeds !!\r
139                                 \r
140                                 try {\r
141                                         WebResponse res2 = req.EndGetResponse (async2);\r
142                                                                                 \r
143                                         // and this succeeds\r
144                                         \r
145                                         Assertion.AssertEquals ("#23", res, res2) ;\r
146                                         \r
147                                         //Assertion.Fail ("#23: should've failed");\r
148                                 } catch (InvalidOperationException) { \r
149                                         //Console.WriteLine ("22: " + e.Message + "\n" + e.StackTrace);                         \r
150                                         // Cannot re-call BeginGetRequestStream/BeginGetResponse while\r
151                                         // a previous call is still in progress\r
152                                 }                               \r
153                                 \r
154                                 // Assertion.Fail ("#22: should've failed");\r
155                         } catch (InvalidOperationException) { \r
156                         }                       \r
157 \r
158                         Assertion.AssertEquals ("#2 len", (long) 5, res.ContentLength);\r
159                         Assertion.AssertEquals ("#2 type", "binary/octet-stream", res.ContentType);\r
160                         Assertion.AssertEquals ("#2 scheme", "file", res.ResponseUri.Scheme);\r
161                         \r
162                         Stream rstream = res.GetResponseStream ();                      \r
163                         Assertion.AssertEquals ("#3r", true, rstream.CanRead);\r
164                         Assertion.AssertEquals ("#3w", false, rstream.CanWrite);\r
165                         Assertion.AssertEquals ("#3s", true, rstream.CanSeek);\r
166                         \r
167                         Assertion.AssertEquals ("#4a", 72, rstream.ReadByte ());\r
168                         Assertion.AssertEquals ("#4b", 101, rstream.ReadByte ());\r
169                         Assertion.AssertEquals ("#4c", 108, rstream.ReadByte ());\r
170 \r
171                         rstream.Close ();\r
172                         // res.Close ();\r
173                         \r
174                         try {\r
175                                 long len = res.ContentLength;\r
176                                 Assertion.AssertEquals ("#5", (long) 5, len);\r
177                         } catch (ObjectDisposedException) {\r
178                                 Assertion.Fail ("#disposed contentlength");                             \r
179                         }\r
180                         try {\r
181                                 WebHeaderCollection w = res.Headers;\r
182                         } catch (ObjectDisposedException) {\r
183                                 Assertion.Fail ("#disposed headers");                           \r
184                         }                       \r
185                         try {\r
186                                 res.Close ();                           \r
187                         } catch (ObjectDisposedException) {\r
188                                 Assertion.Fail ("#disposed close");                             \r
189                         }\r
190                 } catch (Exception) {\r
191                         // Console.WriteLine ("ERROR! : " + ee.Message + "\n" + ee.StackTrace);\r
192                 } finally {\r
193                         try {\r
194                                 // known bug #24940\r
195                                 File.Delete (tmpFilename);\r
196                         } catch (Exception) { \r
197                                 // Console.WriteLine ("ERROR2! : " + ee2.Message + "\n" + ee2.StackTrace);\r
198                         }\r
199                 }\r
200         }               \r
201         \r
202         [Test]\r
203         public void Sync ()\r
204         {\r
205                 string tmpFilename = GetFilename ();\r
206                 if (tmpFilename == null)\r
207                         return;\r
208                 \r
209                 try {           \r
210                         if (File.Exists (tmpFilename)) \r
211                                 File.Delete (tmpFilename);\r
212                         \r
213                         Uri uri = new Uri ("file:///" + tmpFilename);\r
214                         \r
215                         WebRequest req = WebRequest.Create (uri);\r
216                         \r
217                         try {\r
218                                 Stream stream = req.GetRequestStream ();\r
219                                 Assertion.Fail ("should throw exception");\r
220                         } catch (ProtocolViolationException) {}\r
221                         \r
222                         req.Method = "PUT";\r
223                         \r
224                         Stream wstream = req.GetRequestStream ();\r
225                         Assertion.AssertEquals ("#1r", false, wstream.CanRead);\r
226                         Assertion.AssertEquals ("#1w", true, wstream.CanWrite);\r
227                         Assertion.AssertEquals ("#1s", true, wstream.CanSeek);\r
228 \r
229                         wstream.WriteByte (72);\r
230                         wstream.WriteByte (101);\r
231                         wstream.WriteByte (108);\r
232                         wstream.WriteByte (108);\r
233                         wstream.WriteByte (111);\r
234                         wstream.Close ();\r
235                         \r
236                         // stream written\r
237                         \r
238                         req = WebRequest.Create (uri);\r
239                         WebResponse res = req.GetResponse ();                   \r
240                         Assertion.AssertEquals ("#2 len", (long) 5, res.ContentLength);\r
241                         Assertion.AssertEquals ("#2 type", "binary/octet-stream", res.ContentType);\r
242                         Assertion.AssertEquals ("#2 scheme", "file", res.ResponseUri.Scheme);\r
243                         \r
244                         Stream rstream = res.GetResponseStream ();                      \r
245                         Assertion.AssertEquals ("#3r", true, rstream.CanRead);\r
246                         Assertion.AssertEquals ("#3w", false, rstream.CanWrite);\r
247                         Assertion.AssertEquals ("#3s", true, rstream.CanSeek);\r
248                         \r
249                         Assertion.AssertEquals ("#4a", 72, rstream.ReadByte ());\r
250                         Assertion.AssertEquals ("#4b", 101, rstream.ReadByte ());\r
251                         Assertion.AssertEquals ("#4c", 108, rstream.ReadByte ());\r
252                         \r
253                         rstream.Close ();\r
254                         // res.Close ();\r
255                         \r
256                         try {\r
257                                 long len = res.ContentLength;\r
258                                 Assertion.AssertEquals ("#5", (long) 5, len);\r
259                         } catch (ObjectDisposedException) {\r
260                                 Assertion.Fail ("#disposed contentlength");                             \r
261                         }\r
262                         try {\r
263                                 WebHeaderCollection w = res.Headers;\r
264                         } catch (ObjectDisposedException) {\r
265                                 Assertion.Fail ("#disposed headers");                           \r
266                         }                       \r
267                         try {\r
268                                 res.Close ();                           \r
269                         } catch (ObjectDisposedException) {\r
270                                 Assertion.Fail ("#disposed close");                             \r
271                         }\r
272                         \r
273                 } finally {\r
274                         try {\r
275                                 File.Delete (tmpFilename);\r
276                         } catch (Exception) { }\r
277                 }\r
278         }       \r
279         \r
280         private string GetFilename ()\r
281         {\r
282                 string tmpdir = Environment.GetEnvironmentVariable ("TMPDIR");\r
283                 if (tmpdir == null || tmpdir.Length == 0) {\r
284                         return null;\r
285                 }\r
286                 \r
287                 tmpdir = tmpdir.Replace ('\\', '/');\r
288                 if (tmpdir [tmpdir.Length - 1] != '/')\r
289                         tmpdir += "/";\r
290                 return tmpdir + "FileWebRequestTest.tmp";\r
291         }\r
292 }\r
293 \r
294 }\r