Xamarin Public Jenkins (auto-signing) 6bdd276d05 Imported Upstream version 5.0.0.42
Former-commit-id: fd56571888259555122d8a0f58c68838229cea2b
2017-04-10 11:41:01 +00:00

998 lines
27 KiB
C#

//
// System.Web.HttpResponseTest.cs - Unit tests for System.Web.HttpResponse
//
// Author:
// Miguel de Icaza <miguel@ximian.com>
//
// Copyright (C) 2005 Novell, Inc (http://www.novell.com)
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Configuration.Provider;
using System.IO;
using System.Text;
using System.Web;
using System.Web.Routing;
using System.Web.Caching;
using NUnit.Framework;
using MonoTests.Common;
namespace MonoTests.System.Web {
public class FakeHttpWorkerRequest2 : HttpWorkerRequest {
public Hashtable KnownResponseHeaders;
public Hashtable UnknownResponseHeaders;
public int return_kind;
public FakeHttpWorkerRequest2 (int re)
{
KnownResponseHeaders = CollectionsUtil.CreateCaseInsensitiveHashtable();
UnknownResponseHeaders = CollectionsUtil.CreateCaseInsensitiveHashtable();
return_kind = re;
}
public override string GetUriPath()
{
return "/fake";
}
public override string GetQueryString()
{
return "GetQueryString";
}
public override string GetRawUrl()
{
return "/GetRawUrl";
}
public override string GetHttpVerbName()
{
return "GET";
}
public override string GetHttpVersion()
{
if (return_kind == 1)
return "HTTP/1.0";
else
return "HTTP/1.1";
}
public override string GetRemoteAddress()
{
return "__GetRemoteAddress";
}
public override int GetRemotePort()
{
return 1010;
}
public override string GetLocalAddress()
{
return "GetLocalAddress";
}
public override string GetAppPath ()
{
return "AppPath";
}
public override int GetLocalPort()
{
return 2020;
}
public bool status_sent;
public int status_code;
public string status_string;
public override void SendStatus(int s, string x)
{
status_sent = true;
status_code = s;
status_string = x;
}
void AddHeader (Hashtable table, string header_name, object header)
{
object o = table [header_name];
if (o == null)
table.Add (header_name, header);
else {
ArrayList al = o as ArrayList;
if (al == null) {
al = new ArrayList ();
al.Add (o);
table [header_name] = al;
} else
al = o as ArrayList;
al.Add (header);
}
}
bool headers_sent;
public override void SendKnownResponseHeader(int x, string j)
{
string header_name = HttpWorkerRequest.GetKnownRequestHeaderName (x);
AddHeader (KnownResponseHeaders, header_name, new KnownResponseHeader (x, j));
headers_sent = true;
}
public override void SendUnknownResponseHeader(string a, string b)
{
AddHeader (UnknownResponseHeaders, a, new UnknownResponseHeader (a, b));
headers_sent = true;
}
bool data_sent;
public byte [] data;
public int data_len;
public int total = 0;
public override void SendResponseFromMemory(byte[] arr, int x)
{
data_sent = true;
if (data != null) {
byte [] tmp = new byte [data.Length + x];
Array.Copy (data, tmp, data.Length);
Array.Copy (arr, 0, tmp, data.Length, x);
data = tmp;
data_len = data.Length;
} else {
data = new byte [x];
for (int i = 0; i < x; i++)
data [i] = arr [i];
data_len = x;
}
total += x;
}
public override void SendResponseFromFile(string a, long b , long c)
{
data_sent = true;
}
public override void SendResponseFromFile (IntPtr a, long b, long c)
{
data_sent = true;
}
public override void FlushResponse(bool x)
{
}
public override void EndOfRequest() {
}
public override string GetKnownRequestHeader (int index)
{
return null;
}
public bool OutputProduced {
get {
return headers_sent || data_sent;
}
}
}
class KnownResponseHeader
{
private int index;
private string value;
public KnownResponseHeader (int index, string value)
{
this.index = index;
this.value = value;
}
public int Index {
get { return index; }
}
public string Value {
get { return value; }
}
}
class UnknownResponseHeader
{
private string name;
private string value;
public UnknownResponseHeader (string name, string value)
{
this.name = name;
this.value = value;
}
public string Name {
get { return name; }
}
public string Value {
get { return value; }
}
}
[TestFixture]
public class HttpResponseTest {
public static HttpContext Cook (int re, out FakeHttpWorkerRequest2 f)
{
f = new FakeHttpWorkerRequest2 (re);
HttpContext c = new HttpContext (f);
return c;
}
[SetUp]
public void SetUp ()
{
AppDomain.CurrentDomain.SetData (".appPath", AppDomain.CurrentDomain.BaseDirectory);
}
[Test]
public void Test_Response ()
{
FakeHttpWorkerRequest2 f;
HttpContext c = Cook (1, out f);
c.Response.Write ("a");
Assert.AreEqual (false, f.OutputProduced, "T1");
c.Response.Flush ();
Assert.AreEqual (1, f.data_len, "T2");
c.Response.Write ("Hola");
Assert.AreEqual (1, f.data_len, "T3");
c.Response.Flush ();
Assert.AreEqual (5, f.data_len, "T4");
Assert.AreEqual ((byte) 'a', f.data [0], "T5");
Assert.AreEqual ((byte) 'H', f.data [1], "T6");
Assert.AreEqual ((byte) 'o', f.data [2], "T7");
Assert.AreEqual ((byte) 'l', f.data [3], "T8");
Assert.AreEqual ((byte) 'a', f.data [4], "T9");
}
[Test]
public void TestResponse_Chunked ()
{
FakeHttpWorkerRequest2 f;
HttpContext c = Cook (2, out f);
c.Response.Write ("a");
Assert.AreEqual (false, f.OutputProduced, "CT1");
c.Response.Flush ();
Assert.AreEqual (6, f.total, "CT2");
c.Response.Write ("Hola");
Assert.AreEqual (6, f.total, "CT3");
c.Response.Flush ();
}
[Test]
public void Status1 ()
{
FakeHttpWorkerRequest2 f;
HttpContext c = Cook (2, out f);
HttpResponse resp = c.Response;
resp.Status = "200 Lalala";
Assert.AreEqual (200, resp.StatusCode, "ST1");
Assert.AreEqual ("Lalala", resp.StatusDescription, "ST2");
resp.Status = "10000 La la la";
Assert.AreEqual (10000, resp.StatusCode, "ST3");
Assert.AreEqual ("La la la", resp.StatusDescription, "ST4");
resp.Status = "-1 La la la";
Assert.AreEqual (-1, resp.StatusCode, "ST5");
Assert.AreEqual ("La la la", resp.StatusDescription, "ST6");
resp.Status = "-200 La la la";
Assert.AreEqual (-200, resp.StatusCode, "ST7");
Assert.AreEqual ("La la la", resp.StatusDescription, "ST8");
resp.Status = "200 ";
Assert.AreEqual (200, resp.StatusCode, "ST7");
Assert.AreEqual ("", resp.StatusDescription, "ST8");
}
[Test]
public void Status2 ()
{
FakeHttpWorkerRequest2 f;
HttpContext c = Cook (2, out f);
HttpResponse resp = c.Response;
try {
resp.Status = "200";
Assert.Fail ("#1");
} catch (HttpException) {
}
}
[Test]
public void Status3 ()
{
FakeHttpWorkerRequest2 f;
HttpContext c = Cook (2, out f);
HttpResponse resp = c.Response;
try {
resp.Status = "200\t";
Assert.Fail ("#1");
} catch (HttpException) {
}
}
[Test]
public void Status4 ()
{
FakeHttpWorkerRequest2 f;
HttpContext c = Cook (2, out f);
HttpResponse resp = c.Response;
Assert.AreEqual (200, resp.StatusCode, "STT1");
Assert.AreEqual (HttpWorkerRequest.GetStatusDescription (200), resp.StatusDescription, "STT2");
resp.StatusCode = 400;
Assert.AreEqual (400, resp.StatusCode, "STT3");
Assert.AreEqual (HttpWorkerRequest.GetStatusDescription (400), resp.StatusDescription, "STT4");
resp.StatusDescription = "Something else";
Assert.AreEqual (400, resp.StatusCode, "STT5");
Assert.AreEqual ("Something else", resp.StatusDescription, "STT6");
resp.StatusDescription = null;
Assert.AreEqual (400, resp.StatusCode, "STT7");
Assert.AreEqual (HttpWorkerRequest.GetStatusDescription (400), resp.StatusDescription, "STT8");
}
//
// TODO: Add test for BinaryWrite and the various writes to check for Chunked Mode
//`
[Test]
public void SetCacheability ()
{
FakeHttpWorkerRequest2 f;
HttpContext c = Cook (1, out f);
//
// Basically the values from CacheControl are useless once Response.Cache is used
//
c.Response.Cache.SetCacheability (HttpCacheability.ServerAndNoCache);
Assert.AreEqual ("private", c.Response.CacheControl, "C1");
c.Response.Cache.SetCacheability (HttpCacheability.ServerAndPrivate);
Assert.AreEqual ("private", c.Response.CacheControl, "C2");
c.Response.Cache.SetCacheability (HttpCacheability.NoCache);
Assert.AreEqual ("private", c.Response.CacheControl, "C3");
c.Response.Cache.SetCacheability (HttpCacheability.Private);
Assert.AreEqual ("private", c.Response.CacheControl, "C4");
c.Response.Cache.SetCacheability (HttpCacheability.Server);
Assert.AreEqual ("private", c.Response.CacheControl, "C5");
c.Response.Cache.SetCacheability (HttpCacheability.Public);
Assert.AreEqual ("private", c.Response.CacheControl, "C6");
}
//
// Test the values allowed; .NET only documents private and public, but
// "no-cache" from the spec is also allowed
//
[Test]
public void CacheControl ()
{
FakeHttpWorkerRequest2 f;
HttpContext c = Cook (1, out f);
// Default value.
Assert.AreEqual ("private", c.Response.CacheControl, "D1");
c.Response.CacheControl = "private";
Assert.AreEqual ("private", c.Response.CacheControl, "D2");
c.Response.CacheControl = "public";
Assert.AreEqual ("public", c.Response.CacheControl, "D3");
c.Response.CacheControl = "no-cache";
Assert.AreEqual ("no-cache", c.Response.CacheControl, "D4");
c.Response.CacheControl = null;
Assert.AreEqual ("private", c.Response.CacheControl, "D5");
c.Response.CacheControl = "";
Assert.AreEqual ("private", c.Response.CacheControl, "D6");
}
//
// Just checks if the AddFileDepend* methods accept values, added after bug #342511
[Test]
public void AddFileDependencies ()
{
FakeHttpWorkerRequest2 f;
HttpContext c = Cook (1, out f);
ArrayList a = new ArrayList (1);
a.Add ("somefile.txt");
c.Response.AddFileDependencies (a);
string[] sa = new string [1] {"somefile.txt"};
c = Cook (1, out f);
c.Response.AddFileDependencies (sa);
c = Cook (1, out f);
c.Response.AddFileDependency ("somefile.txt");
}
[Test] // bug #488702
public void WriteHeaders ()
{
FakeHttpWorkerRequest2 f;
HttpContext c = Cook (2, out f);
HttpResponse resp = c.Response;
resp.CacheControl = "public";
resp.Cache.SetCacheability (HttpCacheability.NoCache);
resp.ContentType = "text/xml";
resp.AppendHeader ("Content-Disposition", "inline");
resp.AppendHeader ("Content-Type", "application/ms-word");
resp.AppendHeader ("Content-Length", "40");
resp.AppendHeader ("Transfer-Encoding", "compress");
resp.AppendHeader ("My-Custom-Header", "never");
resp.AppendHeader ("My-Custom-Header", "always");
Assert.AreEqual ("public", resp.CacheControl, "#A1");
Assert.AreEqual ("application/ms-word", resp.ContentType, "#A2");
Assert.AreEqual (0, f.KnownResponseHeaders.Count, "#A3");
Assert.AreEqual (0, f.UnknownResponseHeaders.Count, "#A4");
resp.Flush ();
KnownResponseHeader known;
Assert.AreEqual (6, f.KnownResponseHeaders.Count, "#B1");
known = (KnownResponseHeader)f.KnownResponseHeaders ["Content-Length"];
Assert.AreEqual (HttpWorkerRequest.HeaderContentLength, known.Index, "#B2");
Assert.AreEqual ("40", known.Value, "#B3");
known = (KnownResponseHeader)f.KnownResponseHeaders["Transfer-Encoding"];
Assert.AreEqual (HttpWorkerRequest.HeaderTransferEncoding, known.Index, "#B4");
Assert.AreEqual ("compress", known.Value, "#B5");
known = (KnownResponseHeader)f.KnownResponseHeaders["Cache-Control"];
Assert.AreEqual (HttpWorkerRequest.HeaderCacheControl, known.Index, "#B6");
Assert.AreEqual ("no-cache", known.Value, "#B7");
known = (KnownResponseHeader)f.KnownResponseHeaders["Pragma"];
Assert.AreEqual (HttpWorkerRequest.HeaderPragma, known.Index, "#B8");
Assert.AreEqual ("no-cache", known.Value, "#B9");
known = (KnownResponseHeader)f.KnownResponseHeaders["Expires"];
Assert.AreEqual (HttpWorkerRequest.HeaderExpires, known.Index, "#B10");
Assert.AreEqual ("-1", known.Value, "#B11");
known = (KnownResponseHeader)f.KnownResponseHeaders["Content-Type"];
Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B12");
Assert.AreEqual ("application/ms-word", known.Value, "#B13");
UnknownResponseHeader unknown;
Assert.AreEqual (3, f.UnknownResponseHeaders.Count, "#C1");
unknown = (UnknownResponseHeader) f.UnknownResponseHeaders ["X-AspNet-Version"];
Assert.AreEqual ("X-AspNet-Version", unknown.Name, "#C2");
Assert.AreEqual (Environment.Version.ToString (3), unknown.Value, "#C3");
unknown = (UnknownResponseHeader) f.UnknownResponseHeaders ["Content-Disposition"];
Assert.AreEqual ("Content-Disposition", unknown.Name, "#C4");
Assert.AreEqual ("inline", unknown.Value, "#C5");
ArrayList al = f.UnknownResponseHeaders ["My-Custom-Header"] as ArrayList;
Assert.AreEqual (2, al.Count, "#C6");
unknown = (UnknownResponseHeader) al [0];
Assert.AreEqual ("My-Custom-Header", unknown.Name, "#C7");
Assert.AreEqual ("never", unknown.Value, "#C8");
unknown = (UnknownResponseHeader) al [1];
Assert.AreEqual ("My-Custom-Header", unknown.Name, "#C9");
Assert.AreEqual ("always", unknown.Value, "#C10");
}
[Test] // pull #866
public void WriteHeadersNoCharset ()
{
FakeHttpWorkerRequest2 f;
HttpContext c = Cook (2, out f);
HttpResponse resp = c.Response;
resp.ContentType = "text/plain";
Assert.AreEqual ("text/plain", resp.ContentType, "#A1");
resp.Flush ();
KnownResponseHeader known;
AssertHelper.LessOrEqual (1, f.KnownResponseHeaders.Count, "#B1");
known = (KnownResponseHeader)f.KnownResponseHeaders ["Content-Type"];
Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B2");
Assert.AreEqual ("text/plain", known.Value, "#B3");
}
[Test] // pull #866
public void WriteHeadersHasCharset ()
{
FakeHttpWorkerRequest2 f;
HttpContext c = Cook (2, out f);
HttpResponse resp = c.Response;
resp.ContentType = "text/plain";
resp.Charset = "big5";
Assert.AreEqual ("text/plain", resp.ContentType, "#A1");
Assert.AreEqual ("big5", resp.Charset, "#A2");
resp.Flush ();
KnownResponseHeader known;
AssertHelper.LessOrEqual (1, f.KnownResponseHeaders.Count, "#B1");
known = (KnownResponseHeader)f.KnownResponseHeaders ["Content-Type"];
Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B2");
Assert.AreEqual ("text/plain; charset=big5", known.Value, "#B3");
}
[Test] // bug #485557
[Category ("NotWorking")] // bug #488702
public void ClearHeaders ()
{
FakeHttpWorkerRequest2 f;
HttpContext c = Cook (2, out f);
HttpResponse resp = c.Response;
resp.CacheControl = "public";
resp.Cache.SetCacheability (HttpCacheability.NoCache);
resp.ContentType = "text/xml";
resp.AppendHeader ("Content-Disposition", "inline");
resp.AppendHeader ("Content-Type", "application/ms-word");
resp.AppendHeader ("Content-Length", "40");
resp.AppendHeader ("Transfer-Encoding", "compress");
resp.AppendHeader ("My-Custom-Header", "never");
resp.AppendHeader ("My-Custom-Header", "always");
resp.ClearHeaders ();
Assert.AreEqual ("private", resp.CacheControl, "#A1");
Assert.AreEqual ("text/html", resp.ContentType, "#A2");
Assert.AreEqual (0, f.KnownResponseHeaders.Count, "#A3");
Assert.AreEqual (0, f.UnknownResponseHeaders.Count, "#A4");
resp.Flush ();
KnownResponseHeader known;
Assert.AreEqual (3, f.KnownResponseHeaders.Count, "#B1");
known = (KnownResponseHeader) f.KnownResponseHeaders ["Transfer-Encoding"];
Assert.AreEqual (HttpWorkerRequest.HeaderTransferEncoding, known.Index, "#B2");
Assert.AreEqual ("chunked", known.Value, "#B3");
known = (KnownResponseHeader) f.KnownResponseHeaders ["Cache-Control"];
Assert.AreEqual (HttpWorkerRequest.HeaderCacheControl, known.Index, "#B4");
Assert.AreEqual ("private", known.Value, "#B5");
known = (KnownResponseHeader) f.KnownResponseHeaders ["Content-Type"];
Assert.AreEqual (HttpWorkerRequest.HeaderContentType, known.Index, "#B6");
Assert.AreEqual ("text/html", known.Value, "#B7");
Assert.AreEqual (1, f.UnknownResponseHeaders.Count, "#C1");
UnknownResponseHeader unknown = (UnknownResponseHeader) f.UnknownResponseHeaders ["X-AspNet-Version"];
Assert.AreEqual ("X-AspNet-Version", unknown.Name, "#C2");
Assert.AreEqual (Environment.Version.ToString (3), unknown.Value, "#C3");
}
[Test]
public void Constructor ()
{
var resp = new HttpResponse (null);
Assert.IsNull (resp.Output, "#A1");
}
[Test]
public void RedirectPermanent ()
{
FakeHttpWorkerRequest2 request;
HttpContext context = Cook (1, out request);
AssertExtensions.Throws<ArgumentNullException> (() => {
context.Response.RedirectPermanent (null);
}, "#A1");
AssertExtensions.Throws<ArgumentException> (() => {
context.Response.RedirectPermanent ("http://invalid\nurl.com");
}, "#A2");
AssertExtensions.Throws<ArgumentNullException> (() => {
context.Response.RedirectPermanent (null, true);
}, "#A3");
AssertExtensions.Throws<ArgumentException> (() => {
context.Response.RedirectPermanent ("http://invalid\nurl.com", true);
}, "#A4");
}
[Test]
public void RedirectToRoute ()
{
var resp = new HttpResponse (new StringWriter ());
// Ho, ho, ho!
AssertExtensions.Throws<NullReferenceException> (() => {
resp.RedirectToRoute ("SomeRoute");
}, "#A1");
FakeHttpWorkerRequest2 request;
HttpContext context = Cook (1, out request);
// From RouteCollection.GetVirtualPath
AssertExtensions.Throws<ArgumentException> (() => {
context.Response.RedirectToRoute ("SomeRoute");
}, "#A2");
AssertExtensions.Throws<InvalidOperationException> (() => {
context.Response.RedirectToRoute (new { productId = "1", category = "widgets" });
}, "#A3");
}
[Test]
public void RemoveOutputCacheItem ()
{
AssertExtensions.Throws<ArgumentNullException> (() => {
HttpResponse.RemoveOutputCacheItem (null, "MyProvider");
}, "#A1");
AssertExtensions.Throws<ArgumentException> (() => {
HttpResponse.RemoveOutputCacheItem ("badPath", null);
}, "#A2");
Assert.IsNull (OutputCache.Providers, "#A3");
HttpResponse.RemoveOutputCacheItem ("/Path", null);
AssertExtensions.Throws<ProviderException> (() => {
HttpResponse.RemoveOutputCacheItem ("/Path", String.Empty);
}, "#A3");
AssertExtensions.Throws<ProviderException> (() => {
HttpResponse.RemoveOutputCacheItem ("/Path", "MyProvider");
}, "#A4");
}
[Test]
public void OutputSetter ()
{
FakeHttpWorkerRequest2 request;
HttpContext context = Cook (1, out request);
Assert.IsNotNull (context.Response.Output, "#A1");
context.Response.Output = null;
Assert.IsNull (context.Response.Output, "#A2");
// Classy...
AssertExtensions.Throws<NullReferenceException> (() => {
context.Response.Write ('t');
}, "#A3-1");
AssertExtensions.Throws<NullReferenceException> (() => {
context.Response.Write ((object) 5);
}, "#A3-2");
AssertExtensions.Throws<NullReferenceException> (() => {
context.Response.Write ("string");
}, "#A3-3");
AssertExtensions.Throws<NullReferenceException> (() => {
context.Response.Write (new char [] { '1' }, 0, 1);
}, "#A3-4");
AssertExtensions.Throws<NullReferenceException> (() => {
context.Response.Write ((object) null);
}, "#A3-5");
}
}
[TestFixture]
public class HttpResponseOutputStreamTest
{
FakeHttpWorkerRequest2 worker;
HttpContext context;
HttpResponse response;
Stream out_stream;
[SetUp]
public void Setup ()
{
context = Cook (2, out worker);
response = context.Response;
out_stream = response.OutputStream;
}
[TearDown]
public void TearDown ()
{
if (response != null)
response.Close ();
}
[Test]
public void CanRead ()
{
Assert.IsFalse (out_stream.CanRead, "#1");
out_stream.Close ();
Assert.IsFalse (out_stream.CanRead, "#2");
}
[Test]
public void CanSeek ()
{
Assert.IsFalse (out_stream.CanSeek, "#1");
out_stream.Close ();
Assert.IsFalse (out_stream.CanSeek, "#2");
}
[Test]
public void CanWrite ()
{
Assert.IsTrue (out_stream.CanWrite, "#1");
out_stream.Close ();
Assert.IsTrue (out_stream.CanWrite, "#2");
}
[Test]
public void Flush ()
{
byte [] buffer = Encoding.UTF8.GetBytes ("mono");
out_stream.Write (buffer, 0, buffer.Length);
out_stream.Flush ();
Assert.AreEqual (0, worker.data_len);
}
[Test]
public void Length ()
{
try {
long len = out_stream.Length;
Assert.Fail ("#1:" + len);
} catch (NotSupportedException ex) {
Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
}
}
[Test]
public void Position ()
{
try {
long pos = out_stream.Position;
Assert.Fail ("#A1:" + pos);
} catch (NotSupportedException ex) {
Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#A2");
Assert.IsNull (ex.InnerException, "#A3");
Assert.IsNotNull (ex.Message, "#A4");
}
try {
out_stream.Position = 0;
Assert.Fail ("#B1");
} catch (NotSupportedException ex) {
Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#B2");
Assert.IsNull (ex.InnerException, "#B3");
Assert.IsNotNull (ex.Message, "#B4");
}
}
[Test]
public void Read ()
{
byte [] buffer = new byte [5];
try {
out_stream.Read (buffer, 0, buffer.Length);
Assert.Fail ("#1");
} catch (NotSupportedException ex) {
Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
}
}
[Test]
public void Seek ()
{
try {
out_stream.Seek (5, SeekOrigin.Begin);
Assert.Fail ("#1");
} catch (NotSupportedException ex) {
Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
}
}
[Test]
public void SetLength ()
{
try {
out_stream.SetLength (5L);
Assert.Fail ("#1");
} catch (NotSupportedException ex) {
Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
}
}
[Test]
public void Write ()
{
byte [] buffer;
buffer = Encoding.UTF8.GetBytes ("mono");
out_stream.Write (buffer, 0, buffer.Length);
buffer = Encoding.UTF8.GetBytes ("just rocks!!");
out_stream.Write (buffer, 5, 6);
out_stream.Write (buffer, 0, 4);
Assert.IsFalse (worker.OutputProduced, "#1");
response.Flush ();
Assert.IsTrue (worker.OutputProduced, "#2");
string output = Encoding.UTF8.GetString (worker.data);
Assert.AreEqual ("e\r\nmonorocks!just\r\n", output);
}
[Test]
public void Write_Buffer_Null ()
{
try {
out_stream.Write ((byte []) null, 0, 0);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("buffer", ex.ParamName, "#5");
}
}
[Test]
public void Write_Count_Negative ()
{
byte [] buffer = new byte [] { 0x0a, 0x1f, 0x2d };
// offset < 0
try {
out_stream.Write (buffer, 1, -1);
Assert.Fail ("#1");
} catch (ArgumentOutOfRangeException ex) {
Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("count", ex.ParamName, "#5");
}
}
[Test]
public void Write_Count_Overflow ()
{
byte [] buffer;
buffer = Encoding.UTF8.GetBytes ("Mono");
out_stream.Write (buffer, 0, buffer.Length + 5);
buffer = Encoding.UTF8.GetBytes ("Just Rocks!!");
out_stream.Write (buffer, 5, buffer.Length - 2);
response.Flush ();
string output = Encoding.UTF8.GetString (worker.data);
Assert.AreEqual ("b\r\nMonoRocks!!\r\n", output);
}
[Test]
public void Write_Offset_Negative ()
{
byte [] buffer = new byte [] { 0x0a, 0x1f, 0x2d };
// offset < 0
try {
out_stream.Write (buffer, -1, 0);
Assert.Fail ("#1");
} catch (ArgumentOutOfRangeException ex) {
Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.AreEqual ("offset", ex.ParamName, "#5");
}
}
[Test]
public void Write_Offset_Overflow ()
{
byte [] buffer = new byte [] { 0x0a, 0x1f, 0x2d };
// offset == buffer length
try {
out_stream.Write (buffer, buffer.Length, 0);
Assert.Fail ("#A1");
} catch (ArgumentOutOfRangeException ex) {
Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
Assert.IsNull (ex.InnerException, "#A3");
Assert.IsNotNull (ex.Message, "#A4");
Assert.AreEqual ("offset", ex.ParamName, "#A5");
}
// offset > buffer length
try {
out_stream.Write (buffer, buffer.Length + 1, 0);
Assert.Fail ("#B1");
} catch (ArgumentOutOfRangeException ex) {
Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
Assert.IsNull (ex.InnerException, "#B3");
Assert.IsNotNull (ex.Message, "#B4");
Assert.AreEqual ("offset", ex.ParamName, "#B5");
}
response.Flush ();
Assert.AreEqual (0, worker.data_len);
}
[Test]
public void Write_Stream_Closed ()
{
byte [] buffer = Encoding.UTF8.GetBytes ("mono");
out_stream.Close ();
out_stream.Write (buffer, 0, buffer.Length);
response.Flush ();
string output = Encoding.UTF8.GetString (worker.data);
Assert.AreEqual ("4\r\nmono\r\n", output);
}
HttpContext Cook (int re, out FakeHttpWorkerRequest2 f)
{
f = new FakeHttpWorkerRequest2 (re);
return new HttpContext (f);
}
}
}