diff options
author | Justin Clark-Casey (justincc) | 2013-07-11 23:02:30 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2013-07-11 23:02:30 +0100 |
commit | 44e9849ed1190dbc29ffa97fa5df286dc9794edb (patch) | |
tree | 427e9033c87ffa2bbedb176acb342c1677d153e0 /OpenSim/Region/CoreModules/Scripting/HttpRequest/Tests | |
parent | Merge branch 'master' of ssh://opensimulator.org/var/git/opensim (diff) | |
download | opensim-SC-44e9849ed1190dbc29ffa97fa5df286dc9794edb.zip opensim-SC-44e9849ed1190dbc29ffa97fa5df286dc9794edb.tar.gz opensim-SC-44e9849ed1190dbc29ffa97fa5df286dc9794edb.tar.bz2 opensim-SC-44e9849ed1190dbc29ffa97fa5df286dc9794edb.tar.xz |
Fix regression where llHTTPRequests which did not get an OK response returned 499 and the exception message in the http_response event rather than the actual response code and body.
This was a regression since commit 831e4c3 (Thu Apr 4 00:36:15 2013)
This commit also adds a regression test for this case, though this currently only works with Mono
This aims to address http://opensimulator.org/mantis/view.php?id=6704
Diffstat (limited to 'OpenSim/Region/CoreModules/Scripting/HttpRequest/Tests')
-rw-r--r-- | OpenSim/Region/CoreModules/Scripting/HttpRequest/Tests/ScriptsHttpRequestsTests.cs | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/OpenSim/Region/CoreModules/Scripting/HttpRequest/Tests/ScriptsHttpRequestsTests.cs b/OpenSim/Region/CoreModules/Scripting/HttpRequest/Tests/ScriptsHttpRequestsTests.cs new file mode 100644 index 0000000..f638f91 --- /dev/null +++ b/OpenSim/Region/CoreModules/Scripting/HttpRequest/Tests/ScriptsHttpRequestsTests.cs | |||
@@ -0,0 +1,201 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.IO; | ||
31 | using System.Net; | ||
32 | using System.Reflection; | ||
33 | using System.Runtime.Serialization; | ||
34 | using System.Text; | ||
35 | using System.Threading; | ||
36 | using log4net.Config; | ||
37 | using NUnit.Framework; | ||
38 | using OpenMetaverse; | ||
39 | using OpenMetaverse.Assets; | ||
40 | using OpenSim.Framework; | ||
41 | using OpenSim.Region.CoreModules.Scripting.HttpRequest; | ||
42 | using OpenSim.Region.Framework.Scenes; | ||
43 | using OpenSim.Tests.Common; | ||
44 | using OpenSim.Tests.Common.Mock; | ||
45 | |||
46 | namespace OpenSim.Region.CoreModules.Scripting.HttpRequest.Tests | ||
47 | { | ||
48 | class TestWebRequestCreate : IWebRequestCreate | ||
49 | { | ||
50 | public TestWebRequest NextRequest { get; set; } | ||
51 | |||
52 | public WebRequest Create(Uri uri) | ||
53 | { | ||
54 | // NextRequest.RequestUri = uri; | ||
55 | |||
56 | return NextRequest; | ||
57 | |||
58 | // return new TestWebRequest(new SerializationInfo(typeof(TestWebRequest), new FormatterConverter()), new StreamingContext()); | ||
59 | } | ||
60 | } | ||
61 | |||
62 | class TestWebRequest : WebRequest | ||
63 | { | ||
64 | public override string ContentType { get; set; } | ||
65 | public override string Method { get; set; } | ||
66 | |||
67 | public Func<IAsyncResult, WebResponse> OnEndGetResponse { get; set; } | ||
68 | |||
69 | public TestWebRequest() : base() | ||
70 | { | ||
71 | // Console.WriteLine("created"); | ||
72 | } | ||
73 | |||
74 | // public TestWebRequest(SerializationInfo serializationInfo, StreamingContext streamingContext) | ||
75 | // : base(serializationInfo, streamingContext) | ||
76 | // { | ||
77 | // Console.WriteLine("created"); | ||
78 | // } | ||
79 | |||
80 | public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state) | ||
81 | { | ||
82 | // Console.WriteLine("bish"); | ||
83 | TestAsyncResult tasr = new TestAsyncResult(); | ||
84 | callback(tasr); | ||
85 | |||
86 | return tasr; | ||
87 | } | ||
88 | |||
89 | public override WebResponse EndGetResponse(IAsyncResult asyncResult) | ||
90 | { | ||
91 | // Console.WriteLine("bosh"); | ||
92 | return OnEndGetResponse(asyncResult); | ||
93 | } | ||
94 | } | ||
95 | |||
96 | class TestHttpWebResponse : HttpWebResponse | ||
97 | { | ||
98 | public string Response { get; set; } | ||
99 | |||
100 | public TestHttpWebResponse(SerializationInfo serializationInfo, StreamingContext streamingContext) | ||
101 | : base(serializationInfo, streamingContext) {} | ||
102 | |||
103 | public override Stream GetResponseStream() | ||
104 | { | ||
105 | return new MemoryStream(Encoding.UTF8.GetBytes(Response)); | ||
106 | } | ||
107 | } | ||
108 | |||
109 | class TestAsyncResult : IAsyncResult | ||
110 | { | ||
111 | WaitHandle m_wh = new ManualResetEvent(true); | ||
112 | |||
113 | object IAsyncResult.AsyncState | ||
114 | { | ||
115 | get { | ||
116 | throw new System.NotImplementedException (); | ||
117 | } | ||
118 | } | ||
119 | |||
120 | WaitHandle IAsyncResult.AsyncWaitHandle | ||
121 | { | ||
122 | get { return m_wh; } | ||
123 | } | ||
124 | |||
125 | bool IAsyncResult.CompletedSynchronously | ||
126 | { | ||
127 | get { return false; } | ||
128 | } | ||
129 | |||
130 | bool IAsyncResult.IsCompleted | ||
131 | { | ||
132 | get { return true; } | ||
133 | } | ||
134 | } | ||
135 | |||
136 | /// <summary> | ||
137 | /// Test script http request code. | ||
138 | /// </summary> | ||
139 | /// <remarks> | ||
140 | /// This class uses some very hacky workarounds in order to mock HttpWebResponse which are Mono dependent (though | ||
141 | /// alternative code can be written to make this work for Windows). However, the value of being able to | ||
142 | /// regression test this kind of code is very high. | ||
143 | /// </remarks> | ||
144 | [TestFixture] | ||
145 | public class ScriptsHttpRequestsTests : OpenSimTestCase | ||
146 | { | ||
147 | /// <summary> | ||
148 | /// Test what happens when we get a 404 response from a call. | ||
149 | /// </summary> | ||
150 | [Test] | ||
151 | public void Test404Response() | ||
152 | { | ||
153 | TestHelpers.InMethod(); | ||
154 | TestHelpers.EnableLogging(); | ||
155 | |||
156 | if (!Util.IsPlatformMono) | ||
157 | Assert.Ignore("Ignoring test since can only currently run on Mono"); | ||
158 | |||
159 | string rawResponse = "boom"; | ||
160 | |||
161 | TestWebRequestCreate twrc = new TestWebRequestCreate(); | ||
162 | |||
163 | TestWebRequest twr = new TestWebRequest(); | ||
164 | //twr.OnEndGetResponse += ar => new TestHttpWebResponse(null, new StreamingContext()); | ||
165 | twr.OnEndGetResponse += ar => | ||
166 | { | ||
167 | SerializationInfo si = new SerializationInfo(typeof(HttpWebResponse), new FormatterConverter()); | ||
168 | StreamingContext sc = new StreamingContext(); | ||
169 | // WebHeaderCollection headers = new WebHeaderCollection(); | ||
170 | // si.AddValue("m_HttpResponseHeaders", headers); | ||
171 | si.AddValue("uri", new Uri("test://arrg")); | ||
172 | // si.AddValue("m_Certificate", null); | ||
173 | si.AddValue("version", HttpVersion.Version11); | ||
174 | si.AddValue("statusCode", HttpStatusCode.NotFound); | ||
175 | si.AddValue("contentLength", 0); | ||
176 | si.AddValue("method", "GET"); | ||
177 | si.AddValue("statusDescription", "Not Found"); | ||
178 | si.AddValue("contentType", null); | ||
179 | si.AddValue("cookieCollection", new CookieCollection()); | ||
180 | |||
181 | TestHttpWebResponse thwr = new TestHttpWebResponse(si, sc); | ||
182 | thwr.Response = rawResponse; | ||
183 | |||
184 | throw new WebException("no message", null, WebExceptionStatus.ProtocolError, thwr); | ||
185 | }; | ||
186 | |||
187 | twrc.NextRequest = twr; | ||
188 | |||
189 | WebRequest.RegisterPrefix("test", twrc); | ||
190 | HttpRequestClass hr = new HttpRequestClass(); | ||
191 | hr.Url = "test://something"; | ||
192 | hr.SendRequest(); | ||
193 | |||
194 | while (!hr.Finished) | ||
195 | Thread.Sleep(100); | ||
196 | |||
197 | Assert.That(hr.Status, Is.EqualTo((int)HttpStatusCode.NotFound)); | ||
198 | Assert.That(hr.ResponseBody, Is.EqualTo(rawResponse)); | ||
199 | } | ||
200 | } | ||
201 | } \ No newline at end of file | ||