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;
36 using System.Web.Routing;
37 using System.Web.Caching;
39 using NUnit.Framework;
41 using MonoTests.Common;
43 namespace MonoTests.System.Web {
45 public class FakeHttpWorkerRequest2 : HttpWorkerRequest {
46 public Hashtable KnownResponseHeaders;
47 public Hashtable UnknownResponseHeaders;
48 public int return_kind;
50 public FakeHttpWorkerRequest2 (int re)
52 KnownResponseHeaders = CollectionsUtil.CreateCaseInsensitiveHashtable();
53 UnknownResponseHeaders = CollectionsUtil.CreateCaseInsensitiveHashtable();
57 public override string GetUriPath()
62 public override string GetQueryString()
64 return "GetQueryString";
67 public override string GetRawUrl()
72 public override string GetHttpVerbName()
77 public override string GetHttpVersion()
85 public override string GetRemoteAddress()
87 return "__GetRemoteAddress";
90 public override int GetRemotePort()
95 public override string GetLocalAddress()
97 return "GetLocalAddress";
100 public override string GetAppPath ()
105 public override int GetLocalPort()
110 public bool status_sent;
111 public int status_code;
112 public string status_string;
114 public override void SendStatus(int s, string x)
121 void AddHeader (Hashtable table, string header_name, object header)
123 object o = table [header_name];
125 table.Add (header_name, header);
127 ArrayList al = o as ArrayList;
129 al = new ArrayList ();
131 table [header_name] = al;
140 public override void SendKnownResponseHeader(int x, string j)
142 string header_name = HttpWorkerRequest.GetKnownRequestHeaderName (x);
143 AddHeader (KnownResponseHeaders, header_name, new KnownResponseHeader (x, j));
147 public override void SendUnknownResponseHeader(string a, string b)
149 AddHeader (UnknownResponseHeaders, a, new UnknownResponseHeader (a, b));
156 public int total = 0;
158 public override void SendResponseFromMemory(byte[] arr, int x)
162 byte [] tmp = new byte [data.Length + x];
163 Array.Copy (data, tmp, data.Length);
164 Array.Copy (arr, 0, tmp, data.Length, x);
166 data_len = data.Length;
169 for (int i = 0; i < x; i++)
176 public override void SendResponseFromFile(string a, long b , long c)
181 public override void SendResponseFromFile (IntPtr a, long b, long c)
186 public override void FlushResponse(bool x)
190 public override void EndOfRequest() {
193 public override string GetKnownRequestHeader (int index)
198 public bool OutputProduced {
200 return headers_sent || data_sent;
205 class KnownResponseHeader
208 private string value;
210 public KnownResponseHeader (int index, string value)
217 get { return index; }
220 public string Value {
221 get { return value; }
225 class UnknownResponseHeader
228 private string value;
230 public UnknownResponseHeader (string name, string value)
240 public string Value {
241 get { return value; }
246 public class HttpResponseTest {
247 public static HttpContext Cook (int re, out FakeHttpWorkerRequest2 f)
249 f = new FakeHttpWorkerRequest2 (re);
250 HttpContext c = new HttpContext (f);
258 AppDomain.CurrentDomain.SetData (".appPath", AppDomain.CurrentDomain.BaseDirectory);
262 public void Test_Response ()
264 FakeHttpWorkerRequest2 f;
265 HttpContext c = Cook (1, out f);
267 c.Response.Write ("a");
268 Assert.AreEqual (false, f.OutputProduced, "T1");
270 Assert.AreEqual (1, f.data_len, "T2");
271 c.Response.Write ("Hola");
272 Assert.AreEqual (1, f.data_len, "T3");
274 Assert.AreEqual (5, f.data_len, "T4");
275 Assert.AreEqual ((byte) 'a', f.data [0], "T5");
276 Assert.AreEqual ((byte) 'H', f.data [1], "T6");
277 Assert.AreEqual ((byte) 'o', f.data [2], "T7");
278 Assert.AreEqual ((byte) 'l', f.data [3], "T8");
279 Assert.AreEqual ((byte) 'a', f.data [4], "T9");
283 public void TestResponse_Chunked ()
285 FakeHttpWorkerRequest2 f;
286 HttpContext c = Cook (2, out f);
288 c.Response.Write ("a");
289 Assert.AreEqual (false, f.OutputProduced, "CT1");
291 Assert.AreEqual (6, f.total, "CT2");
292 c.Response.Write ("Hola");
293 Assert.AreEqual (6, f.total, "CT3");
299 public void Status1 ()
301 FakeHttpWorkerRequest2 f;
302 HttpContext c = Cook (2, out f);
304 HttpResponse resp = c.Response;
305 resp.Status = "200 Lalala";
306 Assert.AreEqual (200, resp.StatusCode, "ST1");
307 Assert.AreEqual ("Lalala", resp.StatusDescription, "ST2");
309 resp.Status = "10000 La la la";
310 Assert.AreEqual (10000, resp.StatusCode, "ST3");
311 Assert.AreEqual ("La la la", resp.StatusDescription, "ST4");
313 resp.Status = "-1 La la la";
314 Assert.AreEqual (-1, resp.StatusCode, "ST5");
315 Assert.AreEqual ("La la la", resp.StatusDescription, "ST6");
317 resp.Status = "-200 La la la";
318 Assert.AreEqual (-200, resp.StatusCode, "ST7");
319 Assert.AreEqual ("La la la", resp.StatusDescription, "ST8");
321 resp.Status = "200 ";
322 Assert.AreEqual (200, resp.StatusCode, "ST7");
323 Assert.AreEqual ("", resp.StatusDescription, "ST8");
327 public void Status2 ()
329 FakeHttpWorkerRequest2 f;
330 HttpContext c = Cook (2, out f);
332 HttpResponse resp = c.Response;
336 } catch (HttpException) {
341 public void Status3 ()
343 FakeHttpWorkerRequest2 f;
344 HttpContext c = Cook (2, out f);
346 HttpResponse resp = c.Response;
348 resp.Status = "200\t";
350 } catch (HttpException) {
355 public void Status4 ()
357 FakeHttpWorkerRequest2 f;
358 HttpContext c = Cook (2, out f);
360 HttpResponse resp = c.Response;
362 Assert.AreEqual (200, resp.StatusCode, "STT1");
363 Assert.AreEqual (HttpWorkerRequest.GetStatusDescription (200), resp.StatusDescription, "STT2");
365 resp.StatusCode = 400;
366 Assert.AreEqual (400, resp.StatusCode, "STT3");
367 Assert.AreEqual (HttpWorkerRequest.GetStatusDescription (400), resp.StatusDescription, "STT4");
369 resp.StatusDescription = "Something else";
370 Assert.AreEqual (400, resp.StatusCode, "STT5");
371 Assert.AreEqual ("Something else", resp.StatusDescription, "STT6");
373 resp.StatusDescription = null;
374 Assert.AreEqual (400, resp.StatusCode, "STT7");
375 Assert.AreEqual (HttpWorkerRequest.GetStatusDescription (400), resp.StatusDescription, "STT8");
379 // TODO: Add test for BinaryWrite and the various writes to check for Chunked Mode
383 public void SetCacheability ()
385 FakeHttpWorkerRequest2 f;
386 HttpContext c = Cook (1, out f);
389 // Basically the values from CacheControl are useless once Response.Cache is used
391 c.Response.Cache.SetCacheability (HttpCacheability.ServerAndNoCache);
392 Assert.AreEqual ("private", c.Response.CacheControl, "C1");
394 c.Response.Cache.SetCacheability (HttpCacheability.ServerAndPrivate);
395 Assert.AreEqual ("private", c.Response.CacheControl, "C2");
397 c.Response.Cache.SetCacheability (HttpCacheability.NoCache);
398 Assert.AreEqual ("private", c.Response.CacheControl, "C3");
400 c.Response.Cache.SetCacheability (HttpCacheability.Private);
401 Assert.AreEqual ("private", c.Response.CacheControl, "C4");
403 c.Response.Cache.SetCacheability (HttpCacheability.Server);
404 Assert.AreEqual ("private", c.Response.CacheControl, "C5");
406 c.Response.Cache.SetCacheability (HttpCacheability.Public);
407 Assert.AreEqual ("private", c.Response.CacheControl, "C6");
411 // Test the values allowed; .NET only documents private and public, but
412 // "no-cache" from the spec is also allowed
415 public void CacheControl ()
417 FakeHttpWorkerRequest2 f;
418 HttpContext c = Cook (1, out f);
421 Assert.AreEqual ("private", c.Response.CacheControl, "D1");
423 c.Response.CacheControl = "private";
424 Assert.AreEqual ("private", c.Response.CacheControl, "D2");
426 c.Response.CacheControl = "public";
427 Assert.AreEqual ("public", c.Response.CacheControl, "D3");
429 c.Response.CacheControl = "no-cache";
430 Assert.AreEqual ("no-cache", c.Response.CacheControl, "D4");
432 c.Response.CacheControl = null;
433 Assert.AreEqual ("private", c.Response.CacheControl, "D5");
435 c.Response.CacheControl = "";
436 Assert.AreEqual ("private", c.Response.CacheControl, "D6");
440 // Just checks if the AddFileDepend* methods accept values, added after bug #342511
442 public void AddFileDependencies ()
444 FakeHttpWorkerRequest2 f;
445 HttpContext c = Cook (1, out f);
447 ArrayList a = new ArrayList (1);
448 a.Add ("somefile.txt");
449 c.Response.AddFileDependencies (a);
451 string[] sa = new string [1] {"somefile.txt"};
453 c.Response.AddFileDependencies (sa);
456 c.Response.AddFileDependency ("somefile.txt");
459 [Test] // bug #488702
460 public void WriteHeaders ()
462 FakeHttpWorkerRequest2 f;
463 HttpContext c = Cook (2, out f);
465 HttpResponse resp = c.Response;
466 resp.CacheControl = "public";
467 resp.Cache.SetCacheability (HttpCacheability.NoCache);
468 resp.ContentType = "text/xml";
469 resp.AppendHeader ("Content-Disposition", "inline");
470 resp.AppendHeader ("Content-Type", "application/ms-word");
471 resp.AppendHeader ("Content-Length", "40");
472 resp.AppendHeader ("Transfer-Encoding", "compress");
473 resp.AppendHeader ("My-Custom-Header", "never");
474 resp.AppendHeader ("My-Custom-Header", "always");
476 Assert.AreEqual ("public", resp.CacheControl, "#A1");
477 Assert.AreEqual ("application/ms-word", resp.ContentType, "#A2");
478 Assert.AreEqual (0, f.KnownResponseHeaders.Count, "#A3");
479 Assert.AreEqual (0, f.UnknownResponseHeaders.Count, "#A4");
483 KnownResponseHeader known;
485 Assert.AreEqual (6, f.KnownResponseHeaders.Count, "#B1");
487 known = (KnownResponseHeader)f.KnownResponseHeaders ["Content-Length"];
488 Assert.AreEqual (HttpWorkerRequest.HeaderContentLength, known.Index, "#B2");
489 Assert.AreEqual ("40", known.Value, "#B3");
491 known = (KnownResponseHeader)f.KnownResponseHeaders["Transfer-Encoding"];
492 Assert.AreEqual (HttpWorkerRequest.HeaderTransferEncoding, known.Index, "#B4");
493 Assert.AreEqual ("compress", known.Value, "#B5");
495 known = (KnownResponseHeader)f.KnownResponseHeaders["Cache-Control"];
496 Assert.AreEqual (HttpWorkerRequest.HeaderCacheControl, known.Index, "#B6");
497 Assert.AreEqual ("no-cache", known.Value, "#B7");
499 known = (KnownResponseHeader)f.KnownResponseHeaders["Pragma"];
500 Assert.AreEqual (HttpWorkerRequest.HeaderPragma, known.Index, "#B8");
501 Assert.AreEqual ("no-cache", known.Value, "#B9");
503 known = (KnownResponseHeader)f.KnownResponseHeaders["Expires"];
504 Assert.AreEqual (HttpWorkerRequest.HeaderExpires, known.Index, "#B10");
505 Assert.AreEqual ("-1", known.Value, "#B11");
507 known = (KnownResponseHeader)f.KnownResponseHeaders["Content-Type"];
508 Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B12");
509 Assert.AreEqual ("application/ms-word", known.Value, "#B13");
511 UnknownResponseHeader unknown;
513 Assert.AreEqual (3, f.UnknownResponseHeaders.Count, "#C1");
515 unknown = (UnknownResponseHeader) f.UnknownResponseHeaders ["X-AspNet-Version"];
516 Assert.AreEqual ("X-AspNet-Version", unknown.Name, "#C2");
517 Assert.AreEqual (Environment.Version.ToString (3), unknown.Value, "#C3");
519 unknown = (UnknownResponseHeader) f.UnknownResponseHeaders ["Content-Disposition"];
520 Assert.AreEqual ("Content-Disposition", unknown.Name, "#C4");
521 Assert.AreEqual ("inline", unknown.Value, "#C5");
523 ArrayList al = f.UnknownResponseHeaders ["My-Custom-Header"] as ArrayList;
524 Assert.AreEqual (2, al.Count, "#C6");
526 unknown = (UnknownResponseHeader) al [0];
527 Assert.AreEqual ("My-Custom-Header", unknown.Name, "#C7");
528 Assert.AreEqual ("never", unknown.Value, "#C8");
530 unknown = (UnknownResponseHeader) al [1];
531 Assert.AreEqual ("My-Custom-Header", unknown.Name, "#C9");
532 Assert.AreEqual ("always", unknown.Value, "#C10");
536 public void WriteHeadersNoCharset ()
538 FakeHttpWorkerRequest2 f;
539 HttpContext c = Cook (2, out f);
541 HttpResponse resp = c.Response;
542 resp.ContentType = "text/plain";
544 Assert.AreEqual ("text/plain", resp.ContentType, "#A1");
548 KnownResponseHeader known;
550 Assert.LessOrEqual (1, f.KnownResponseHeaders.Count, "#B1");
552 known = (KnownResponseHeader)f.KnownResponseHeaders ["Content-Type"];
553 Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B2");
554 Assert.AreEqual ("text/plain", known.Value, "#B3");
558 public void WriteHeadersHasCharset ()
560 FakeHttpWorkerRequest2 f;
561 HttpContext c = Cook (2, out f);
563 HttpResponse resp = c.Response;
564 resp.ContentType = "text/plain";
565 resp.Charset = "big5";
567 Assert.AreEqual ("text/plain", resp.ContentType, "#A1");
568 Assert.AreEqual ("big5", resp.Charset, "#A2");
572 KnownResponseHeader known;
574 Assert.LessOrEqual (1, f.KnownResponseHeaders.Count, "#B1");
576 known = (KnownResponseHeader)f.KnownResponseHeaders ["Content-Type"];
577 Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B2");
578 Assert.AreEqual ("text/plain; charset=big5", known.Value, "#B3");
581 [Test] // bug #485557
582 [Category ("NotWorking")] // bug #488702
583 public void ClearHeaders ()
585 FakeHttpWorkerRequest2 f;
586 HttpContext c = Cook (2, out f);
588 HttpResponse resp = c.Response;
589 resp.CacheControl = "public";
590 resp.Cache.SetCacheability (HttpCacheability.NoCache);
591 resp.ContentType = "text/xml";
592 resp.AppendHeader ("Content-Disposition", "inline");
593 resp.AppendHeader ("Content-Type", "application/ms-word");
594 resp.AppendHeader ("Content-Length", "40");
595 resp.AppendHeader ("Transfer-Encoding", "compress");
596 resp.AppendHeader ("My-Custom-Header", "never");
597 resp.AppendHeader ("My-Custom-Header", "always");
598 resp.ClearHeaders ();
600 Assert.AreEqual ("private", resp.CacheControl, "#A1");
601 Assert.AreEqual ("text/html", resp.ContentType, "#A2");
602 Assert.AreEqual (0, f.KnownResponseHeaders.Count, "#A3");
603 Assert.AreEqual (0, f.UnknownResponseHeaders.Count, "#A4");
607 KnownResponseHeader known;
609 Assert.AreEqual (3, f.KnownResponseHeaders.Count, "#B1");
611 known = (KnownResponseHeader) f.KnownResponseHeaders ["Transfer-Encoding"];
612 Assert.AreEqual (HttpWorkerRequest.HeaderTransferEncoding, known.Index, "#B2");
613 Assert.AreEqual ("chunked", known.Value, "#B3");
615 known = (KnownResponseHeader) f.KnownResponseHeaders ["Cache-Control"];
616 Assert.AreEqual (HttpWorkerRequest.HeaderCacheControl, known.Index, "#B4");
617 Assert.AreEqual ("private", known.Value, "#B5");
619 known = (KnownResponseHeader) f.KnownResponseHeaders ["Content-Type"];
620 Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B6");
621 Assert.AreEqual ("text/html", known.Value, "#B7");
623 Assert.AreEqual (1, f.UnknownResponseHeaders.Count, "#C1");
624 UnknownResponseHeader unknown = (UnknownResponseHeader) f.UnknownResponseHeaders ["X-AspNet-Version"];
625 Assert.AreEqual ("X-AspNet-Version", unknown.Name, "#C2");
626 Assert.AreEqual (Environment.Version.ToString (3), unknown.Value, "#C3");
630 public void Constructor ()
632 var resp = new HttpResponse (null);
633 Assert.IsNull (resp.Output, "#A1");
636 public void RedirectPermanent ()
638 FakeHttpWorkerRequest2 request;
639 HttpContext context = Cook (1, out request);
640 AssertExtensions.Throws<ArgumentNullException> (() => {
641 context.Response.RedirectPermanent (null);
644 AssertExtensions.Throws<ArgumentException> (() => {
645 context.Response.RedirectPermanent ("http://invalid\nurl.com");
648 AssertExtensions.Throws<ArgumentNullException> (() => {
649 context.Response.RedirectPermanent (null, true);
652 AssertExtensions.Throws<ArgumentException> (() => {
653 context.Response.RedirectPermanent ("http://invalid\nurl.com", true);
658 public void RedirectToRoute ()
660 var resp = new HttpResponse (new StringWriter ());
662 AssertExtensions.Throws<NullReferenceException> (() => {
663 resp.RedirectToRoute ("SomeRoute");
666 FakeHttpWorkerRequest2 request;
667 HttpContext context = Cook (1, out request);
669 // From RouteCollection.GetVirtualPath
670 AssertExtensions.Throws<ArgumentException> (() => {
671 context.Response.RedirectToRoute ("SomeRoute");
674 AssertExtensions.Throws<InvalidOperationException> (() => {
675 context.Response.RedirectToRoute (new { productId = "1", category = "widgets" });
680 public void RemoveOutputCacheItem ()
682 AssertExtensions.Throws<ArgumentNullException> (() => {
683 HttpResponse.RemoveOutputCacheItem (null, "MyProvider");
686 AssertExtensions.Throws<ArgumentException> (() => {
687 HttpResponse.RemoveOutputCacheItem ("badPath", null);
690 Assert.IsNull (OutputCache.Providers, "#A3");
691 HttpResponse.RemoveOutputCacheItem ("/Path", null);
693 AssertExtensions.Throws<ProviderException> (() => {
694 HttpResponse.RemoveOutputCacheItem ("/Path", String.Empty);
697 AssertExtensions.Throws<ProviderException> (() => {
698 HttpResponse.RemoveOutputCacheItem ("/Path", "MyProvider");
703 public void OutputSetter ()
705 FakeHttpWorkerRequest2 request;
706 HttpContext context = Cook (1, out request);
708 Assert.IsNotNull (context.Response.Output, "#A1");
709 context.Response.Output = null;
710 Assert.IsNull (context.Response.Output, "#A2");
713 AssertExtensions.Throws<NullReferenceException> (() => {
714 context.Response.Write ('t');
717 AssertExtensions.Throws<NullReferenceException> (() => {
718 context.Response.Write ((object) 5);
721 AssertExtensions.Throws<NullReferenceException> (() => {
722 context.Response.Write ("string");
725 AssertExtensions.Throws<NullReferenceException> (() => {
726 context.Response.Write (new char [] { '1' }, 0, 1);
729 AssertExtensions.Throws<NullReferenceException> (() => {
730 context.Response.Write ((object) null);
736 public class HttpResponseOutputStreamTest
738 FakeHttpWorkerRequest2 worker;
740 HttpResponse response;
746 context = Cook (2, out worker);
747 response = context.Response;
748 out_stream = response.OutputStream;
752 public void TearDown ()
754 if (response != null)
759 public void CanRead ()
761 Assert.IsFalse (out_stream.CanRead, "#1");
763 Assert.IsFalse (out_stream.CanRead, "#2");
767 public void CanSeek ()
769 Assert.IsFalse (out_stream.CanSeek, "#1");
771 Assert.IsFalse (out_stream.CanSeek, "#2");
775 public void CanWrite ()
777 Assert.IsTrue (out_stream.CanWrite, "#1");
779 Assert.IsTrue (out_stream.CanWrite, "#2");
785 byte [] buffer = Encoding.UTF8.GetBytes ("mono");
786 out_stream.Write (buffer, 0, buffer.Length);
788 Assert.AreEqual (0, worker.data_len);
792 public void Length ()
795 long len = out_stream.Length;
796 Assert.Fail ("#1:" + len);
797 } catch (NotSupportedException ex) {
798 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
799 Assert.IsNull (ex.InnerException, "#3");
800 Assert.IsNotNull (ex.Message, "#4");
805 public void Position ()
808 long pos = out_stream.Position;
809 Assert.Fail ("#A1:" + pos);
810 } catch (NotSupportedException ex) {
811 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#A2");
812 Assert.IsNull (ex.InnerException, "#A3");
813 Assert.IsNotNull (ex.Message, "#A4");
817 out_stream.Position = 0;
819 } catch (NotSupportedException ex) {
820 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#B2");
821 Assert.IsNull (ex.InnerException, "#B3");
822 Assert.IsNotNull (ex.Message, "#B4");
829 byte [] buffer = new byte [5];
832 out_stream.Read (buffer, 0, buffer.Length);
834 } catch (NotSupportedException ex) {
835 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
836 Assert.IsNull (ex.InnerException, "#3");
837 Assert.IsNotNull (ex.Message, "#4");
845 out_stream.Seek (5, SeekOrigin.Begin);
847 } catch (NotSupportedException ex) {
848 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
849 Assert.IsNull (ex.InnerException, "#3");
850 Assert.IsNotNull (ex.Message, "#4");
855 public void SetLength ()
858 out_stream.SetLength (5L);
860 } catch (NotSupportedException ex) {
861 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
862 Assert.IsNull (ex.InnerException, "#3");
863 Assert.IsNotNull (ex.Message, "#4");
872 buffer = Encoding.UTF8.GetBytes ("mono");
873 out_stream.Write (buffer, 0, buffer.Length);
874 buffer = Encoding.UTF8.GetBytes ("just rocks!!");
875 out_stream.Write (buffer, 5, 6);
876 out_stream.Write (buffer, 0, 4);
877 Assert.IsFalse (worker.OutputProduced, "#1");
879 Assert.IsTrue (worker.OutputProduced, "#2");
881 string output = Encoding.UTF8.GetString (worker.data);
882 Assert.AreEqual ("e\r\nmonorocks!just\r\n", output);
886 public void Write_Buffer_Null ()
889 out_stream.Write ((byte []) null, 0, 0);
891 } catch (ArgumentNullException ex) {
892 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
893 Assert.IsNull (ex.InnerException, "#3");
894 Assert.IsNotNull (ex.Message, "#4");
895 Assert.AreEqual ("buffer", ex.ParamName, "#5");
900 public void Write_Count_Negative ()
902 byte [] buffer = new byte [] { 0x0a, 0x1f, 0x2d };
906 out_stream.Write (buffer, 1, -1);
908 } catch (ArgumentOutOfRangeException ex) {
909 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
910 Assert.IsNull (ex.InnerException, "#3");
911 Assert.IsNotNull (ex.Message, "#4");
912 Assert.AreEqual ("count", ex.ParamName, "#5");
917 public void Write_Count_Overflow ()
921 buffer = Encoding.UTF8.GetBytes ("Mono");
922 out_stream.Write (buffer, 0, buffer.Length + 5);
923 buffer = Encoding.UTF8.GetBytes ("Just Rocks!!");
924 out_stream.Write (buffer, 5, buffer.Length - 2);
927 string output = Encoding.UTF8.GetString (worker.data);
928 Assert.AreEqual ("b\r\nMonoRocks!!\r\n", output);
932 public void Write_Offset_Negative ()
934 byte [] buffer = new byte [] { 0x0a, 0x1f, 0x2d };
938 out_stream.Write (buffer, -1, 0);
940 } catch (ArgumentOutOfRangeException ex) {
941 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
942 Assert.IsNull (ex.InnerException, "#3");
943 Assert.IsNotNull (ex.Message, "#4");
944 Assert.AreEqual ("offset", ex.ParamName, "#5");
949 public void Write_Offset_Overflow ()
951 byte [] buffer = new byte [] { 0x0a, 0x1f, 0x2d };
953 // offset == buffer length
955 out_stream.Write (buffer, buffer.Length, 0);
957 } catch (ArgumentOutOfRangeException ex) {
958 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
959 Assert.IsNull (ex.InnerException, "#A3");
960 Assert.IsNotNull (ex.Message, "#A4");
961 Assert.AreEqual ("offset", ex.ParamName, "#A5");
964 // offset > buffer length
966 out_stream.Write (buffer, buffer.Length + 1, 0);
968 } catch (ArgumentOutOfRangeException ex) {
969 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
970 Assert.IsNull (ex.InnerException, "#B3");
971 Assert.IsNotNull (ex.Message, "#B4");
972 Assert.AreEqual ("offset", ex.ParamName, "#B5");
976 Assert.AreEqual (0, worker.data_len);
980 public void Write_Stream_Closed ()
982 byte [] buffer = Encoding.UTF8.GetBytes ("mono");
984 out_stream.Write (buffer, 0, buffer.Length);
987 string output = Encoding.UTF8.GetString (worker.data);
988 Assert.AreEqual ("4\r\nmono\r\n", output);
991 HttpContext Cook (int re, out FakeHttpWorkerRequest2 f)
993 f = new FakeHttpWorkerRequest2 (re);
994 return new HttpContext (f);