FileWebRequestTest.cs 8.8 KB

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