-
Notifications
You must be signed in to change notification settings - Fork 865
/
Copy pathHttpHandlerTests.cs
387 lines (325 loc) · 14.5 KB
/
HttpHandlerTests.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Amazon.Runtime;
using System.IO;
using AWSSDK_DotNet.UnitTests;
using Amazon.Runtime.Internal.Util;
using System.Net;
using System.Reflection;
using System.Net.Http;
using Amazon.S3;
using Amazon.S3.Model;
using Amazon.S3.Model.Internal.MarshallTransformations;
using Amazon.Runtime.Internal.Transform;
using Amazon.Runtime.Internal;
using Amazon.Runtime.Internal.Auth;
namespace AWSSDK.UnitTests
{
[TestClass]
public class HttpHandlerTests
{
static object callbackSender = new object();
[TestMethod][TestCategory("UnitTest")]
[TestCategory("Runtime")]
#if !BCL
[Ignore]
#endif
public void TestSuccessfulCall()
{
var factory = new MockHttpRequestFactory();
var httpHandler = new HttpHandler<Stream>(factory, callbackSender);
var runtimePipeline = new RuntimePipeline(httpHandler);
var listBucketsRequest = new ListBucketsRequest();
var executionContext = CreateExecutionContextForListBuckets();
httpHandler.InvokeSync(executionContext);
Assert.IsNotNull(executionContext.ResponseContext.HttpResponse);
var httpRequest = factory.LastCreatedRequest;
Assert.AreEqual("GET",httpRequest.Method);
Assert.IsTrue(httpRequest.IsConfigureRequestCalled);
Assert.IsTrue(httpRequest.IsSetRequestHeadersCalled);
Assert.IsTrue(httpRequest.IsDisposed);
Assert.IsFalse(httpRequest.IsAborted);
}
[TestMethod][TestCategory("UnitTest")]
[TestCategory("Runtime")]
#if !BCL
[Ignore]
#endif
public void TestErrorCall()
{
var factory = new MockHttpRequestFactory
{
GetResponseAction = () => { throw new IOException(); }
};
var httpHandler = new HttpHandler<Stream>(factory, callbackSender);
var runtimePipeline = new RuntimePipeline(httpHandler);
var executionContext = CreateExecutionContextForListBuckets();
Utils.AssertExceptionExpected(() =>
{
httpHandler.InvokeSync(executionContext);
}, typeof(IOException));
var httpRequest = factory.LastCreatedRequest;
Assert.AreEqual("GET", httpRequest.Method);
Assert.IsTrue(httpRequest.IsConfigureRequestCalled);
Assert.IsTrue(httpRequest.IsSetRequestHeadersCalled);
Assert.IsTrue(httpRequest.IsDisposed);
}
#if BCL
[TestMethod][TestCategory("UnitTest")]
[TestCategory("Runtime")]
[TestCategory(@"Runtime\AsyncNetFramework")]
public async Task TestSuccessfulAsyncCall()
{
var factory = new MockHttpRequestFactory();
var httpHandler = new HttpHandler<Stream>(factory, callbackSender);
var runtimePipeline = new RuntimePipeline(httpHandler);
var listBucketsRequest = new ListBucketsRequest();
var executionContext = CreateExecutionContextForListBuckets();
await httpHandler.InvokeAsync<ListBucketsResponse>(executionContext);
Assert.IsNotNull(executionContext.ResponseContext.HttpResponse);
var httpRequest = factory.LastCreatedRequest;
Assert.AreEqual("GET", httpRequest.Method);
Assert.IsTrue(httpRequest.IsConfigureRequestCalled);
Assert.IsTrue(httpRequest.IsSetRequestHeadersCalled);
Assert.IsTrue(httpRequest.IsDisposed);
Assert.IsFalse(httpRequest.IsAborted);
}
[TestMethod][TestCategory("UnitTest")]
[TestCategory("Runtime")]
[TestCategory(@"Runtime\AsyncNetFramework")]
public async Task TestErrorAsyncCall()
{
var factory = new MockHttpRequestFactory
{
GetResponseAction = () => { throw new IOException(); }
};
var httpHandler = new HttpHandler<Stream>(factory, callbackSender);
var runtimePipeline = new RuntimePipeline(httpHandler);
var executionContext = CreateExecutionContextForListBuckets();
await Utils.AssertExceptionExpectedAsync(() =>
{
return httpHandler.InvokeAsync<AmazonWebServiceResponse>(executionContext);
}, typeof(IOException));
var httpRequest = factory.LastCreatedRequest;
Assert.AreEqual("GET", httpRequest.Method);
Assert.IsTrue(httpRequest.IsConfigureRequestCalled);
Assert.IsTrue(httpRequest.IsSetRequestHeadersCalled);
Assert.IsTrue(httpRequest.IsDisposed);
}
[TestMethod]
[TestCategory("UnitTest")]
[TestCategory("Runtime")]
public void TestStoringContextAttributes()
{
var requestContext = new RequestContext(true, new NullSigner());
requestContext.ContextAttributes["foo"] = "bar";
Assert.AreEqual("bar", requestContext.ContextAttributes["foo"]);
}
#endif
private ExecutionContext CreateExecutionContextForListBuckets()
{
var listBucketsRequest = new ListBucketsRequest();
var executionContext = new ExecutionContext(
new RequestContext(true, new NullSigner())
{
ClientConfig = new AmazonS3Config(),
Marshaller = new ListBucketsRequestMarshaller(),
OriginalRequest = listBucketsRequest,
Request = new ListBucketsRequestMarshaller().Marshall(listBucketsRequest),
Unmarshaller = new ListBucketsResponseUnmarshaller()
},
new ResponseContext()
);
// Create and set the internal ServiceMetadata via reflection
var serviceMetaData = Assembly.GetAssembly(executionContext.GetType()).CreateInstance("Amazon.Runtime.Internal.ServiceMetadata");
executionContext.RequestContext.GetType().GetProperty("ServiceMetaData").SetValue(executionContext.RequestContext, serviceMetaData);
executionContext.RequestContext.Request.Endpoint = new Uri(@"http://ListBuckets");
return executionContext;
}
/// <summary>
/// Not thread safe, initialize once for each test.
/// </summary>
public class MockHttpRequestFactory : IHttpRequestFactory<Stream>
{
public Action GetResponseAction { get; set; }
#if BCL
public Func<MockHttpRequest, HttpWebResponse> ResponseCreator { get; set; }
#else
public Func<MockHttpRequest, HttpResponseMessage> ResponseCreator { get; set; }
#endif
public MockHttpRequest LastCreatedRequest { get; private set; }
public IHttpRequest<Stream> CreateHttpRequest(Uri requestUri)
{
this.LastCreatedRequest = new MockHttpRequest(requestUri, this.GetResponseAction, this.ResponseCreator);
return this.LastCreatedRequest;
}
public void Dispose()
{
}
}
public class MockHttpRequest : IHttpRequest<Stream>
{
private Stream requestStream = null;
public bool IsDisposed { get; set; }
public bool IsAborted { get; set; }
public bool IsConfigureRequestCalled { get; set; }
public bool IsSetRequestHeadersCalled { get; set; }
public bool IsGetRequestContentCalled { get; set; }
public string Method { get; set; }
public Uri RequestUri { get; set; }
public Action GetResponseAction { get; set; }
public Version HttpProtocolVersion { get; set; }
#if BCL
public Func<MockHttpRequest, HttpWebResponse> ResponseCreator { get; set; }
public MockHttpRequest(Uri requestUri, Action action, Func<MockHttpRequest, HttpWebResponse> responseCreator = null)
#else
public Func<MockHttpRequest, HttpResponseMessage> ResponseCreator { get; set; }
public MockHttpRequest(Uri requestUri, Action action, Func<MockHttpRequest, HttpResponseMessage> responseCreator = null)
#endif
{
this.RequestUri = requestUri;
this.GetResponseAction = action;
this.ResponseCreator = responseCreator ?? CreateResponse;
}
#if BCL
private HttpWebResponse CreateResponse(MockHttpRequest request)
#else
private HttpResponseMessage CreateResponse(MockHttpRequest request)
#endif
{
// Extract the last segment of the URI, this is the custom URI
// sent by the unit tests.
var resourceName = request.RequestUri.Host.Split('.').Last();
var response = MockWebResponse.CreateFromResource(resourceName);
if (response.StatusCode >= HttpStatusCode.OK && response.StatusCode <= (HttpStatusCode)299)
return response;
else
#if BCL
throw new HttpErrorResponseException(new HttpWebRequestResponseData(response));
#else
{
var instance = Activator.CreateInstance(
typeof(HttpClientResponseData),
BindingFlags.Instance | BindingFlags.NonPublic,
binder: null,
args: new[] { response },
culture: null
);
throw new HttpErrorResponseException(instance as HttpClientResponseData);
}
#endif
}
public void ConfigureRequest(IRequestContext requestContext)
{
this.IsConfigureRequestCalled = true;
}
public void SetRequestHeaders(IDictionary<string, string> headers)
{
this.IsSetRequestHeadersCalled = true;
}
public Stream GetRequestContent()
{
this.IsGetRequestContentCalled = true;
requestStream = new MemoryStream();
return requestStream;
}
public Amazon.Runtime.Internal.Transform.IWebResponseData GetResponse()
{
if (this.GetResponseAction!=null)
this.GetResponseAction();
var response = ResponseCreator(this);
#if BCL
return new HttpWebRequestResponseData(response);
#else
var instance = Activator.CreateInstance(
typeof(HttpClientResponseData),
BindingFlags.Instance | BindingFlags.NonPublic,
binder: null,
args: new[] { response },
culture: null
);
return instance as HttpClientResponseData;
#endif
}
/// <inheritdoc/>
public IHttpRequestStreamHandle SetupHttpRequestStreamPublisher(IDictionary<string, string> contentHeaders, IHttpRequestStreamPublisher publisher)
{
throw new NotImplementedException();
}
public void WriteToRequestBody(Stream requestContent, Stream contentStream,
IDictionary<string, string> contentHeaders, IRequestContext requestContext)
{
Assert.IsNotNull(requestContent);
Assert.IsNotNull(contentStream);
Assert.IsNotNull(contentHeaders);
Assert.IsNotNull(requestContext);
}
public void WriteToRequestBody(Stream requestContent, byte[] content, IDictionary<string, string> contentHeaders)
{
Assert.IsNotNull(requestContent);
Assert.IsNotNull(content);
Assert.IsNotNull(contentHeaders);
}
public void Abort()
{
this.IsAborted = true;
}
#if BCL
public Task WriteToRequestBodyAsync(Stream requestContent, Stream contentStream,
IDictionary<string, string> contentHeaders, IRequestContext requestContext)
{
Assert.IsNotNull(requestContent);
Assert.IsNotNull(contentStream);
Assert.IsNotNull(contentHeaders);
Assert.IsNotNull(requestContext);
return Task.FromResult(0);
}
public Task WriteToRequestBodyAsync(Stream requestContent, byte[] content, IDictionary<string, string> contentHeaders, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))
{
Assert.IsNotNull(requestContent);
Assert.IsNotNull(content);
Assert.IsNotNull(contentHeaders);
return Task.FromResult(0);
}
public Task<Stream> GetRequestContentAsync()
{
return GetRequestContentAsync(System.Threading.CancellationToken.None);
}
public Task<Stream> GetRequestContentAsync(System.Threading.CancellationToken cancellationToken)
{
return Task.FromResult<Stream>(new MemoryStream());
}
public Task<IWebResponseData> GetResponseAsync(System.Threading.CancellationToken cancellationToken)
{
if (this.GetResponseAction != null)
this.GetResponseAction();
return Task.FromResult<IWebResponseData>(new HttpWebRequestResponseData(
MockWebResponse.CreateFromResource(this.RequestUri.Host)
as HttpWebResponse));
}
#endif
public void Dispose()
{
this.IsDisposed = true;
}
public Stream SetupProgressListeners(Stream originalStream, long progressUpdateInterval, object sender, EventHandler<StreamTransferProgressArgs> callback)
{
return originalStream;
}
#if !BCL
public Task<Stream> GetRequestContentAsync()
{
throw new NotImplementedException();
}
public Task<IWebResponseData> GetResponseAsync(System.Threading.CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
#endif
}
}
}