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);
266 public void Test_Response ()
268 FakeHttpWorkerRequest2 f;
269 HttpContext c = Cook (1, out f);
271 c.Response.Write ("a");
272 Assert.AreEqual (false, f.OutputProduced, "T1");
274 Assert.AreEqual (1, f.data_len, "T2");
275 c.Response.Write ("Hola");
276 Assert.AreEqual (1, f.data_len, "T3");
278 Assert.AreEqual (5, f.data_len, "T4");
279 Assert.AreEqual ((byte) 'a', f.data [0], "T5");
280 Assert.AreEqual ((byte) 'H', f.data [1], "T6");
281 Assert.AreEqual ((byte) 'o', f.data [2], "T7");
282 Assert.AreEqual ((byte) 'l', f.data [3], "T8");
283 Assert.AreEqual ((byte) 'a', f.data [4], "T9");
287 public void TestResponse_Chunked ()
289 FakeHttpWorkerRequest2 f;
290 HttpContext c = Cook (2, out f);
292 c.Response.Write ("a");
293 Assert.AreEqual (false, f.OutputProduced, "CT1");
295 Assert.AreEqual (6, f.total, "CT2");
296 c.Response.Write ("Hola");
297 Assert.AreEqual (6, f.total, "CT3");
303 public void Status1 ()
305 FakeHttpWorkerRequest2 f;
306 HttpContext c = Cook (2, out f);
308 HttpResponse resp = c.Response;
309 resp.Status = "200 Lalala";
310 Assert.AreEqual (200, resp.StatusCode, "ST1");
311 Assert.AreEqual ("Lalala", resp.StatusDescription, "ST2");
313 resp.Status = "10000 La la la";
314 Assert.AreEqual (10000, resp.StatusCode, "ST3");
315 Assert.AreEqual ("La la la", resp.StatusDescription, "ST4");
317 resp.Status = "-1 La la la";
318 Assert.AreEqual (-1, resp.StatusCode, "ST5");
319 Assert.AreEqual ("La la la", resp.StatusDescription, "ST6");
321 resp.Status = "-200 La la la";
322 Assert.AreEqual (-200, resp.StatusCode, "ST7");
323 Assert.AreEqual ("La la la", resp.StatusDescription, "ST8");
325 resp.Status = "200 ";
326 Assert.AreEqual (200, resp.StatusCode, "ST7");
327 Assert.AreEqual ("", resp.StatusDescription, "ST8");
331 public void Status2 ()
333 FakeHttpWorkerRequest2 f;
334 HttpContext c = Cook (2, out f);
336 HttpResponse resp = c.Response;
340 } catch (HttpException) {
345 public void Status3 ()
347 FakeHttpWorkerRequest2 f;
348 HttpContext c = Cook (2, out f);
350 HttpResponse resp = c.Response;
352 resp.Status = "200\t";
354 } catch (HttpException) {
359 public void Status4 ()
361 FakeHttpWorkerRequest2 f;
362 HttpContext c = Cook (2, out f);
364 HttpResponse resp = c.Response;
366 Assert.AreEqual (200, resp.StatusCode, "STT1");
367 Assert.AreEqual (HttpWorkerRequest.GetStatusDescription (200), resp.StatusDescription, "STT2");
369 resp.StatusCode = 400;
370 Assert.AreEqual (400, resp.StatusCode, "STT3");
371 Assert.AreEqual (HttpWorkerRequest.GetStatusDescription (400), resp.StatusDescription, "STT4");
373 resp.StatusDescription = "Something else";
374 Assert.AreEqual (400, resp.StatusCode, "STT5");
375 Assert.AreEqual ("Something else", resp.StatusDescription, "STT6");
377 resp.StatusDescription = null;
378 Assert.AreEqual (400, resp.StatusCode, "STT7");
379 Assert.AreEqual (HttpWorkerRequest.GetStatusDescription (400), resp.StatusDescription, "STT8");
383 // TODO: Add test for BinaryWrite and the various writes to check for Chunked Mode
387 public void SetCacheability ()
389 FakeHttpWorkerRequest2 f;
390 HttpContext c = Cook (1, out f);
393 // Basically the values from CacheControl are useless once Response.Cache is used
395 c.Response.Cache.SetCacheability (HttpCacheability.ServerAndNoCache);
396 Assert.AreEqual ("private", c.Response.CacheControl, "C1");
398 c.Response.Cache.SetCacheability (HttpCacheability.ServerAndPrivate);
399 Assert.AreEqual ("private", c.Response.CacheControl, "C2");
401 c.Response.Cache.SetCacheability (HttpCacheability.NoCache);
402 Assert.AreEqual ("private", c.Response.CacheControl, "C3");
404 c.Response.Cache.SetCacheability (HttpCacheability.Private);
405 Assert.AreEqual ("private", c.Response.CacheControl, "C4");
407 c.Response.Cache.SetCacheability (HttpCacheability.Server);
408 Assert.AreEqual ("private", c.Response.CacheControl, "C5");
410 c.Response.Cache.SetCacheability (HttpCacheability.Public);
411 Assert.AreEqual ("private", c.Response.CacheControl, "C6");
415 // Test the values allowed; .NET only documents private and public, but
416 // "no-cache" from the spec is also allowed
419 public void CacheControl ()
421 FakeHttpWorkerRequest2 f;
422 HttpContext c = Cook (1, out f);
425 Assert.AreEqual ("private", c.Response.CacheControl, "D1");
427 c.Response.CacheControl = "private";
428 Assert.AreEqual ("private", c.Response.CacheControl, "D2");
430 c.Response.CacheControl = "public";
431 Assert.AreEqual ("public", c.Response.CacheControl, "D3");
433 c.Response.CacheControl = "no-cache";
434 Assert.AreEqual ("no-cache", c.Response.CacheControl, "D4");
436 c.Response.CacheControl = null;
437 Assert.AreEqual ("private", c.Response.CacheControl, "D5");
439 c.Response.CacheControl = "";
440 Assert.AreEqual ("private", c.Response.CacheControl, "D6");
444 // Just checks if the AddFileDepend* methods accept values, added after bug #342511
446 public void AddFileDependencies ()
448 FakeHttpWorkerRequest2 f;
449 HttpContext c = Cook (1, out f);
451 ArrayList a = new ArrayList (1);
452 a.Add ("somefile.txt");
453 c.Response.AddFileDependencies (a);
456 string[] sa = new string [1] {"somefile.txt"};
458 c.Response.AddFileDependencies (sa);
462 c.Response.AddFileDependency ("somefile.txt");
465 [Test] // bug #488702
466 public void WriteHeaders ()
468 FakeHttpWorkerRequest2 f;
469 HttpContext c = Cook (2, out f);
471 HttpResponse resp = c.Response;
472 resp.CacheControl = "public";
473 resp.Cache.SetCacheability (HttpCacheability.NoCache);
474 resp.ContentType = "text/xml";
475 resp.AppendHeader ("Content-Disposition", "inline");
476 resp.AppendHeader ("Content-Type", "application/ms-word");
477 resp.AppendHeader ("Content-Length", "40");
478 resp.AppendHeader ("Transfer-Encoding", "compress");
479 resp.AppendHeader ("My-Custom-Header", "never");
480 resp.AppendHeader ("My-Custom-Header", "always");
482 Assert.AreEqual ("public", resp.CacheControl, "#A1");
483 Assert.AreEqual ("application/ms-word", resp.ContentType, "#A2");
484 Assert.AreEqual (0, f.KnownResponseHeaders.Count, "#A3");
485 Assert.AreEqual (0, f.UnknownResponseHeaders.Count, "#A4");
489 KnownResponseHeader known;
491 Assert.AreEqual (6, f.KnownResponseHeaders.Count, "#B1");
493 known = (KnownResponseHeader)f.KnownResponseHeaders ["Content-Length"];
494 Assert.AreEqual (HttpWorkerRequest.HeaderContentLength, known.Index, "#B2");
495 Assert.AreEqual ("40", known.Value, "#B3");
497 known = (KnownResponseHeader)f.KnownResponseHeaders["Transfer-Encoding"];
498 Assert.AreEqual (HttpWorkerRequest.HeaderTransferEncoding, known.Index, "#B4");
499 Assert.AreEqual ("compress", known.Value, "#B5");
501 known = (KnownResponseHeader)f.KnownResponseHeaders["Cache-Control"];
502 Assert.AreEqual (HttpWorkerRequest.HeaderCacheControl, known.Index, "#B6");
503 Assert.AreEqual ("no-cache", known.Value, "#B7");
505 known = (KnownResponseHeader)f.KnownResponseHeaders["Pragma"];
506 Assert.AreEqual (HttpWorkerRequest.HeaderPragma, known.Index, "#B8");
507 Assert.AreEqual ("no-cache", known.Value, "#B9");
509 known = (KnownResponseHeader)f.KnownResponseHeaders["Expires"];
510 Assert.AreEqual (HttpWorkerRequest.HeaderExpires, known.Index, "#B10");
511 Assert.AreEqual ("-1", known.Value, "#B11");
513 known = (KnownResponseHeader)f.KnownResponseHeaders["Content-Type"];
514 Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B12");
515 Assert.AreEqual ("application/ms-word", known.Value, "#B13");
517 UnknownResponseHeader unknown;
519 Assert.AreEqual (3, f.UnknownResponseHeaders.Count, "#C1");
521 unknown = (UnknownResponseHeader) f.UnknownResponseHeaders ["X-AspNet-Version"];
522 Assert.AreEqual ("X-AspNet-Version", unknown.Name, "#C2");
523 Assert.AreEqual (Environment.Version.ToString (3), unknown.Value, "#C3");
525 unknown = (UnknownResponseHeader) f.UnknownResponseHeaders ["Content-Disposition"];
526 Assert.AreEqual ("Content-Disposition", unknown.Name, "#C4");
527 Assert.AreEqual ("inline", unknown.Value, "#C5");
529 ArrayList al = f.UnknownResponseHeaders ["My-Custom-Header"] as ArrayList;
530 Assert.AreEqual (2, al.Count, "#C6");
532 unknown = (UnknownResponseHeader) al [0];
533 Assert.AreEqual ("My-Custom-Header", unknown.Name, "#C7");
534 Assert.AreEqual ("never", unknown.Value, "#C8");
536 unknown = (UnknownResponseHeader) al [1];
537 Assert.AreEqual ("My-Custom-Header", unknown.Name, "#C9");
538 Assert.AreEqual ("always", unknown.Value, "#C10");
542 public void WriteHeadersNoCharset ()
544 FakeHttpWorkerRequest2 f;
545 HttpContext c = Cook (2, out f);
547 HttpResponse resp = c.Response;
548 resp.ContentType = "text/plain";
550 Assert.AreEqual ("text/plain", resp.ContentType, "#A1");
554 KnownResponseHeader known;
556 Assert.LessOrEqual (1, f.KnownResponseHeaders.Count, "#B1");
558 known = (KnownResponseHeader)f.KnownResponseHeaders ["Content-Type"];
559 Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B2");
560 Assert.AreEqual ("text/plain", known.Value, "#B3");
564 public void WriteHeadersHasCharset ()
566 FakeHttpWorkerRequest2 f;
567 HttpContext c = Cook (2, out f);
569 HttpResponse resp = c.Response;
570 resp.ContentType = "text/plain";
571 resp.Charset = "big5";
573 Assert.AreEqual ("text/plain", resp.ContentType, "#A1");
574 Assert.AreEqual ("big5", resp.Charset, "#A2");
578 KnownResponseHeader known;
580 Assert.LessOrEqual (1, f.KnownResponseHeaders.Count, "#B1");
582 known = (KnownResponseHeader)f.KnownResponseHeaders ["Content-Type"];
583 Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B2");
584 Assert.AreEqual ("text/plain; charset=big5", known.Value, "#B3");
587 [Test] // bug #485557
588 [Category ("NotWorking")] // bug #488702
589 public void ClearHeaders ()
591 FakeHttpWorkerRequest2 f;
592 HttpContext c = Cook (2, out f);
594 HttpResponse resp = c.Response;
595 resp.CacheControl = "public";
596 resp.Cache.SetCacheability (HttpCacheability.NoCache);
597 resp.ContentType = "text/xml";
598 resp.AppendHeader ("Content-Disposition", "inline");
599 resp.AppendHeader ("Content-Type", "application/ms-word");
600 resp.AppendHeader ("Content-Length", "40");
601 resp.AppendHeader ("Transfer-Encoding", "compress");
602 resp.AppendHeader ("My-Custom-Header", "never");
603 resp.AppendHeader ("My-Custom-Header", "always");
604 resp.ClearHeaders ();
606 Assert.AreEqual ("private", resp.CacheControl, "#A1");
607 Assert.AreEqual ("text/html", resp.ContentType, "#A2");
608 Assert.AreEqual (0, f.KnownResponseHeaders.Count, "#A3");
609 Assert.AreEqual (0, f.UnknownResponseHeaders.Count, "#A4");
613 KnownResponseHeader known;
615 Assert.AreEqual (3, f.KnownResponseHeaders.Count, "#B1");
617 known = (KnownResponseHeader) f.KnownResponseHeaders ["Transfer-Encoding"];
618 Assert.AreEqual (HttpWorkerRequest.HeaderTransferEncoding, known.Index, "#B2");
619 Assert.AreEqual ("chunked", known.Value, "#B3");
621 known = (KnownResponseHeader) f.KnownResponseHeaders ["Cache-Control"];
622 Assert.AreEqual (HttpWorkerRequest.HeaderCacheControl, known.Index, "#B4");
623 Assert.AreEqual ("private", known.Value, "#B5");
625 known = (KnownResponseHeader) f.KnownResponseHeaders ["Content-Type"];
626 Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B6");
627 Assert.AreEqual ("text/html", known.Value, "#B7");
630 Assert.AreEqual (1, f.UnknownResponseHeaders.Count, "#C1");
631 UnknownResponseHeader unknown = (UnknownResponseHeader) f.UnknownResponseHeaders ["X-AspNet-Version"];
632 Assert.AreEqual ("X-AspNet-Version", unknown.Name, "#C2");
633 Assert.AreEqual (Environment.Version.ToString (3), unknown.Value, "#C3");
635 Assert.AreEqual (0, f.UnknownResponseHeaders.Count, "#C1");
640 public void Constructor ()
642 var resp = new HttpResponse (null);
643 Assert.IsNull (resp.Output, "#A1");
647 public void RedirectPermanent ()
649 FakeHttpWorkerRequest2 request;
650 HttpContext context = Cook (1, out request);
651 AssertExtensions.Throws<ArgumentNullException> (() => {
652 context.Response.RedirectPermanent (null);
655 AssertExtensions.Throws<ArgumentException> (() => {
656 context.Response.RedirectPermanent ("http://invalid\nurl.com");
659 AssertExtensions.Throws<ArgumentNullException> (() => {
660 context.Response.RedirectPermanent (null, true);
663 AssertExtensions.Throws<ArgumentException> (() => {
664 context.Response.RedirectPermanent ("http://invalid\nurl.com", true);
669 public void RedirectToRoute ()
671 var resp = new HttpResponse (new StringWriter ());
673 AssertExtensions.Throws<NullReferenceException> (() => {
674 resp.RedirectToRoute ("SomeRoute");
677 FakeHttpWorkerRequest2 request;
678 HttpContext context = Cook (1, out request);
680 // From RouteCollection.GetVirtualPath
681 AssertExtensions.Throws<ArgumentException> (() => {
682 context.Response.RedirectToRoute ("SomeRoute");
685 AssertExtensions.Throws<InvalidOperationException> (() => {
686 context.Response.RedirectToRoute (new { productId = "1", category = "widgets" });
691 public void RemoveOutputCacheItem ()
693 AssertExtensions.Throws<ArgumentNullException> (() => {
694 HttpResponse.RemoveOutputCacheItem (null, "MyProvider");
697 AssertExtensions.Throws<ArgumentException> (() => {
698 HttpResponse.RemoveOutputCacheItem ("badPath", null);
701 Assert.IsNull (OutputCache.Providers, "#A3");
702 HttpResponse.RemoveOutputCacheItem ("/Path", null);
704 AssertExtensions.Throws<ProviderException> (() => {
705 HttpResponse.RemoveOutputCacheItem ("/Path", String.Empty);
708 AssertExtensions.Throws<ProviderException> (() => {
709 HttpResponse.RemoveOutputCacheItem ("/Path", "MyProvider");
714 public void OutputSetter ()
716 FakeHttpWorkerRequest2 request;
717 HttpContext context = Cook (1, out request);
719 Assert.IsNotNull (context.Response.Output, "#A1");
720 context.Response.Output = null;
721 Assert.IsNull (context.Response.Output, "#A2");
724 AssertExtensions.Throws<NullReferenceException> (() => {
725 context.Response.Write ('t');
728 AssertExtensions.Throws<NullReferenceException> (() => {
729 context.Response.Write ((object) 5);
732 AssertExtensions.Throws<NullReferenceException> (() => {
733 context.Response.Write ("string");
736 AssertExtensions.Throws<NullReferenceException> (() => {
737 context.Response.Write (new char [] { '1' }, 0, 1);
740 AssertExtensions.Throws<NullReferenceException> (() => {
741 context.Response.Write ((object) null);
748 public class HttpResponseOutputStreamTest
750 FakeHttpWorkerRequest2 worker;
752 HttpResponse response;
758 context = Cook (2, out worker);
759 response = context.Response;
760 out_stream = response.OutputStream;
764 public void TearDown ()
766 if (response != null)
771 public void CanRead ()
773 Assert.IsFalse (out_stream.CanRead, "#1");
775 Assert.IsFalse (out_stream.CanRead, "#2");
779 public void CanSeek ()
781 Assert.IsFalse (out_stream.CanSeek, "#1");
783 Assert.IsFalse (out_stream.CanSeek, "#2");
787 public void CanWrite ()
789 Assert.IsTrue (out_stream.CanWrite, "#1");
791 Assert.IsTrue (out_stream.CanWrite, "#2");
797 byte [] buffer = Encoding.UTF8.GetBytes ("mono");
798 out_stream.Write (buffer, 0, buffer.Length);
800 Assert.AreEqual (0, worker.data_len);
804 public void Length ()
807 long len = out_stream.Length;
808 Assert.Fail ("#1:" + len);
809 } catch (NotSupportedException ex) {
810 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
811 Assert.IsNull (ex.InnerException, "#3");
812 Assert.IsNotNull (ex.Message, "#4");
817 public void Position ()
820 long pos = out_stream.Position;
821 Assert.Fail ("#A1:" + pos);
822 } catch (NotSupportedException ex) {
823 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#A2");
824 Assert.IsNull (ex.InnerException, "#A3");
825 Assert.IsNotNull (ex.Message, "#A4");
829 out_stream.Position = 0;
831 } catch (NotSupportedException ex) {
832 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#B2");
833 Assert.IsNull (ex.InnerException, "#B3");
834 Assert.IsNotNull (ex.Message, "#B4");
841 byte [] buffer = new byte [5];
844 out_stream.Read (buffer, 0, buffer.Length);
846 } catch (NotSupportedException ex) {
847 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
848 Assert.IsNull (ex.InnerException, "#3");
849 Assert.IsNotNull (ex.Message, "#4");
857 out_stream.Seek (5, SeekOrigin.Begin);
859 } catch (NotSupportedException ex) {
860 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
861 Assert.IsNull (ex.InnerException, "#3");
862 Assert.IsNotNull (ex.Message, "#4");
867 public void SetLength ()
870 out_stream.SetLength (5L);
872 } catch (NotSupportedException ex) {
873 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
874 Assert.IsNull (ex.InnerException, "#3");
875 Assert.IsNotNull (ex.Message, "#4");
884 buffer = Encoding.UTF8.GetBytes ("mono");
885 out_stream.Write (buffer, 0, buffer.Length);
886 buffer = Encoding.UTF8.GetBytes ("just rocks!!");
887 out_stream.Write (buffer, 5, 6);
888 out_stream.Write (buffer, 0, 4);
889 Assert.IsFalse (worker.OutputProduced, "#1");
891 Assert.IsTrue (worker.OutputProduced, "#2");
893 string output = Encoding.UTF8.GetString (worker.data);
894 Assert.AreEqual ("e\r\nmonorocks!just\r\n", output);
898 public void Write_Buffer_Null ()
901 out_stream.Write ((byte []) null, 0, 0);
904 } catch (ArgumentNullException ex) {
905 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
906 Assert.IsNull (ex.InnerException, "#3");
907 Assert.IsNotNull (ex.Message, "#4");
908 Assert.AreEqual ("buffer", ex.ParamName, "#5");
911 } catch (NullReferenceException) {
917 public void Write_Count_Negative ()
919 byte [] buffer = new byte [] { 0x0a, 0x1f, 0x2d };
923 out_stream.Write (buffer, 1, -1);
925 } catch (ArgumentOutOfRangeException ex) {
926 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
927 Assert.IsNull (ex.InnerException, "#3");
928 Assert.IsNotNull (ex.Message, "#4");
929 Assert.AreEqual ("count", ex.ParamName, "#5");
934 public void Write_Count_Overflow ()
938 buffer = Encoding.UTF8.GetBytes ("Mono");
939 out_stream.Write (buffer, 0, buffer.Length + 5);
940 buffer = Encoding.UTF8.GetBytes ("Just Rocks!!");
941 out_stream.Write (buffer, 5, buffer.Length - 2);
944 string output = Encoding.UTF8.GetString (worker.data);
945 Assert.AreEqual ("b\r\nMonoRocks!!\r\n", output);
949 public void Write_Offset_Negative ()
951 byte [] buffer = new byte [] { 0x0a, 0x1f, 0x2d };
955 out_stream.Write (buffer, -1, 0);
957 } catch (ArgumentOutOfRangeException ex) {
958 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
959 Assert.IsNull (ex.InnerException, "#3");
960 Assert.IsNotNull (ex.Message, "#4");
961 Assert.AreEqual ("offset", ex.ParamName, "#5");
966 public void Write_Offset_Overflow ()
968 byte [] buffer = new byte [] { 0x0a, 0x1f, 0x2d };
970 // offset == buffer length
973 out_stream.Write (buffer, buffer.Length, 0);
975 } catch (ArgumentOutOfRangeException ex) {
976 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
977 Assert.IsNull (ex.InnerException, "#A3");
978 Assert.IsNotNull (ex.Message, "#A4");
979 Assert.AreEqual ("offset", ex.ParamName, "#A5");
982 out_stream.Write (buffer, buffer.Length, 0);
985 // offset > buffer length
988 out_stream.Write (buffer, buffer.Length + 1, 0);
990 } catch (ArgumentOutOfRangeException ex) {
991 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
992 Assert.IsNull (ex.InnerException, "#B3");
993 Assert.IsNotNull (ex.Message, "#B4");
994 Assert.AreEqual ("offset", ex.ParamName, "#B5");
997 out_stream.Write (buffer, buffer.Length + 1, 0);
1001 Assert.AreEqual (0, worker.data_len);
1005 public void Write_Stream_Closed ()
1007 byte [] buffer = Encoding.UTF8.GetBytes ("mono");
1008 out_stream.Close ();
1009 out_stream.Write (buffer, 0, buffer.Length);
1012 string output = Encoding.UTF8.GetString (worker.data);
1013 Assert.AreEqual ("4\r\nmono\r\n", output);
1016 HttpContext Cook (int re, out FakeHttpWorkerRequest2 f)
1018 f = new FakeHttpWorkerRequest2 (re);
1019 return new HttpContext (f);