5 using System.Web.UI.WebControls;
\r
8 using System.Configuration;
\r
9 using System.Web.Configuration;
\r
10 using System.Collections;
\r
11 using System.Runtime.Remoting.Messaging;
\r
12 using System.Reflection;
\r
13 using System.Threading;
14 using System.Runtime.Serialization;
15 using System.Runtime.Serialization.Formatters.Binary;
\r
16 using System.Runtime.Serialization.Formatters.Soap;
\r
17 using System.Collections.Specialized;
\r
19 namespace MonoTests.SystemWeb.Framework
\r
21 internal class MyHost : MarshalByRefObject
\r
23 public const string INVOKER_HEADER = "NunitWebInvoker";
\r
24 public const string USER_HEADER = "NunitWebUserData";
\r
25 public const string EXCEPTION_HEADER = "NunitWebException";
\r
26 private const string CURRENT_WEBTEST = "NunitWebCurrentTest";
\r
27 public AppDomain AppDomain
\r
28 { get { return AppDomain.CurrentDomain; } }
30 public static string Serialize (object o)
34 using (MemoryStream ms = new MemoryStream ()) {
\r
35 SoapFormatter f = new SoapFormatter ();
\r
36 f.Serialize (ms, o);
\r
37 return HttpUtility.UrlEncode (ms.ToArray());
\r
41 public static object Deserialize (string s)
43 if (s == null || s == string.Empty)
45 using (MemoryStream ms = new MemoryStream ()) {
\r
46 byte [] ba = HttpUtility.UrlDecodeToBytes (s);
\r
47 ms.Write (ba, 0, ba.Length);
\r
49 SoapFormatter b = new SoapFormatter ();
\r
51 return b.Deserialize (ms);
\r
53 catch (Exception e) {
\r
59 public WebTest Run (WebTest t)
61 NameValueCollection headers = new NameValueCollection ();
\r
62 headers.Add (INVOKER_HEADER, Serialize (t.Invoker));
\r
63 headers.Add (USER_HEADER, Serialize (t.UserData));
\r
64 WebRequest wr = t.Request.CreateWebRequest (
\r
66 new Uri ("http://localhost:8090/MainsoftWebApp20/"),
\r
68 new Uri ("http://localhost:59598/NunitWebTest/"),
\r
73 WebResponse response = null;
\r
75 response = wr.GetResponse ();
\r
77 Exception e = (Exception) Deserialize (
\r
78 response.Headers[EXCEPTION_HEADER]);
\r
80 RethrowException (e);
\r
82 t.UserData = Deserialize (response.Headers[USER_HEADER]);
\r
83 t.Response = t.Request.ExtractResponse (response);
\r
85 catch (WebException we) {
\r
86 StreamReader sr = new StreamReader (we.Response.GetResponseStream ());
\r
87 throw new WebException (we.Message + Environment.NewLine
\r
88 + "Response:" + Environment.NewLine + sr.ReadToEnd (), we);
\r
91 if (response != null)
\r
98 public void SendHeaders (WebTest t)
\r
100 HttpContext.Current.Response.AppendHeader (USER_HEADER, Serialize(t.UserData));
\r
103 private static void RethrowException (Exception inner)
\r
106 try { //Try create a similar exception and keep the inner intact
\r
107 outer = (Exception) Activator.CreateInstance (inner.GetType (),
\r
108 new object []{inner.ToString (), inner});
\r
110 catch { //Failed to create a similar, fallback to the inner, ruining the call stack
\r
116 public static WebTest GetCurrentTest ()
\r
118 WebTest wt = HttpContext.Current.Items[CURRENT_WEBTEST] as WebTest;
\r
121 wt = new WebTest ();
\r
122 wt.Invoker = (BaseInvoker) Deserialize (
\r
123 HttpContext.Current.Request.Headers [INVOKER_HEADER]);
\r
124 if (wt.Invoker == null)
\r
126 wt.UserData = Deserialize (
\r
127 HttpContext.Current.Request.Headers [USER_HEADER]);
\r
128 HttpContext.Current.Items[CURRENT_WEBTEST] = wt;
\r
132 public void RegisterException (Exception ex)
\r
136 if (HttpContext.Current.Items[EXCEPTION_HEADER] != null)
\r
137 return; //register only the first exception
\r
138 HttpContext.Current.Response.AddHeader (EXCEPTION_HEADER,
\r
140 HttpContext.Current.Items[EXCEPTION_HEADER] = ex;
\r