Add new MessageBody tests and refactor some existing ones.

- No need to test with FIN since we consider that an error
- Consolidate HTTP/1.0 and HTTP/1.1 tests that were the same except for the HTTP version
- Add a few new tests
This commit is contained in:
Cesar Blum Silveira 2017-04-07 20:26:34 -07:00 committed by GitHub
parent 53b0eea2ec
commit 27584dc620
2 changed files with 106 additions and 77 deletions

View File

@ -9,7 +9,6 @@ using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http; using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
using Microsoft.Extensions.Internal; using Microsoft.Extensions.Internal;
using Moq; using Moq;
@ -18,146 +17,179 @@ using Xunit.Sdk;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
{ {
/// <summary>
/// Summary description for MessageBodyTests
/// </summary>
public class MessageBodyTests public class MessageBodyTests
{ {
[Fact] [Theory]
public void Http10ConnectionClose() [InlineData(HttpVersion.Http10)]
[InlineData(HttpVersion.Http11)]
public void CanReadFromContentLength(HttpVersion httpVersion)
{ {
using (var input = new TestInput()) using (var input = new TestInput())
{ {
var body = MessageBody.For(HttpVersion.Http10, new FrameRequestHeaders { HeaderContentLength = "5" }, input.FrameContext); var body = MessageBody.For(httpVersion, new FrameRequestHeaders { HeaderContentLength = "5" }, input.FrameContext);
var stream = new FrameRequestStream(); var stream = new FrameRequestStream();
stream.StartAcceptingReads(body); stream.StartAcceptingReads(body);
input.Add("Hello", true); input.Add("Hello");
var buffer1 = new byte[1024]; var buffer = new byte[1024];
var count1 = stream.Read(buffer1, 0, 1024);
AssertASCII("Hello", new ArraySegment<byte>(buffer1, 0, 5));
var buffer2 = new byte[1024]; var count = stream.Read(buffer, 0, buffer.Length);
var count2 = stream.Read(buffer2, 0, 1024); Assert.Equal(5, count);
Assert.Equal(0, count2); AssertASCII("Hello", new ArraySegment<byte>(buffer, 0, count));
count = stream.Read(buffer, 0, buffer.Length);
Assert.Equal(0, count);
}
}
[Theory]
[InlineData(HttpVersion.Http10)]
[InlineData(HttpVersion.Http11)]
public async Task CanReadAsyncFromContentLength(HttpVersion httpVersion)
{
using (var input = new TestInput())
{
var body = MessageBody.For(httpVersion, new FrameRequestHeaders { HeaderContentLength = "5" }, input.FrameContext);
var stream = new FrameRequestStream();
stream.StartAcceptingReads(body);
input.Add("Hello");
var buffer = new byte[1024];
var count = await stream.ReadAsync(buffer, 0, buffer.Length);
Assert.Equal(5, count);
AssertASCII("Hello", new ArraySegment<byte>(buffer, 0, count));
count = await stream.ReadAsync(buffer, 0, buffer.Length);
Assert.Equal(0, count);
} }
} }
[Fact] [Fact]
public async Task Http10ConnectionCloseAsync() public void CanReadFromChunkedEncoding()
{ {
using (var input = new TestInput()) using (var input = new TestInput())
{ {
var body = MessageBody.For(HttpVersion.Http10, new FrameRequestHeaders { HeaderContentLength = "5" }, input.FrameContext); var body = MessageBody.For(HttpVersion.Http11, new FrameRequestHeaders { HeaderTransferEncoding = "chunked" }, input.FrameContext);
var stream = new FrameRequestStream(); var stream = new FrameRequestStream();
stream.StartAcceptingReads(body); stream.StartAcceptingReads(body);
input.Add("Hello", true); input.Add("5\r\nHello\r\n");
var buffer1 = new byte[1024]; var buffer = new byte[1024];
var count1 = await stream.ReadAsync(buffer1, 0, 1024);
AssertASCII("Hello", new ArraySegment<byte>(buffer1, 0, 5));
var buffer2 = new byte[1024]; var count = stream.Read(buffer, 0, buffer.Length);
var count2 = await stream.ReadAsync(buffer2, 0, 1024); Assert.Equal(5, count);
Assert.Equal(0, count2); AssertASCII("Hello", new ArraySegment<byte>(buffer, 0, count));
input.Add("0\r\n\r\n");
count = stream.Read(buffer, 0, buffer.Length);
Assert.Equal(0, count);
} }
} }
[Fact] [Fact]
public void Http10NoContentLength() public async Task CanReadAsyncFromChunkedEncoding()
{ {
using (var input = new TestInput()) using (var input = new TestInput())
{ {
var body = MessageBody.For(HttpVersion.Http10, new FrameRequestHeaders(), input.FrameContext); var body = MessageBody.For(HttpVersion.Http11, new FrameRequestHeaders { HeaderTransferEncoding = "chunked" }, input.FrameContext);
var stream = new FrameRequestStream(); var stream = new FrameRequestStream();
stream.StartAcceptingReads(body); stream.StartAcceptingReads(body);
input.Add("Hello", true); input.Add("5\r\nHello\r\n");
var buffer1 = new byte[1024]; var buffer = new byte[1024];
Assert.Equal(0, stream.Read(buffer1, 0, 1024));
var count = await stream.ReadAsync(buffer, 0, buffer.Length);
Assert.Equal(5, count);
AssertASCII("Hello", new ArraySegment<byte>(buffer, 0, count));
input.Add("0\r\n\r\n");
count = await stream.ReadAsync(buffer, 0, buffer.Length);
Assert.Equal(0, count);
} }
} }
[Fact] [Theory]
public async Task Http10NoContentLengthAsync() [InlineData(HttpVersion.Http10)]
[InlineData(HttpVersion.Http11)]
public void CanReadFromRemainingData(HttpVersion httpVersion)
{ {
using (var input = new TestInput()) using (var input = new TestInput())
{ {
var body = MessageBody.For(HttpVersion.Http10, new FrameRequestHeaders(), input.FrameContext); var body = MessageBody.For(httpVersion, new FrameRequestHeaders { HeaderConnection = "upgrade" }, input.FrameContext);
var stream = new FrameRequestStream(); var stream = new FrameRequestStream();
stream.StartAcceptingReads(body); stream.StartAcceptingReads(body);
input.Add("Hello", true); input.Add("Hello");
var buffer1 = new byte[1024]; var buffer = new byte[1024];
Assert.Equal(0, await stream.ReadAsync(buffer1, 0, 1024));
var count = stream.Read(buffer, 0, buffer.Length);
Assert.Equal(5, count);
AssertASCII("Hello", new ArraySegment<byte>(buffer, 0, count));
} }
} }
[Fact] [Theory]
public void Http11NoContentLength() [InlineData(HttpVersion.Http10)]
[InlineData(HttpVersion.Http11)]
public async Task CanReadAsyncFromRemainingData(HttpVersion httpVersion)
{ {
using (var input = new TestInput()) using (var input = new TestInput())
{ {
var body = MessageBody.For(HttpVersion.Http11, new FrameRequestHeaders(), input.FrameContext); var body = MessageBody.For(httpVersion, new FrameRequestHeaders { HeaderConnection = "upgrade" }, input.FrameContext);
var stream = new FrameRequestStream(); var stream = new FrameRequestStream();
stream.StartAcceptingReads(body); stream.StartAcceptingReads(body);
input.Add("Hello", true); input.Add("Hello");
var buffer1 = new byte[1024]; var buffer = new byte[1024];
Assert.Equal(0, stream.Read(buffer1, 0, 1024));
var count = await stream.ReadAsync(buffer, 0, buffer.Length);
Assert.Equal(5, count);
AssertASCII("Hello", new ArraySegment<byte>(buffer, 0, count));
} }
} }
[Fact] [Theory]
public async Task Http11NoContentLengthAsync() [InlineData(HttpVersion.Http10)]
[InlineData(HttpVersion.Http11)]
public void ReadFromNoContentLengthReturnsZero(HttpVersion httpVersion)
{ {
using (var input = new TestInput()) using (var input = new TestInput())
{ {
var body = MessageBody.For(HttpVersion.Http11, new FrameRequestHeaders(), input.FrameContext); var body = MessageBody.For(httpVersion, new FrameRequestHeaders(), input.FrameContext);
var stream = new FrameRequestStream(); var stream = new FrameRequestStream();
stream.StartAcceptingReads(body); stream.StartAcceptingReads(body);
input.Add("Hello", true); input.Add("Hello");
var buffer1 = new byte[1024]; var buffer = new byte[1024];
Assert.Equal(0, await stream.ReadAsync(buffer1, 0, 1024)); Assert.Equal(0, stream.Read(buffer, 0, buffer.Length));
} }
} }
[Fact] [Theory]
public void Http11NoContentLengthConnectionClose() [InlineData(HttpVersion.Http10)]
[InlineData(HttpVersion.Http11)]
public async Task ReadAsyncFromNoContentLengthReturnsZero(HttpVersion httpVersion)
{ {
using (var input = new TestInput()) using (var input = new TestInput())
{ {
var body = MessageBody.For(HttpVersion.Http11, new FrameRequestHeaders { HeaderConnection = "close" }, input.FrameContext); var body = MessageBody.For(httpVersion, new FrameRequestHeaders(), input.FrameContext);
var stream = new FrameRequestStream(); var stream = new FrameRequestStream();
stream.StartAcceptingReads(body); stream.StartAcceptingReads(body);
input.Add("Hello", true); input.Add("Hello");
var buffer1 = new byte[1024]; var buffer = new byte[1024];
Assert.Equal(0, stream.Read(buffer1, 0, 1024)); Assert.Equal(0, await stream.ReadAsync(buffer, 0, buffer.Length));
}
}
[Fact]
public async Task Http11NoContentLengthConnectionCloseAsync()
{
using (var input = new TestInput())
{
var body = MessageBody.For(HttpVersion.Http11, new FrameRequestHeaders { HeaderConnection = "close" }, input.FrameContext);
var stream = new FrameRequestStream();
stream.StartAcceptingReads(body);
input.Add("Hello", true);
var buffer1 = new byte[1024];
Assert.Equal(0, await stream.ReadAsync(buffer1, 0, 1024));
} }
} }
@ -176,7 +208,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
input.Add(largeInput); input.Add(largeInput);
// Add a smaller block to the end so that SocketInput attempts to return the large // Add a smaller block to the end so that SocketInput attempts to return the large
// block to the memory pool. // block to the memory pool.
input.Add("Hello", fin: true); input.Add("Hello");
var ms = new MemoryStream(); var ms = new MemoryStream();
@ -324,7 +356,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
await Assert.ThrowsAsync<XunitException>(() => body.CopyToAsync(writeStream)); await Assert.ThrowsAsync<XunitException>(() => body.CopyToAsync(writeStream));
input.Add(data[1], fin: headers.HeaderConnection == "close"); input.Add(data[1]);
// "Hello " should have been consumed // "Hello " should have been consumed
var readBuffer = new byte[6]; var readBuffer = new byte[6];
@ -350,10 +382,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
var stream = new FrameRequestStream(); var stream = new FrameRequestStream();
stream.StartAcceptingReads(body); stream.StartAcceptingReads(body);
input.Add("Hello", true); input.Add("Hello");
var buffer = new byte[1024]; var buffer = new byte[1024];
Assert.Equal(5, stream.Read(buffer, 0, 1024)); Assert.Equal(5, stream.Read(buffer, 0, buffer.Length));
AssertASCII("Hello", new ArraySegment<byte>(buffer, 0, 5)); AssertASCII("Hello", new ArraySegment<byte>(buffer, 0, 5));
} }
} }

View File

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using System.IO;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -35,14 +36,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
public Frame FrameContext { get; set; } public Frame FrameContext { get; set; }
public void Add(string text, bool fin = false) public void Add(string text)
{ {
var data = Encoding.ASCII.GetBytes(text); var data = Encoding.ASCII.GetBytes(text);
Pipe.Writer.WriteAsync(data).Wait(); Pipe.Writer.WriteAsync(data).Wait();
if (fin)
{
Pipe.Writer.Complete();
}
} }
public void ProduceContinue() public void ProduceContinue()