Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

312 lines
11 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Microsoft.TestCommon;
using Xunit;
using Assert = Microsoft.TestCommon.AssertEx;
namespace System.Net.Http
{
public class HttpMessageContentTests
{
private static readonly int iterations = 5;
private static void AddMessageHeaders(HttpHeaders headers)
{
headers.Add("N1", new string[] { "V1a", "V1b", "V1c", "V1d", "V1e" });
headers.Add("N2", "V2");
}
private static HttpRequestMessage CreateRequest(Uri requestUri, bool containsEntity)
{
HttpRequestMessage httpRequest = new HttpRequestMessage();
httpRequest.Method = new HttpMethod(ParserData.HttpMethod);
httpRequest.RequestUri = requestUri;
httpRequest.Version = new Version("1.2");
AddMessageHeaders(httpRequest.Headers);
if (containsEntity)
{
httpRequest.Content = new StringContent(ParserData.HttpMessageEntity);
}
return httpRequest;
}
private static HttpResponseMessage CreateResponse(bool containsEntity)
{
HttpResponseMessage httpResponse = new HttpResponseMessage();
httpResponse.StatusCode = ParserData.HttpStatus;
httpResponse.ReasonPhrase = ParserData.HttpReasonPhrase;
httpResponse.Version = new Version("1.2");
AddMessageHeaders(httpResponse.Headers);
if (containsEntity)
{
httpResponse.Content = new StringContent(ParserData.HttpMessageEntity);
}
return httpResponse;
}
private static string ReadContentAsync(HttpContent content)
{
Task task = content.LoadIntoBufferAsync();
task.Wait(TimeoutConstant.DefaultTimeout);
Assert.Equal(TaskStatus.RanToCompletion, task.Status);
return content.ReadAsStringAsync().Result;
}
private static void ValidateRequest(HttpContent content, bool containsEntity)
{
Assert.Equal(ParserData.HttpRequestMediaType, content.Headers.ContentType);
long? length = content.Headers.ContentLength;
Assert.NotNull(length);
string message = ReadContentAsync(content);
if (containsEntity)
{
Assert.Equal(ParserData.HttpRequestWithEntity.Length, length);
Assert.Equal(ParserData.HttpRequestWithEntity, message);
}
else
{
Assert.Equal(ParserData.HttpRequest.Length, length);
Assert.Equal(ParserData.HttpRequest, message);
}
}
private static void ValidateResponse(HttpContent content, bool containsEntity)
{
Assert.Equal(ParserData.HttpResponseMediaType, content.Headers.ContentType);
long? length = content.Headers.ContentLength;
Assert.NotNull(length);
string message = ReadContentAsync(content);
if (containsEntity)
{
Assert.Equal(ParserData.HttpResponseWithEntity.Length, length);
Assert.Equal(ParserData.HttpResponseWithEntity, message);
}
else
{
Assert.Equal(ParserData.HttpResponse.Length, length);
Assert.Equal(ParserData.HttpResponse, message);
}
}
[Fact]
public void TypeIsCorrect()
{
Assert.Type.HasProperties<HttpMessageContent, HttpContent>(TypeAssert.TypeProperties.IsPublicVisibleClass | TypeAssert.TypeProperties.IsDisposable);
}
[Fact]
public void RequestConstructor()
{
HttpRequestMessage request = new HttpRequestMessage();
HttpMessageContent instance = new HttpMessageContent(request);
Assert.NotNull(instance);
Assert.Same(request, instance.HttpRequestMessage);
Assert.Null(instance.HttpResponseMessage);
}
[Fact]
public void RequestConstructorThrowsOnNull()
{
Assert.ThrowsArgumentNull(() => { new HttpMessageContent((HttpRequestMessage)null); }, "httpRequest");
}
[Fact]
public void ResponseConstructor()
{
HttpResponseMessage response = new HttpResponseMessage();
HttpMessageContent instance = new HttpMessageContent(response);
Assert.NotNull(instance);
Assert.Same(response, instance.HttpResponseMessage);
Assert.Null(instance.HttpRequestMessage);
}
[Fact]
public void ResponseConstructorThrowsOnNull()
{
Assert.ThrowsArgumentNull(() => { new HttpMessageContent((HttpResponseMessage)null); }, "httpResponse");
}
[Fact]
public void SerializeRequest()
{
for (int cnt = 0; cnt < iterations; cnt++)
{
HttpRequestMessage request = CreateRequest(ParserData.HttpRequestUri, false);
HttpMessageContent instance = new HttpMessageContent(request);
ValidateRequest(instance, false);
}
}
[Fact]
public void SerializeRequestWithExistingHostHeader()
{
HttpRequestMessage request = CreateRequest(ParserData.HttpRequestUri, false);
string host = ParserData.HttpHostName;
request.Headers.Host = host;
HttpMessageContent instance = new HttpMessageContent(request);
string message = ReadContentAsync(instance);
Assert.Equal(ParserData.HttpRequestWithHost, message);
}
[Fact]
public void SerializeRequestMultipleTimes()
{
HttpRequestMessage request = CreateRequest(ParserData.HttpRequestUri, false);
HttpMessageContent instance = new HttpMessageContent(request);
for (int cnt = 0; cnt < iterations; cnt++)
{
ValidateRequest(instance, false);
}
}
[Fact]
public void SerializeResponse()
{
for (int cnt = 0; cnt < iterations; cnt++)
{
HttpResponseMessage response = CreateResponse(false);
HttpMessageContent instance = new HttpMessageContent(response);
ValidateResponse(instance, false);
}
}
[Fact]
public void SerializeResponseMultipleTimes()
{
HttpResponseMessage response = CreateResponse(false);
HttpMessageContent instance = new HttpMessageContent(response);
for (int cnt = 0; cnt < iterations; cnt++)
{
ValidateResponse(instance, false);
}
}
[Fact]
public void SerializeRequestWithEntity()
{
for (int cnt = 0; cnt < iterations; cnt++)
{
HttpRequestMessage request = CreateRequest(ParserData.HttpRequestUri, true);
HttpMessageContent instance = new HttpMessageContent(request);
ValidateRequest(instance, true);
}
}
[Fact]
public void SerializeRequestWithEntityMultipleTimes()
{
HttpRequestMessage request = CreateRequest(ParserData.HttpRequestUri, true);
HttpMessageContent instance = new HttpMessageContent(request);
for (int cnt = 0; cnt < iterations; cnt++)
{
ValidateRequest(instance, true);
}
}
[Fact]
public void SerializeResponseWithEntity()
{
for (int cnt = 0; cnt < iterations; cnt++)
{
HttpResponseMessage response = CreateResponse(true);
HttpMessageContent instance = new HttpMessageContent(response);
ValidateResponse(instance, true);
}
}
[Fact]
public void SerializeResponseWithEntityMultipleTimes()
{
HttpResponseMessage response = CreateResponse(true);
HttpMessageContent instance = new HttpMessageContent(response);
for (int cnt = 0; cnt < iterations; cnt++)
{
ValidateResponse(instance, true);
}
}
[Fact]
public void SerializeRequestAsync()
{
for (int cnt = 0; cnt < iterations; cnt++)
{
HttpRequestMessage request = CreateRequest(ParserData.HttpRequestUri, false);
HttpMessageContent instance = new HttpMessageContent(request);
ValidateRequest(instance, false);
}
}
[Fact]
public void SerializeResponseAsync()
{
for (int cnt = 0; cnt < iterations; cnt++)
{
HttpResponseMessage response = CreateResponse(false);
HttpMessageContent instance = new HttpMessageContent(response);
ValidateResponse(instance, false);
}
}
[Fact]
public void SerializeRequestWithPortAndQueryAsync()
{
for (int cnt = 0; cnt < iterations; cnt++)
{
HttpRequestMessage request = CreateRequest(ParserData.HttpRequestUriWithPortAndQuery, false);
HttpMessageContent instance = new HttpMessageContent(request);
string message = ReadContentAsync(instance);
Assert.Equal(ParserData.HttpRequestWithPortAndQuery, message);
}
}
[Fact]
public void SerializeRequestWithEntityAsync()
{
for (int cnt = 0; cnt < iterations; cnt++)
{
HttpRequestMessage request = CreateRequest(ParserData.HttpRequestUri, true);
HttpMessageContent instance = new HttpMessageContent(request);
ValidateRequest(instance, true);
}
}
[Fact]
public void SerializeResponseWithEntityAsync()
{
for (int cnt = 0; cnt < iterations; cnt++)
{
HttpResponseMessage response = CreateResponse(true);
HttpMessageContent instance = new HttpMessageContent(response);
ValidateResponse(instance, true);
}
}
[Fact]
public void DisposeInnerHttpRequestMessage()
{
HttpRequestMessage request = CreateRequest(ParserData.HttpRequestUri, false);
HttpMessageContent instance = new HttpMessageContent(request);
instance.Dispose();
Assert.ThrowsObjectDisposed(() => { request.Method = HttpMethod.Get; }, typeof(HttpRequestMessage).FullName);
}
[Fact]
public void DisposeInnerHttpResponseMessage()
{
HttpResponseMessage response = CreateResponse(false);
HttpMessageContent instance = new HttpMessageContent(response);
instance.Dispose();
Assert.ThrowsObjectDisposed(() => { response.StatusCode = HttpStatusCode.OK; }, typeof(HttpResponseMessage).FullName);
}
}
}