FileWebRequestTest.cs 8.7 KB

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