Skip to content

Enable MockHttpRequestFactory in non Net Framework targets #3757

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions sdk/test/UnitTests/Custom/Runtime/CustomResponses.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,13 @@ public static void SetResponse(
AmazonServiceClient client,
Func<HttpHandlerTests.MockHttpRequest, HttpWebResponse> responseCreator)
{
#if BCL
var requestFactory = new HttpHandlerTests.MockHttpRequestFactory();
requestFactory.ResponseCreator = responseCreator;
ReplaceHttpRequestHandler(client, requestFactory);
#else
throw new NotImplementedException();
#endif
}

public static void ReplaceHttpRequestHandler<T>(
Expand Down
51 changes: 41 additions & 10 deletions sdk/test/UnitTests/Custom/Runtime/HttpHandlerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using Amazon.Runtime.Internal.Util;
using System.Net;
using System.Reflection;
using System.Net.Http;

using Amazon.S3;
using Amazon.S3.Model;
Expand Down Expand Up @@ -167,7 +168,12 @@ private ExecutionContext CreateExecutionContextForListBuckets()
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; }

Expand Down Expand Up @@ -201,23 +207,29 @@ public class MockHttpRequest : IHttpRequest<Stream>
public Uri RequestUri { get; set; }

public Action GetResponseAction { get; set; }
public Func<MockHttpRequest, HttpWebResponse> ResponseCreator { 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;
#if BCL
this.ResponseCreator = responseCreator ?? CreateResponse;
#else
throw new NotImplementedException();
#endif
}

#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.
Expand All @@ -227,10 +239,22 @@ private HttpWebResponse CreateResponse(MockHttpRequest request)
if (response.StatusCode >= HttpStatusCode.OK && response.StatusCode <= (HttpStatusCode)299)
return response;
else
throw new HttpErrorResponseException(new HttpWebRequestResponseData(response));
}
#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;
Expand All @@ -250,14 +274,21 @@ public Stream GetRequestContent()

public Amazon.Runtime.Internal.Transform.IWebResponseData GetResponse()
{
#if BCL
if (this.GetResponseAction!=null)
this.GetResponseAction();

var response = ResponseCreator(this);
#if BCL
return new HttpWebRequestResponseData(response);
#else
throw new NotImplementedException();
var instance = Activator.CreateInstance(
typeof(HttpClientResponseData),
BindingFlags.Instance | BindingFlags.NonPublic,
binder: null,
args: new[] { response },
culture: null
);
return instance as HttpClientResponseData;
#endif
}

Expand Down
28 changes: 27 additions & 1 deletion sdk/test/UnitTests/Custom/TestTools/MockWebResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@
using System.Net;
using System.Reflection;
using System.IO;
using System.Net.Http;

namespace AWSSDK.UnitTests
{
public class MockWebResponse
{
#if NETFRAMEWORK
public static HttpWebResponse CreateFromResource(string resourceName)
{
var rawResponse = Utils.GetResourceText(resourceName);
Expand All @@ -21,9 +23,33 @@ public static HttpWebResponse CreateFromResource(string resourceName)

return Create(statusCode, response.Headers, response.Body);
}
#else
public static HttpResponseMessage CreateFromResource(string resourceName)
{
var rawResponse = Utils.GetResourceText(resourceName);

var response = ParseRawReponse(rawResponse);
var statusCode = ParseStatusCode(response.StatusLine);
var httpResponseMessage = new HttpResponseMessage(statusCode);

if (response.Headers != null)
{
foreach (var header in response.Headers)
{
httpResponseMessage.Headers.TryAddWithoutValidation(header.Key, header.Value);
}
}

var body = response.Body ?? string.Empty;
var responseBodyStream = Utils.CreateStreamFromString(body);

httpResponseMessage.Content = new StreamContent(responseBodyStream);
return httpResponseMessage;
}
#endif

public static HttpWebResponse Create(HttpStatusCode statusCode,
IDictionary<string,string> headers, string body = null)
IDictionary<string, string> headers, string body = null)
{
var type = typeof(HttpWebResponse);
var assembly = Assembly.GetAssembly(type);
Expand Down