2 // System.Web.HttpResponseTest.cs - Unit tests for System.Web.HttpResponse
5 // Miguel de Icaza <miguel@ximian.com>
7 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System.Collections;
31 using System.Collections.Specialized;
32 using System.Configuration.Provider;
37 using System.Web.Routing;
38 using System.Web.Caching;
41 using NUnit.Framework;
43 using MonoTests.Common;
45 namespace MonoTests.System.Web {
47 public class FakeHttpWorkerRequest2 : HttpWorkerRequest {
48 public Hashtable KnownResponseHeaders;
49 public Hashtable UnknownResponseHeaders;
50 public int return_kind;
52 public FakeHttpWorkerRequest2 (int re)
54 KnownResponseHeaders = CollectionsUtil.CreateCaseInsensitiveHashtable();
55 UnknownResponseHeaders = CollectionsUtil.CreateCaseInsensitiveHashtable();
59 public override string GetUriPath()
64 public override string GetQueryString()
66 return "GetQueryString";
69 public override string GetRawUrl()
74 public override string GetHttpVerbName()
79 public override string GetHttpVersion()
87 public override string GetRemoteAddress()
89 return "__GetRemoteAddress";
92 public override int GetRemotePort()
97 public override string GetLocalAddress()
99 return "GetLocalAddress";
102 public override string GetAppPath ()
107 public override int GetLocalPort()
112 public bool status_sent;
113 public int status_code;
114 public string status_string;
116 public override void SendStatus(int s, string x)
123 void AddHeader (Hashtable table, string header_name, object header)
125 object o = table [header_name];
127 table.Add (header_name, header);
129 ArrayList al = o as ArrayList;
131 al = new ArrayList ();
133 table [header_name] = al;
142 public override void SendKnownResponseHeader(int x, string j)
144 string header_name = HttpWorkerRequest.GetKnownRequestHeaderName (x);
145 AddHeader (KnownResponseHeaders, header_name, new KnownResponseHeader (x, j));
149 public override void SendUnknownResponseHeader(string a, string b)
151 AddHeader (UnknownResponseHeaders, a, new UnknownResponseHeader (a, b));
158 public int total = 0;
160 public override void SendResponseFromMemory(byte[] arr, int x)
164 byte [] tmp = new byte [data.Length + x];
165 Array.Copy (data, tmp, data.Length);
166 Array.Copy (arr, 0, tmp, data.Length, x);
168 data_len = data.Length;
171 for (int i = 0; i < x; i++)
178 public override void SendResponseFromFile(string a, long b , long c)
183 public override void SendResponseFromFile (IntPtr a, long b, long c)
188 public override void FlushResponse(bool x)
192 public override void EndOfRequest() {
195 public override string GetKnownRequestHeader (int index)
200 public bool OutputProduced {
202 return headers_sent || data_sent;
207 class KnownResponseHeader
210 private string value;
212 public KnownResponseHeader (int index, string value)
219 get { return index; }
222 public string Value {
223 get { return value; }
227 class UnknownResponseHeader
230 private string value;
232 public UnknownResponseHeader (string name, string value)
242 public string Value {
243 get { return value; }
248 public class HttpResponseTest {
249 public static HttpContext Cook (int re, out FakeHttpWorkerRequest2 f)
251 f = new FakeHttpWorkerRequest2 (re);
252 HttpContext c = new HttpContext (f);
261 AppDomain.CurrentDomain.SetData (".appPath", AppDomain.CurrentDomain.BaseDirectory);
267 [Category ("NotWorking")] // char output stream in gh make this test fail
269 public void Test_Response ()
271 FakeHttpWorkerRequest2 f;
272 HttpContext c = Cook (1, out f);
274 c.Response.Write ("a");
275 Assert.AreEqual (false, f.OutputProduced, "T1");
277 Assert.AreEqual (1, f.data_len, "T2");
278 c.Response.Write ("Hola");
279 Assert.AreEqual (1, f.data_len, "T3");
281 Assert.AreEqual (5, f.data_len, "T4");
282 Assert.AreEqual ((byte) 'a', f.data [0], "T5");
283 Assert.AreEqual ((byte) 'H', f.data [1], "T6");
284 Assert.AreEqual ((byte) 'o', f.data [2], "T7");
285 Assert.AreEqual ((byte) 'l', f.data [3], "T8");
286 Assert.AreEqual ((byte) 'a', f.data [4], "T9");
291 [Category ("NotWorking")] // char output stream in gh make this test fail
293 public void TestResponse_Chunked ()
295 FakeHttpWorkerRequest2 f;
296 HttpContext c = Cook (2, out f);
298 c.Response.Write ("a");
299 Assert.AreEqual (false, f.OutputProduced, "CT1");
301 Assert.AreEqual (6, f.total, "CT2");
302 c.Response.Write ("Hola");
303 Assert.AreEqual (6, f.total, "CT3");
309 public void Status1 ()
311 FakeHttpWorkerRequest2 f;
312 HttpContext c = Cook (2, out f);
314 HttpResponse resp = c.Response;
315 resp.Status = "200 Lalala";
316 Assert.AreEqual (200, resp.StatusCode, "ST1");
317 Assert.AreEqual ("Lalala", resp.StatusDescription, "ST2");
319 resp.Status = "10000 La la la";
320 Assert.AreEqual (10000, resp.StatusCode, "ST3");
321 Assert.AreEqual ("La la la", resp.StatusDescription, "ST4");
323 resp.Status = "-1 La la la";
324 Assert.AreEqual (-1, resp.StatusCode, "ST5");
325 Assert.AreEqual ("La la la", resp.StatusDescription, "ST6");
327 resp.Status = "-200 La la la";
328 Assert.AreEqual (-200, resp.StatusCode, "ST7");
329 Assert.AreEqual ("La la la", resp.StatusDescription, "ST8");
331 resp.Status = "200 ";
332 Assert.AreEqual (200, resp.StatusCode, "ST7");
333 Assert.AreEqual ("", resp.StatusDescription, "ST8");
337 public void Status2 ()
339 FakeHttpWorkerRequest2 f;
340 HttpContext c = Cook (2, out f);
342 HttpResponse resp = c.Response;
346 } catch (HttpException) {
351 public void Status3 ()
353 FakeHttpWorkerRequest2 f;
354 HttpContext c = Cook (2, out f);
356 HttpResponse resp = c.Response;
358 resp.Status = "200\t";
360 } catch (HttpException) {
365 public void Status4 ()
367 FakeHttpWorkerRequest2 f;
368 HttpContext c = Cook (2, out f);
370 HttpResponse resp = c.Response;
372 Assert.AreEqual (200, resp.StatusCode, "STT1");
373 Assert.AreEqual (HttpWorkerRequest.GetStatusDescription (200), resp.StatusDescription, "STT2");
375 resp.StatusCode = 400;
376 Assert.AreEqual (400, resp.StatusCode, "STT3");
377 Assert.AreEqual (HttpWorkerRequest.GetStatusDescription (400), resp.StatusDescription, "STT4");
379 resp.StatusDescription = "Something else";
380 Assert.AreEqual (400, resp.StatusCode, "STT5");
381 Assert.AreEqual ("Something else", resp.StatusDescription, "STT6");
383 resp.StatusDescription = null;
384 Assert.AreEqual (400, resp.StatusCode, "STT7");
385 Assert.AreEqual (HttpWorkerRequest.GetStatusDescription (400), resp.StatusDescription, "STT8");
389 // TODO: Add test for BinaryWrite and the various writes to check for Chunked Mode
393 public void SetCacheability ()
395 FakeHttpWorkerRequest2 f;
396 HttpContext c = Cook (1, out f);
399 // Basically the values from CacheControl are useless once Response.Cache is used
401 c.Response.Cache.SetCacheability (HttpCacheability.ServerAndNoCache);
402 Assert.AreEqual ("private", c.Response.CacheControl, "C1");
404 c.Response.Cache.SetCacheability (HttpCacheability.ServerAndPrivate);
405 Assert.AreEqual ("private", c.Response.CacheControl, "C2");
407 c.Response.Cache.SetCacheability (HttpCacheability.NoCache);
408 Assert.AreEqual ("private", c.Response.CacheControl, "C3");
410 c.Response.Cache.SetCacheability (HttpCacheability.Private);
411 Assert.AreEqual ("private", c.Response.CacheControl, "C4");
413 c.Response.Cache.SetCacheability (HttpCacheability.Server);
414 Assert.AreEqual ("private", c.Response.CacheControl, "C5");
416 c.Response.Cache.SetCacheability (HttpCacheability.Public);
417 Assert.AreEqual ("private", c.Response.CacheControl, "C6");
421 // Test the values allowed; .NET only documents private and public, but
422 // "no-cache" from the spec is also allowed
425 public void CacheControl ()
427 FakeHttpWorkerRequest2 f;
428 HttpContext c = Cook (1, out f);
431 Assert.AreEqual ("private", c.Response.CacheControl, "D1");
433 c.Response.CacheControl = "private";
434 Assert.AreEqual ("private", c.Response.CacheControl, "D2");
436 c.Response.CacheControl = "public";
437 Assert.AreEqual ("public", c.Response.CacheControl, "D3");
439 c.Response.CacheControl = "no-cache";
440 Assert.AreEqual ("no-cache", c.Response.CacheControl, "D4");
442 c.Response.CacheControl = null;
443 Assert.AreEqual ("private", c.Response.CacheControl, "D5");
445 c.Response.CacheControl = "";
446 Assert.AreEqual ("private", c.Response.CacheControl, "D6");
450 // Just checks if the AddFileDepend* methods accept values, added after bug #342511
452 public void AddFileDependencies ()
454 FakeHttpWorkerRequest2 f;
455 HttpContext c = Cook (1, out f);
457 ArrayList a = new ArrayList (1);
458 a.Add ("somefile.txt");
459 c.Response.AddFileDependencies (a);
462 string[] sa = new string [1] {"somefile.txt"};
464 c.Response.AddFileDependencies (sa);
468 c.Response.AddFileDependency ("somefile.txt");
471 [Test] // bug #488702
472 public void WriteHeaders ()
474 FakeHttpWorkerRequest2 f;
475 HttpContext c = Cook (2, out f);
477 HttpResponse resp = c.Response;
478 resp.CacheControl = "public";
479 resp.Cache.SetCacheability (HttpCacheability.NoCache);
480 resp.ContentType = "text/xml";
481 resp.AppendHeader ("Content-Disposition", "inline");
482 resp.AppendHeader ("Content-Type", "application/ms-word");
483 resp.AppendHeader ("Content-Length", "40");
484 resp.AppendHeader ("Transfer-Encoding", "compress");
485 resp.AppendHeader ("My-Custom-Header", "never");
486 resp.AppendHeader ("My-Custom-Header", "always");
488 Assert.AreEqual ("public", resp.CacheControl, "#A1");
489 Assert.AreEqual ("application/ms-word", resp.ContentType, "#A2");
490 Assert.AreEqual (0, f.KnownResponseHeaders.Count, "#A3");
491 Assert.AreEqual (0, f.UnknownResponseHeaders.Count, "#A4");
495 KnownResponseHeader known;
497 Assert.AreEqual (6, f.KnownResponseHeaders.Count, "#B1");
499 known = (KnownResponseHeader)f.KnownResponseHeaders ["Content-Length"];
500 Assert.AreEqual (HttpWorkerRequest.HeaderContentLength, known.Index, "#B2");
501 Assert.AreEqual ("40", known.Value, "#B3");
503 known = (KnownResponseHeader)f.KnownResponseHeaders["Transfer-Encoding"];
504 Assert.AreEqual (HttpWorkerRequest.HeaderTransferEncoding, known.Index, "#B4");
505 Assert.AreEqual ("compress", known.Value, "#B5");
507 known = (KnownResponseHeader)f.KnownResponseHeaders["Cache-Control"];
508 Assert.AreEqual (HttpWorkerRequest.HeaderCacheControl, known.Index, "#B6");
509 Assert.AreEqual ("no-cache", known.Value, "#B7");
511 known = (KnownResponseHeader)f.KnownResponseHeaders["Pragma"];
512 Assert.AreEqual (HttpWorkerRequest.HeaderPragma, known.Index, "#B8");
513 Assert.AreEqual ("no-cache", known.Value, "#B9");
515 known = (KnownResponseHeader)f.KnownResponseHeaders["Expires"];
516 Assert.AreEqual (HttpWorkerRequest.HeaderExpires, known.Index, "#B10");
517 Assert.AreEqual ("-1", known.Value, "#B11");
519 known = (KnownResponseHeader)f.KnownResponseHeaders["Content-Type"];
520 Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B12");
521 Assert.AreEqual ("application/ms-word", known.Value, "#B13");
523 UnknownResponseHeader unknown;
525 Assert.AreEqual (3, f.UnknownResponseHeaders.Count, "#C1");
527 unknown = (UnknownResponseHeader) f.UnknownResponseHeaders ["X-AspNet-Version"];
528 Assert.AreEqual ("X-AspNet-Version", unknown.Name, "#C2");
529 Assert.AreEqual (Environment.Version.ToString (3), unknown.Value, "#C3");
531 unknown = (UnknownResponseHeader) f.UnknownResponseHeaders ["Content-Disposition"];
532 Assert.AreEqual ("Content-Disposition", unknown.Name, "#C4");
533 Assert.AreEqual ("inline", unknown.Value, "#C5");
535 ArrayList al = f.UnknownResponseHeaders ["My-Custom-Header"] as ArrayList;
536 Assert.AreEqual (2, al.Count, "#C6");
538 unknown = (UnknownResponseHeader) al [0];
539 Assert.AreEqual ("My-Custom-Header", unknown.Name, "#C7");
540 Assert.AreEqual ("never", unknown.Value, "#C8");
542 unknown = (UnknownResponseHeader) al [1];
543 Assert.AreEqual ("My-Custom-Header", unknown.Name, "#C9");
544 Assert.AreEqual ("always", unknown.Value, "#C10");
548 public void WriteHeadersNoCharset ()
550 FakeHttpWorkerRequest2 f;
551 HttpContext c = Cook (2, out f);
553 HttpResponse resp = c.Response;
554 resp.ContentType = "text/plain";
556 Assert.AreEqual ("text/plain", resp.ContentType, "#A1");
560 KnownResponseHeader known;
562 Assert.LessOrEqual (1, f.KnownResponseHeaders.Count, "#B1");
564 known = (KnownResponseHeader)f.KnownResponseHeaders ["Content-Type"];
565 Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B2");
566 Assert.AreEqual ("text/plain", known.Value, "#B3");
570 public void WriteHeadersHasCharset ()
572 FakeHttpWorkerRequest2 f;
573 HttpContext c = Cook (2, out f);
575 HttpResponse resp = c.Response;
576 resp.ContentType = "text/plain";
577 resp.Charset = "big5";
579 Assert.AreEqual ("text/plain", resp.ContentType, "#A1");
580 Assert.AreEqual ("big5", resp.Charset, "#A2");
584 KnownResponseHeader known;
586 Assert.LessOrEqual (1, f.KnownResponseHeaders.Count, "#B1");
588 known = (KnownResponseHeader)f.KnownResponseHeaders ["Content-Type"];
589 Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B2");
590 Assert.AreEqual ("text/plain; charset=big5", known.Value, "#B3");
593 [Test] // bug #485557
594 [Category ("NotWorking")] // bug #488702
595 public void ClearHeaders ()
597 FakeHttpWorkerRequest2 f;
598 HttpContext c = Cook (2, out f);
600 HttpResponse resp = c.Response;
601 resp.CacheControl = "public";
602 resp.Cache.SetCacheability (HttpCacheability.NoCache);
603 resp.ContentType = "text/xml";
604 resp.AppendHeader ("Content-Disposition", "inline");
605 resp.AppendHeader ("Content-Type", "application/ms-word");
606 resp.AppendHeader ("Content-Length", "40");
607 resp.AppendHeader ("Transfer-Encoding", "compress");
608 resp.AppendHeader ("My-Custom-Header", "never");
609 resp.AppendHeader ("My-Custom-Header", "always");
610 resp.ClearHeaders ();
612 Assert.AreEqual ("private", resp.CacheControl, "#A1");
613 Assert.AreEqual ("text/html", resp.ContentType, "#A2");
614 Assert.AreEqual (0, f.KnownResponseHeaders.Count, "#A3");
615 Assert.AreEqual (0, f.UnknownResponseHeaders.Count, "#A4");
619 KnownResponseHeader known;
621 Assert.AreEqual (3, f.KnownResponseHeaders.Count, "#B1");
623 known = (KnownResponseHeader) f.KnownResponseHeaders ["Transfer-Encoding"];
624 Assert.AreEqual (HttpWorkerRequest.HeaderTransferEncoding, known.Index, "#B2");
625 Assert.AreEqual ("chunked", known.Value, "#B3");
627 known = (KnownResponseHeader) f.KnownResponseHeaders ["Cache-Control"];
628 Assert.AreEqual (HttpWorkerRequest.HeaderCacheControl, known.Index, "#B4");
629 Assert.AreEqual ("private", known.Value, "#B5");
631 known = (KnownResponseHeader) f.KnownResponseHeaders ["Content-Type"];
632 Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B6");
633 Assert.AreEqual ("text/html", known.Value, "#B7");
636 Assert.AreEqual (1, f.UnknownResponseHeaders.Count, "#C1");
637 UnknownResponseHeader unknown = (UnknownResponseHeader) f.UnknownResponseHeaders ["X-AspNet-Version"];
638 Assert.AreEqual ("X-AspNet-Version", unknown.Name, "#C2");
639 Assert.AreEqual (Environment.Version.ToString (3), unknown.Value, "#C3");
641 Assert.AreEqual (0, f.UnknownResponseHeaders.Count, "#C1");
646 public void Constructor ()
648 var resp = new HttpResponse (null);
649 Assert.IsNull (resp.Output, "#A1");
653 public void RedirectPermanent ()
655 FakeHttpWorkerRequest2 request;
656 HttpContext context = Cook (1, out request);
657 AssertExtensions.Throws<ArgumentNullException> (() => {
658 context.Response.RedirectPermanent (null);
661 AssertExtensions.Throws<ArgumentException> (() => {
662 context.Response.RedirectPermanent ("http://invalid\nurl.com");
665 AssertExtensions.Throws<ArgumentNullException> (() => {
666 context.Response.RedirectPermanent (null, true);
669 AssertExtensions.Throws<ArgumentException> (() => {
670 context.Response.RedirectPermanent ("http://invalid\nurl.com", true);
675 public void RedirectToRoute ()
677 var resp = new HttpResponse (new StringWriter ());
679 AssertExtensions.Throws<NullReferenceException> (() => {
680 resp.RedirectToRoute ("SomeRoute");
683 FakeHttpWorkerRequest2 request;
684 HttpContext context = Cook (1, out request);
686 // From RouteCollection.GetVirtualPath
687 AssertExtensions.Throws<ArgumentException> (() => {
688 context.Response.RedirectToRoute ("SomeRoute");
691 AssertExtensions.Throws<InvalidOperationException> (() => {
692 context.Response.RedirectToRoute (new { productId = "1", category = "widgets" });
697 public void RemoveOutputCacheItem ()
699 AssertExtensions.Throws<ArgumentNullException> (() => {
700 HttpResponse.RemoveOutputCacheItem (null, "MyProvider");
703 AssertExtensions.Throws<ArgumentException> (() => {
704 HttpResponse.RemoveOutputCacheItem ("badPath", null);
707 Assert.IsNull (OutputCache.Providers, "#A3");
708 HttpResponse.RemoveOutputCacheItem ("/Path", null);
710 AssertExtensions.Throws<ProviderException> (() => {
711 HttpResponse.RemoveOutputCacheItem ("/Path", String.Empty);
714 AssertExtensions.Throws<ProviderException> (() => {
715 HttpResponse.RemoveOutputCacheItem ("/Path", "MyProvider");
720 public void OutputSetter ()
722 FakeHttpWorkerRequest2 request;
723 HttpContext context = Cook (1, out request);
725 Assert.IsNotNull (context.Response.Output, "#A1");
726 context.Response.Output = null;
727 Assert.IsNull (context.Response.Output, "#A2");
730 AssertExtensions.Throws<NullReferenceException> (() => {
731 context.Response.Write ('t');
734 AssertExtensions.Throws<NullReferenceException> (() => {
735 context.Response.Write ((object) 5);
738 AssertExtensions.Throws<NullReferenceException> (() => {
739 context.Response.Write ("string");
742 AssertExtensions.Throws<NullReferenceException> (() => {
743 context.Response.Write (new char [] { '1' }, 0, 1);
746 AssertExtensions.Throws<NullReferenceException> (() => {
747 context.Response.Write ((object) null);
754 public class HttpResponseOutputStreamTest
756 FakeHttpWorkerRequest2 worker;
758 HttpResponse response;
764 context = Cook (2, out worker);
765 response = context.Response;
766 out_stream = response.OutputStream;
770 public void TearDown ()
772 if (response != null)
777 public void CanRead ()
779 Assert.IsFalse (out_stream.CanRead, "#1");
781 Assert.IsFalse (out_stream.CanRead, "#2");
785 public void CanSeek ()
787 Assert.IsFalse (out_stream.CanSeek, "#1");
789 Assert.IsFalse (out_stream.CanSeek, "#2");
793 public void CanWrite ()
795 Assert.IsTrue (out_stream.CanWrite, "#1");
797 Assert.IsTrue (out_stream.CanWrite, "#2");
803 byte [] buffer = Encoding.UTF8.GetBytes ("mono");
804 out_stream.Write (buffer, 0, buffer.Length);
806 Assert.AreEqual (0, worker.data_len);
810 public void Length ()
813 long len = out_stream.Length;
814 Assert.Fail ("#1:" + len);
815 } catch (NotSupportedException ex) {
816 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
817 Assert.IsNull (ex.InnerException, "#3");
818 Assert.IsNotNull (ex.Message, "#4");
823 public void Position ()
826 long pos = out_stream.Position;
827 Assert.Fail ("#A1:" + pos);
828 } catch (NotSupportedException ex) {
829 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#A2");
830 Assert.IsNull (ex.InnerException, "#A3");
831 Assert.IsNotNull (ex.Message, "#A4");
835 out_stream.Position = 0;
837 } catch (NotSupportedException ex) {
838 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#B2");
839 Assert.IsNull (ex.InnerException, "#B3");
840 Assert.IsNotNull (ex.Message, "#B4");
847 byte [] buffer = new byte [5];
850 out_stream.Read (buffer, 0, buffer.Length);
852 } catch (NotSupportedException ex) {
853 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
854 Assert.IsNull (ex.InnerException, "#3");
855 Assert.IsNotNull (ex.Message, "#4");
863 out_stream.Seek (5, SeekOrigin.Begin);
865 } catch (NotSupportedException ex) {
866 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
867 Assert.IsNull (ex.InnerException, "#3");
868 Assert.IsNotNull (ex.Message, "#4");
873 public void SetLength ()
876 out_stream.SetLength (5L);
878 } catch (NotSupportedException ex) {
879 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
880 Assert.IsNull (ex.InnerException, "#3");
881 Assert.IsNotNull (ex.Message, "#4");
890 buffer = Encoding.UTF8.GetBytes ("mono");
891 out_stream.Write (buffer, 0, buffer.Length);
892 buffer = Encoding.UTF8.GetBytes ("just rocks!!");
893 out_stream.Write (buffer, 5, 6);
894 out_stream.Write (buffer, 0, 4);
895 Assert.IsFalse (worker.OutputProduced, "#1");
897 Assert.IsTrue (worker.OutputProduced, "#2");
899 string output = Encoding.UTF8.GetString (worker.data);
900 Assert.AreEqual ("e\r\nmonorocks!just\r\n", output);
904 public void Write_Buffer_Null ()
907 out_stream.Write ((byte []) null, 0, 0);
910 } catch (ArgumentNullException ex) {
911 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
912 Assert.IsNull (ex.InnerException, "#3");
913 Assert.IsNotNull (ex.Message, "#4");
914 Assert.AreEqual ("buffer", ex.ParamName, "#5");
917 } catch (NullReferenceException) {
923 public void Write_Count_Negative ()
925 byte [] buffer = new byte [] { 0x0a, 0x1f, 0x2d };
929 out_stream.Write (buffer, 1, -1);
931 } catch (ArgumentOutOfRangeException ex) {
932 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
933 Assert.IsNull (ex.InnerException, "#3");
934 Assert.IsNotNull (ex.Message, "#4");
935 Assert.AreEqual ("count", ex.ParamName, "#5");
940 public void Write_Count_Overflow ()
944 buffer = Encoding.UTF8.GetBytes ("Mono");
945 out_stream.Write (buffer, 0, buffer.Length + 5);
946 buffer = Encoding.UTF8.GetBytes ("Just Rocks!!");
947 out_stream.Write (buffer, 5, buffer.Length - 2);
950 string output = Encoding.UTF8.GetString (worker.data);
951 Assert.AreEqual ("b\r\nMonoRocks!!\r\n", output);
955 public void Write_Offset_Negative ()
957 byte [] buffer = new byte [] { 0x0a, 0x1f, 0x2d };
961 out_stream.Write (buffer, -1, 0);
963 } catch (ArgumentOutOfRangeException ex) {
964 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
965 Assert.IsNull (ex.InnerException, "#3");
966 Assert.IsNotNull (ex.Message, "#4");
967 Assert.AreEqual ("offset", ex.ParamName, "#5");
972 public void Write_Offset_Overflow ()
974 byte [] buffer = new byte [] { 0x0a, 0x1f, 0x2d };
976 // offset == buffer length
979 out_stream.Write (buffer, buffer.Length, 0);
981 } catch (ArgumentOutOfRangeException ex) {
982 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
983 Assert.IsNull (ex.InnerException, "#A3");
984 Assert.IsNotNull (ex.Message, "#A4");
985 Assert.AreEqual ("offset", ex.ParamName, "#A5");
988 out_stream.Write (buffer, buffer.Length, 0);
991 // offset > buffer length
994 out_stream.Write (buffer, buffer.Length + 1, 0);
996 } catch (ArgumentOutOfRangeException ex) {
997 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
998 Assert.IsNull (ex.InnerException, "#B3");
999 Assert.IsNotNull (ex.Message, "#B4");
1000 Assert.AreEqual ("offset", ex.ParamName, "#B5");
1003 out_stream.Write (buffer, buffer.Length + 1, 0);
1007 Assert.AreEqual (0, worker.data_len);
1011 public void Write_Stream_Closed ()
1013 byte [] buffer = Encoding.UTF8.GetBytes ("mono");
1014 out_stream.Close ();
1015 out_stream.Write (buffer, 0, buffer.Length);
1018 string output = Encoding.UTF8.GetString (worker.data);
1019 Assert.AreEqual ("4\r\nmono\r\n", output);
1022 HttpContext Cook (int re, out FakeHttpWorkerRequest2 f)
1024 f = new FakeHttpWorkerRequest2 (re);
1025 return new HttpContext (f);