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);
260 AppDomain.CurrentDomain.SetData (".appPath", AppDomain.CurrentDomain.BaseDirectory);
264 public void Test_Response ()
266 FakeHttpWorkerRequest2 f;
267 HttpContext c = Cook (1, out f);
269 c.Response.Write ("a");
270 Assert.AreEqual (false, f.OutputProduced, "T1");
272 Assert.AreEqual (1, f.data_len, "T2");
273 c.Response.Write ("Hola");
274 Assert.AreEqual (1, f.data_len, "T3");
276 Assert.AreEqual (5, f.data_len, "T4");
277 Assert.AreEqual ((byte) 'a', f.data [0], "T5");
278 Assert.AreEqual ((byte) 'H', f.data [1], "T6");
279 Assert.AreEqual ((byte) 'o', f.data [2], "T7");
280 Assert.AreEqual ((byte) 'l', f.data [3], "T8");
281 Assert.AreEqual ((byte) 'a', f.data [4], "T9");
285 public void TestResponse_Chunked ()
287 FakeHttpWorkerRequest2 f;
288 HttpContext c = Cook (2, out f);
290 c.Response.Write ("a");
291 Assert.AreEqual (false, f.OutputProduced, "CT1");
293 Assert.AreEqual (6, f.total, "CT2");
294 c.Response.Write ("Hola");
295 Assert.AreEqual (6, f.total, "CT3");
301 public void Status1 ()
303 FakeHttpWorkerRequest2 f;
304 HttpContext c = Cook (2, out f);
306 HttpResponse resp = c.Response;
307 resp.Status = "200 Lalala";
308 Assert.AreEqual (200, resp.StatusCode, "ST1");
309 Assert.AreEqual ("Lalala", resp.StatusDescription, "ST2");
311 resp.Status = "10000 La la la";
312 Assert.AreEqual (10000, resp.StatusCode, "ST3");
313 Assert.AreEqual ("La la la", resp.StatusDescription, "ST4");
315 resp.Status = "-1 La la la";
316 Assert.AreEqual (-1, resp.StatusCode, "ST5");
317 Assert.AreEqual ("La la la", resp.StatusDescription, "ST6");
319 resp.Status = "-200 La la la";
320 Assert.AreEqual (-200, resp.StatusCode, "ST7");
321 Assert.AreEqual ("La la la", resp.StatusDescription, "ST8");
323 resp.Status = "200 ";
324 Assert.AreEqual (200, resp.StatusCode, "ST7");
325 Assert.AreEqual ("", resp.StatusDescription, "ST8");
329 public void Status2 ()
331 FakeHttpWorkerRequest2 f;
332 HttpContext c = Cook (2, out f);
334 HttpResponse resp = c.Response;
338 } catch (HttpException) {
343 public void Status3 ()
345 FakeHttpWorkerRequest2 f;
346 HttpContext c = Cook (2, out f);
348 HttpResponse resp = c.Response;
350 resp.Status = "200\t";
352 } catch (HttpException) {
357 public void Status4 ()
359 FakeHttpWorkerRequest2 f;
360 HttpContext c = Cook (2, out f);
362 HttpResponse resp = c.Response;
364 Assert.AreEqual (200, resp.StatusCode, "STT1");
365 Assert.AreEqual (HttpWorkerRequest.GetStatusDescription (200), resp.StatusDescription, "STT2");
367 resp.StatusCode = 400;
368 Assert.AreEqual (400, resp.StatusCode, "STT3");
369 Assert.AreEqual (HttpWorkerRequest.GetStatusDescription (400), resp.StatusDescription, "STT4");
371 resp.StatusDescription = "Something else";
372 Assert.AreEqual (400, resp.StatusCode, "STT5");
373 Assert.AreEqual ("Something else", resp.StatusDescription, "STT6");
375 resp.StatusDescription = null;
376 Assert.AreEqual (400, resp.StatusCode, "STT7");
377 Assert.AreEqual (HttpWorkerRequest.GetStatusDescription (400), resp.StatusDescription, "STT8");
381 // TODO: Add test for BinaryWrite and the various writes to check for Chunked Mode
385 public void SetCacheability ()
387 FakeHttpWorkerRequest2 f;
388 HttpContext c = Cook (1, out f);
391 // Basically the values from CacheControl are useless once Response.Cache is used
393 c.Response.Cache.SetCacheability (HttpCacheability.ServerAndNoCache);
394 Assert.AreEqual ("private", c.Response.CacheControl, "C1");
396 c.Response.Cache.SetCacheability (HttpCacheability.ServerAndPrivate);
397 Assert.AreEqual ("private", c.Response.CacheControl, "C2");
399 c.Response.Cache.SetCacheability (HttpCacheability.NoCache);
400 Assert.AreEqual ("private", c.Response.CacheControl, "C3");
402 c.Response.Cache.SetCacheability (HttpCacheability.Private);
403 Assert.AreEqual ("private", c.Response.CacheControl, "C4");
405 c.Response.Cache.SetCacheability (HttpCacheability.Server);
406 Assert.AreEqual ("private", c.Response.CacheControl, "C5");
408 c.Response.Cache.SetCacheability (HttpCacheability.Public);
409 Assert.AreEqual ("private", c.Response.CacheControl, "C6");
413 // Test the values allowed; .NET only documents private and public, but
414 // "no-cache" from the spec is also allowed
417 public void CacheControl ()
419 FakeHttpWorkerRequest2 f;
420 HttpContext c = Cook (1, out f);
423 Assert.AreEqual ("private", c.Response.CacheControl, "D1");
425 c.Response.CacheControl = "private";
426 Assert.AreEqual ("private", c.Response.CacheControl, "D2");
428 c.Response.CacheControl = "public";
429 Assert.AreEqual ("public", c.Response.CacheControl, "D3");
431 c.Response.CacheControl = "no-cache";
432 Assert.AreEqual ("no-cache", c.Response.CacheControl, "D4");
434 c.Response.CacheControl = null;
435 Assert.AreEqual ("private", c.Response.CacheControl, "D5");
437 c.Response.CacheControl = "";
438 Assert.AreEqual ("private", c.Response.CacheControl, "D6");
442 // Just checks if the AddFileDepend* methods accept values, added after bug #342511
444 public void AddFileDependencies ()
446 FakeHttpWorkerRequest2 f;
447 HttpContext c = Cook (1, out f);
449 ArrayList a = new ArrayList (1);
450 a.Add ("somefile.txt");
451 c.Response.AddFileDependencies (a);
453 string[] sa = new string [1] {"somefile.txt"};
455 c.Response.AddFileDependencies (sa);
458 c.Response.AddFileDependency ("somefile.txt");
461 [Test] // bug #488702
462 public void WriteHeaders ()
464 FakeHttpWorkerRequest2 f;
465 HttpContext c = Cook (2, out f);
467 HttpResponse resp = c.Response;
468 resp.CacheControl = "public";
469 resp.Cache.SetCacheability (HttpCacheability.NoCache);
470 resp.ContentType = "text/xml";
471 resp.AppendHeader ("Content-Disposition", "inline");
472 resp.AppendHeader ("Content-Type", "application/ms-word");
473 resp.AppendHeader ("Content-Length", "40");
474 resp.AppendHeader ("Transfer-Encoding", "compress");
475 resp.AppendHeader ("My-Custom-Header", "never");
476 resp.AppendHeader ("My-Custom-Header", "always");
478 Assert.AreEqual ("public", resp.CacheControl, "#A1");
479 Assert.AreEqual ("application/ms-word", resp.ContentType, "#A2");
480 Assert.AreEqual (0, f.KnownResponseHeaders.Count, "#A3");
481 Assert.AreEqual (0, f.UnknownResponseHeaders.Count, "#A4");
485 KnownResponseHeader known;
487 Assert.AreEqual (6, f.KnownResponseHeaders.Count, "#B1");
489 known = (KnownResponseHeader)f.KnownResponseHeaders ["Content-Length"];
490 Assert.AreEqual (HttpWorkerRequest.HeaderContentLength, known.Index, "#B2");
491 Assert.AreEqual ("40", known.Value, "#B3");
493 known = (KnownResponseHeader)f.KnownResponseHeaders["Transfer-Encoding"];
494 Assert.AreEqual (HttpWorkerRequest.HeaderTransferEncoding, known.Index, "#B4");
495 Assert.AreEqual ("compress", known.Value, "#B5");
497 known = (KnownResponseHeader)f.KnownResponseHeaders["Cache-Control"];
498 Assert.AreEqual (HttpWorkerRequest.HeaderCacheControl, known.Index, "#B6");
499 Assert.AreEqual ("no-cache", known.Value, "#B7");
501 known = (KnownResponseHeader)f.KnownResponseHeaders["Pragma"];
502 Assert.AreEqual (HttpWorkerRequest.HeaderPragma, known.Index, "#B8");
503 Assert.AreEqual ("no-cache", known.Value, "#B9");
505 known = (KnownResponseHeader)f.KnownResponseHeaders["Expires"];
506 Assert.AreEqual (HttpWorkerRequest.HeaderExpires, known.Index, "#B10");
507 Assert.AreEqual ("-1", known.Value, "#B11");
509 known = (KnownResponseHeader)f.KnownResponseHeaders["Content-Type"];
510 Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B12");
511 Assert.AreEqual ("application/ms-word", known.Value, "#B13");
513 UnknownResponseHeader unknown;
515 Assert.AreEqual (3, f.UnknownResponseHeaders.Count, "#C1");
517 unknown = (UnknownResponseHeader) f.UnknownResponseHeaders ["X-AspNet-Version"];
518 Assert.AreEqual ("X-AspNet-Version", unknown.Name, "#C2");
519 Assert.AreEqual (Environment.Version.ToString (3), unknown.Value, "#C3");
521 unknown = (UnknownResponseHeader) f.UnknownResponseHeaders ["Content-Disposition"];
522 Assert.AreEqual ("Content-Disposition", unknown.Name, "#C4");
523 Assert.AreEqual ("inline", unknown.Value, "#C5");
525 ArrayList al = f.UnknownResponseHeaders ["My-Custom-Header"] as ArrayList;
526 Assert.AreEqual (2, al.Count, "#C6");
528 unknown = (UnknownResponseHeader) al [0];
529 Assert.AreEqual ("My-Custom-Header", unknown.Name, "#C7");
530 Assert.AreEqual ("never", unknown.Value, "#C8");
532 unknown = (UnknownResponseHeader) al [1];
533 Assert.AreEqual ("My-Custom-Header", unknown.Name, "#C9");
534 Assert.AreEqual ("always", unknown.Value, "#C10");
538 public void WriteHeadersNoCharset ()
540 FakeHttpWorkerRequest2 f;
541 HttpContext c = Cook (2, out f);
543 HttpResponse resp = c.Response;
544 resp.ContentType = "text/plain";
546 Assert.AreEqual ("text/plain", resp.ContentType, "#A1");
550 KnownResponseHeader known;
552 Assert.LessOrEqual (1, f.KnownResponseHeaders.Count, "#B1");
554 known = (KnownResponseHeader)f.KnownResponseHeaders ["Content-Type"];
555 Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B2");
556 Assert.AreEqual ("text/plain", known.Value, "#B3");
560 public void WriteHeadersHasCharset ()
562 FakeHttpWorkerRequest2 f;
563 HttpContext c = Cook (2, out f);
565 HttpResponse resp = c.Response;
566 resp.ContentType = "text/plain";
567 resp.Charset = "big5";
569 Assert.AreEqual ("text/plain", resp.ContentType, "#A1");
570 Assert.AreEqual ("big5", resp.Charset, "#A2");
574 KnownResponseHeader known;
576 Assert.LessOrEqual (1, f.KnownResponseHeaders.Count, "#B1");
578 known = (KnownResponseHeader)f.KnownResponseHeaders ["Content-Type"];
579 Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B2");
580 Assert.AreEqual ("text/plain; charset=big5", known.Value, "#B3");
583 [Test] // bug #485557
584 [Category ("NotWorking")] // bug #488702
585 public void ClearHeaders ()
587 FakeHttpWorkerRequest2 f;
588 HttpContext c = Cook (2, out f);
590 HttpResponse resp = c.Response;
591 resp.CacheControl = "public";
592 resp.Cache.SetCacheability (HttpCacheability.NoCache);
593 resp.ContentType = "text/xml";
594 resp.AppendHeader ("Content-Disposition", "inline");
595 resp.AppendHeader ("Content-Type", "application/ms-word");
596 resp.AppendHeader ("Content-Length", "40");
597 resp.AppendHeader ("Transfer-Encoding", "compress");
598 resp.AppendHeader ("My-Custom-Header", "never");
599 resp.AppendHeader ("My-Custom-Header", "always");
600 resp.ClearHeaders ();
602 Assert.AreEqual ("private", resp.CacheControl, "#A1");
603 Assert.AreEqual ("text/html", resp.ContentType, "#A2");
604 Assert.AreEqual (0, f.KnownResponseHeaders.Count, "#A3");
605 Assert.AreEqual (0, f.UnknownResponseHeaders.Count, "#A4");
609 KnownResponseHeader known;
611 Assert.AreEqual (3, f.KnownResponseHeaders.Count, "#B1");
613 known = (KnownResponseHeader) f.KnownResponseHeaders ["Transfer-Encoding"];
614 Assert.AreEqual (HttpWorkerRequest.HeaderTransferEncoding, known.Index, "#B2");
615 Assert.AreEqual ("chunked", known.Value, "#B3");
617 known = (KnownResponseHeader) f.KnownResponseHeaders ["Cache-Control"];
618 Assert.AreEqual (HttpWorkerRequest.HeaderCacheControl, known.Index, "#B4");
619 Assert.AreEqual ("private", known.Value, "#B5");
621 known = (KnownResponseHeader) f.KnownResponseHeaders ["Content-Type"];
622 Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B6");
623 Assert.AreEqual ("text/html", known.Value, "#B7");
625 Assert.AreEqual (1, f.UnknownResponseHeaders.Count, "#C1");
626 UnknownResponseHeader unknown = (UnknownResponseHeader) f.UnknownResponseHeaders ["X-AspNet-Version"];
627 Assert.AreEqual ("X-AspNet-Version", unknown.Name, "#C2");
628 Assert.AreEqual (Environment.Version.ToString (3), unknown.Value, "#C3");
632 public void Constructor ()
634 var resp = new HttpResponse (null);
635 Assert.IsNull (resp.Output, "#A1");
639 public void RedirectPermanent ()
641 FakeHttpWorkerRequest2 request;
642 HttpContext context = Cook (1, out request);
643 AssertExtensions.Throws<ArgumentNullException> (() => {
644 context.Response.RedirectPermanent (null);
647 AssertExtensions.Throws<ArgumentException> (() => {
648 context.Response.RedirectPermanent ("http://invalid\nurl.com");
651 AssertExtensions.Throws<ArgumentNullException> (() => {
652 context.Response.RedirectPermanent (null, true);
655 AssertExtensions.Throws<ArgumentException> (() => {
656 context.Response.RedirectPermanent ("http://invalid\nurl.com", true);
661 public void RedirectToRoute ()
663 var resp = new HttpResponse (new StringWriter ());
665 AssertExtensions.Throws<NullReferenceException> (() => {
666 resp.RedirectToRoute ("SomeRoute");
669 FakeHttpWorkerRequest2 request;
670 HttpContext context = Cook (1, out request);
672 // From RouteCollection.GetVirtualPath
673 AssertExtensions.Throws<ArgumentException> (() => {
674 context.Response.RedirectToRoute ("SomeRoute");
677 AssertExtensions.Throws<InvalidOperationException> (() => {
678 context.Response.RedirectToRoute (new { productId = "1", category = "widgets" });
683 public void RemoveOutputCacheItem ()
685 AssertExtensions.Throws<ArgumentNullException> (() => {
686 HttpResponse.RemoveOutputCacheItem (null, "MyProvider");
689 AssertExtensions.Throws<ArgumentException> (() => {
690 HttpResponse.RemoveOutputCacheItem ("badPath", null);
693 Assert.IsNull (OutputCache.Providers, "#A3");
694 HttpResponse.RemoveOutputCacheItem ("/Path", null);
696 AssertExtensions.Throws<ProviderException> (() => {
697 HttpResponse.RemoveOutputCacheItem ("/Path", String.Empty);
700 AssertExtensions.Throws<ProviderException> (() => {
701 HttpResponse.RemoveOutputCacheItem ("/Path", "MyProvider");
706 public void OutputSetter ()
708 FakeHttpWorkerRequest2 request;
709 HttpContext context = Cook (1, out request);
711 Assert.IsNotNull (context.Response.Output, "#A1");
712 context.Response.Output = null;
713 Assert.IsNull (context.Response.Output, "#A2");
716 AssertExtensions.Throws<NullReferenceException> (() => {
717 context.Response.Write ('t');
720 AssertExtensions.Throws<NullReferenceException> (() => {
721 context.Response.Write ((object) 5);
724 AssertExtensions.Throws<NullReferenceException> (() => {
725 context.Response.Write ("string");
728 AssertExtensions.Throws<NullReferenceException> (() => {
729 context.Response.Write (new char [] { '1' }, 0, 1);
732 AssertExtensions.Throws<NullReferenceException> (() => {
733 context.Response.Write ((object) null);
740 public class HttpResponseOutputStreamTest
742 FakeHttpWorkerRequest2 worker;
744 HttpResponse response;
750 context = Cook (2, out worker);
751 response = context.Response;
752 out_stream = response.OutputStream;
756 public void TearDown ()
758 if (response != null)
763 public void CanRead ()
765 Assert.IsFalse (out_stream.CanRead, "#1");
767 Assert.IsFalse (out_stream.CanRead, "#2");
771 public void CanSeek ()
773 Assert.IsFalse (out_stream.CanSeek, "#1");
775 Assert.IsFalse (out_stream.CanSeek, "#2");
779 public void CanWrite ()
781 Assert.IsTrue (out_stream.CanWrite, "#1");
783 Assert.IsTrue (out_stream.CanWrite, "#2");
789 byte [] buffer = Encoding.UTF8.GetBytes ("mono");
790 out_stream.Write (buffer, 0, buffer.Length);
792 Assert.AreEqual (0, worker.data_len);
796 public void Length ()
799 long len = out_stream.Length;
800 Assert.Fail ("#1:" + len);
801 } catch (NotSupportedException ex) {
802 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
803 Assert.IsNull (ex.InnerException, "#3");
804 Assert.IsNotNull (ex.Message, "#4");
809 public void Position ()
812 long pos = out_stream.Position;
813 Assert.Fail ("#A1:" + pos);
814 } catch (NotSupportedException ex) {
815 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#A2");
816 Assert.IsNull (ex.InnerException, "#A3");
817 Assert.IsNotNull (ex.Message, "#A4");
821 out_stream.Position = 0;
823 } catch (NotSupportedException ex) {
824 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#B2");
825 Assert.IsNull (ex.InnerException, "#B3");
826 Assert.IsNotNull (ex.Message, "#B4");
833 byte [] buffer = new byte [5];
836 out_stream.Read (buffer, 0, buffer.Length);
838 } catch (NotSupportedException ex) {
839 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
840 Assert.IsNull (ex.InnerException, "#3");
841 Assert.IsNotNull (ex.Message, "#4");
849 out_stream.Seek (5, SeekOrigin.Begin);
851 } catch (NotSupportedException ex) {
852 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
853 Assert.IsNull (ex.InnerException, "#3");
854 Assert.IsNotNull (ex.Message, "#4");
859 public void SetLength ()
862 out_stream.SetLength (5L);
864 } catch (NotSupportedException ex) {
865 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
866 Assert.IsNull (ex.InnerException, "#3");
867 Assert.IsNotNull (ex.Message, "#4");
876 buffer = Encoding.UTF8.GetBytes ("mono");
877 out_stream.Write (buffer, 0, buffer.Length);
878 buffer = Encoding.UTF8.GetBytes ("just rocks!!");
879 out_stream.Write (buffer, 5, 6);
880 out_stream.Write (buffer, 0, 4);
881 Assert.IsFalse (worker.OutputProduced, "#1");
883 Assert.IsTrue (worker.OutputProduced, "#2");
885 string output = Encoding.UTF8.GetString (worker.data);
886 Assert.AreEqual ("e\r\nmonorocks!just\r\n", output);
890 public void Write_Buffer_Null ()
893 out_stream.Write ((byte []) null, 0, 0);
895 } catch (ArgumentNullException ex) {
896 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
897 Assert.IsNull (ex.InnerException, "#3");
898 Assert.IsNotNull (ex.Message, "#4");
899 Assert.AreEqual ("buffer", ex.ParamName, "#5");
904 public void Write_Count_Negative ()
906 byte [] buffer = new byte [] { 0x0a, 0x1f, 0x2d };
910 out_stream.Write (buffer, 1, -1);
912 } catch (ArgumentOutOfRangeException ex) {
913 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
914 Assert.IsNull (ex.InnerException, "#3");
915 Assert.IsNotNull (ex.Message, "#4");
916 Assert.AreEqual ("count", ex.ParamName, "#5");
921 public void Write_Count_Overflow ()
925 buffer = Encoding.UTF8.GetBytes ("Mono");
926 out_stream.Write (buffer, 0, buffer.Length + 5);
927 buffer = Encoding.UTF8.GetBytes ("Just Rocks!!");
928 out_stream.Write (buffer, 5, buffer.Length - 2);
931 string output = Encoding.UTF8.GetString (worker.data);
932 Assert.AreEqual ("b\r\nMonoRocks!!\r\n", output);
936 public void Write_Offset_Negative ()
938 byte [] buffer = new byte [] { 0x0a, 0x1f, 0x2d };
942 out_stream.Write (buffer, -1, 0);
944 } catch (ArgumentOutOfRangeException ex) {
945 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
946 Assert.IsNull (ex.InnerException, "#3");
947 Assert.IsNotNull (ex.Message, "#4");
948 Assert.AreEqual ("offset", ex.ParamName, "#5");
953 public void Write_Offset_Overflow ()
955 byte [] buffer = new byte [] { 0x0a, 0x1f, 0x2d };
957 // offset == buffer length
959 out_stream.Write (buffer, buffer.Length, 0);
961 } catch (ArgumentOutOfRangeException ex) {
962 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
963 Assert.IsNull (ex.InnerException, "#A3");
964 Assert.IsNotNull (ex.Message, "#A4");
965 Assert.AreEqual ("offset", ex.ParamName, "#A5");
968 // offset > buffer length
970 out_stream.Write (buffer, buffer.Length + 1, 0);
972 } catch (ArgumentOutOfRangeException ex) {
973 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
974 Assert.IsNull (ex.InnerException, "#B3");
975 Assert.IsNotNull (ex.Message, "#B4");
976 Assert.AreEqual ("offset", ex.ParamName, "#B5");
980 Assert.AreEqual (0, worker.data_len);
984 public void Write_Stream_Closed ()
986 byte [] buffer = Encoding.UTF8.GetBytes ("mono");
988 out_stream.Write (buffer, 0, buffer.Length);
991 string output = Encoding.UTF8.GetString (worker.data);
992 Assert.AreEqual ("4\r\nmono\r\n", output);
995 HttpContext Cook (int re, out FakeHttpWorkerRequest2 f)
997 f = new FakeHttpWorkerRequest2 (re);
998 return new HttpContext (f);