[System.Net] Add support for .pac proxy config scripts on mac
[mono.git] / mcs / class / System / Test / System.Net / FileWebResponseTest.cs
1 //
2 // FileWebResponseTest.cs - NUnit Test Cases for System.Net.FileWebResponse
3 //
4 // Authors:
5 //   Gert Driesen (drieseng@users.sourceforge.net)
6 //
7 // (C) 2007 Gert Driesen
8 //
9
10 using System;
11 using System.IO;
12 using System.Net;
13
14 using NUnit.Framework;
15
16 #if TARGET_JVM
17 using System.Globalization;
18 using System.Reflection;
19 #endif
20
21
22 namespace MonoTests.System.Net
23 {
24         [TestFixture]
25         public class FileWebResponseTest
26         {
27                 private string _tempDirectory;
28                 private string _tempFile;
29                 private Uri _tempFileUri;
30
31                 [SetUp]
32                 public void SetUp ()
33                 {
34                         _tempDirectory = Path.Combine (Path.GetTempPath (), "MonoTests.System.Net.FileWebResponseTest");
35                         _tempFile = Path.Combine (_tempDirectory, "FileWebResponseTest.tmp");
36                         if (!Directory.Exists (_tempDirectory)) {
37                                 Directory.CreateDirectory (_tempDirectory);
38                         } else {
39                                 // ensure no files are left over from previous runs
40                                 string [] files = Directory.GetFiles (_tempDirectory, "*");
41                                 foreach (string file in files)
42                                         File.Delete (file);
43                         }
44                         _tempFileUri = GetTempFileUri ();
45                 }
46
47                 [TearDown]
48                 public void TearDown ()
49                 {
50                         if (Directory.Exists (_tempDirectory)) {
51                                 string [] files = Directory.GetFiles (_tempDirectory, "*");
52                                 foreach (string file in files)
53                                         File.Delete (file);
54                                 Directory.Delete (_tempDirectory, true);
55                         }
56                 }
57
58                 [Test]
59                 public void ContentLength ()
60                 {
61                         FileWebRequest req = (FileWebRequest) WebRequest.Create (_tempFileUri);
62                         req.Method = "PUT";
63                         req.ContentLength = 100;
64                         using (Stream s = req.GetRequestStream ()) {
65                                 s.WriteByte (72);
66                                 s.WriteByte (110);
67                                 s.WriteByte (80);
68                                 s.Flush ();
69                         }
70                         req = (FileWebRequest) WebRequest.Create (_tempFileUri);
71                         using (FileWebResponse resp = (FileWebResponse) req.GetResponse ()) {
72                                 Assert.AreEqual (3, resp.ContentLength, "#1");
73                                 Assert.AreEqual (2, resp.Headers.Count, "#2");
74                                 Assert.AreEqual ("Content-Length", resp.Headers.Keys [0], "#3");
75                                 Assert.AreEqual ("3", resp.Headers.Get (0), "#4");
76                                 resp.Headers.Clear ();
77                                 Assert.AreEqual (3, resp.ContentLength, "#5");
78                                 Assert.AreEqual (0, resp.Headers.Count, "#6");
79                         }
80                 }
81
82                 [Test]
83                 public void ContentType ()
84                 {
85                         FileWebRequest req = (FileWebRequest) WebRequest.Create (_tempFileUri);
86                         req.Method = "PUT";
87                         req.ContentType = "image/png";
88                         using (Stream s = req.GetRequestStream ()) {
89                                 s.WriteByte (72);
90                                 s.WriteByte (110);
91                                 s.WriteByte (80);
92                                 s.Flush ();
93                         }
94                         req = (FileWebRequest) WebRequest.Create (_tempFileUri);
95                         using (FileWebResponse resp = (FileWebResponse) req.GetResponse ()) {
96                                 Assert.AreEqual ("application/octet-stream", resp.ContentType, "#1");
97                                 Assert.AreEqual (2, resp.Headers.Count, "#2");
98                                 Assert.AreEqual ("Content-Type", resp.Headers.Keys [1], "#3");
99                                 Assert.AreEqual ("application/octet-stream", resp.Headers.Get (1), "#4");
100                                 resp.Headers.Clear ();
101                                 Assert.AreEqual ("application/octet-stream", resp.ContentType, "#5");
102                                 Assert.AreEqual (0, resp.Headers.Count, "#6");
103                         }
104                 }
105
106                 [Test]
107                 public void GetResponseStream ()
108                 {
109                         FileWebRequest req = (FileWebRequest) WebRequest.Create (_tempFileUri);
110                         req.Method = "PUT";
111                         req.ContentType = "image/png";
112                         using (Stream s = req.GetRequestStream ()) {
113                                 s.WriteByte (72);
114                                 s.WriteByte (110);
115                                 s.WriteByte (80);
116                                 s.Flush ();
117                         }
118                         req = (FileWebRequest) WebRequest.Create (_tempFileUri);
119                         FileWebResponse respA = null;
120                         FileWebResponse respB = null;
121                         FileStream fsA = null;
122                         FileStream fsB = null;
123                         try {
124                                 respA = (FileWebResponse) req.GetResponse ();
125                                 fsA = respA.GetResponseStream () as FileStream;
126                                 Assert.IsNotNull (fsA, "#A1");
127                                 Assert.IsTrue (fsA.CanRead, "#A2");
128                                 Assert.IsTrue (fsA.CanSeek, "#A3");
129 #if NET_2_0
130                                 Assert.IsFalse (fsA.CanTimeout, "#A4");
131 #endif
132                                 Assert.IsFalse (fsA.CanWrite, "#A5");
133                                 Assert.AreEqual (3, fsA.Length, "#A6");
134                                 Assert.AreEqual (0, fsA.Position, "#A7");
135 #if NET_2_0
136                                 try {
137                                         int i = fsA.ReadTimeout;
138                                         Assert.Fail ("#A8:" + i);
139                                 } catch (InvalidOperationException) {
140                                 }
141                                 try {
142                                         int i = fsA.WriteTimeout;
143                                         Assert.Fail ("#A9:" + i);
144                                 } catch (InvalidOperationException) {
145                                 }
146 #endif
147
148                                 respB = (FileWebResponse) req.GetResponse ();
149                                 fsB = respB.GetResponseStream () as FileStream;
150                                 Assert.IsNotNull (fsB, "#B1");
151                                 Assert.IsTrue (fsB.CanRead, "#B2");
152                                 Assert.IsTrue (fsB.CanSeek, "#B3");
153 #if NET_2_0
154                                 Assert.IsFalse (fsB.CanTimeout, "#B4");
155 #endif
156                                 Assert.IsFalse (fsB.CanWrite, "#B5");
157                                 Assert.AreEqual (3, fsB.Length, "#B6");
158                                 Assert.AreEqual (0, fsB.Position, "#B7");
159 #if NET_2_0
160                                 try {
161                                         int i = fsB.ReadTimeout;
162                                         Assert.Fail ("#B8:" + i);
163                                 } catch (InvalidOperationException) {
164                                 }
165                                 try {
166                                         int i = fsB.WriteTimeout;
167                                         Assert.Fail ("#B9:" + i);
168                                 } catch (InvalidOperationException) {
169                                 }
170 #endif
171                         } finally {
172                                 if (respA != null)
173                                         respA.Close ();
174                                 if (respB != null)
175                                         respB.Close ();
176                         }
177                 }
178
179                 [Test]
180                 public void Headers ()
181                 {
182                         FileWebRequest req = (FileWebRequest) WebRequest.Create (_tempFileUri);
183                         req.Method = "PUT";
184                         req.Headers.Add ("Disposition", "attach");
185                         using (Stream s = req.GetRequestStream ()) {
186                                 s.WriteByte (72);
187                                 s.WriteByte (110);
188                                 s.WriteByte (80);
189                                 s.Flush ();
190                         }
191                         req = (FileWebRequest) WebRequest.Create (_tempFileUri);
192                         using (FileWebResponse resp = (FileWebResponse) req.GetResponse ()) {
193                                 Assert.AreEqual (2, resp.Headers.Count, "#1");
194                                 Assert.AreEqual ("Content-Length", resp.Headers.Keys [0], "#2");
195                                 Assert.AreEqual ("Content-Type", resp.Headers.Keys [1], "#3");
196                         }
197                 }
198
199                 [Test]
200                 public void ResponseUri ()
201                 {
202                         FileWebRequest req = (FileWebRequest) WebRequest.Create (_tempFileUri);
203                         req.Method = "PUT";
204                         req.ContentType = "image/png";
205                         using (Stream s = req.GetRequestStream ()) {
206                                 s.WriteByte (72);
207                                 s.WriteByte (110);
208                                 s.WriteByte (80);
209                                 s.Flush ();
210                         }
211                         req = (FileWebRequest) WebRequest.Create (_tempFileUri);
212                         using (FileWebResponse resp = (FileWebResponse) req.GetResponse ()) {
213                                 Assert.AreEqual (_tempFileUri, resp.ResponseUri);
214                         }
215                 }
216
217                 private Uri GetTempFileUri ()
218                 {
219                         string tempFile = _tempFile;
220                         if (RunningOnUnix) {
221                                 // remove leading slash for absolute paths
222                                 tempFile = tempFile.TrimStart ('/');
223                         } else {
224                                 tempFile = tempFile.Replace ('\\', '/');
225                         }
226                         return new Uri ("file:///" + tempFile);
227                 }
228 #if TARGET_JVM
229         
230         private bool RunningOnUnix {
231                         get {
232                                 Type t = Type.GetType("java.lang.System");
233                                 MethodInfo mi = t.GetMethod("getProperty", new Type[] { typeof(string) });
234                                 string osName = (string) mi.Invoke(null, new object[] { "os.name" });
235                                 
236                                 if(osName == null) {
237                                         return false;
238                                 }
239                                 
240                                 return !osName.StartsWith("win", true, CultureInfo.InvariantCulture);
241                         }
242                 }
243                                 
244 #else
245                 private bool RunningOnUnix {
246                         get {
247                                 // check for Unix platforms - see FAQ for more details
248                                 // http://www.mono-project.com/FAQ:_Technical#How_to_detect_the_execution_platform_.3F
249                                 int platform = (int) Environment.OSVersion.Platform;
250                                 return ((platform == 4) || (platform == 128));
251                         }
252                 }
253 #endif          
254         }
255 }