using Microsoft.AspNet.Server.Kestrel; using Microsoft.AspNet.Server.Kestrel.Http; using System; using System.Threading.Tasks; using Xunit; namespace Microsoft.AspNet.Server.KestralTests { /// /// Summary description for MessageBodyExchangerTests /// public class MessageBodyExchangerTests { [Fact] public async Task CallingReadAsyncBeforeTransfer() { var testInput = new TestInput(); var context = new ConnectionContext(); context.SocketInput = new SocketInput(new MemoryPool()); var exchanger = new MessageBodyExchanger(testInput.FrameContext); var buffer1 = new byte[1024]; var buffer2 = new byte[1024]; var task1 = exchanger.ReadAsync(new ArraySegment(buffer1)); var task2 = exchanger.ReadAsync(new ArraySegment(buffer2)); Assert.False(task1.IsCompleted); Assert.False(task2.IsCompleted); testInput.Add("Hello"); exchanger.Transfer(3, false); var count1 = await task1; Assert.True(task1.IsCompleted); Assert.False(task2.IsCompleted); AssertASCII("Hel", new ArraySegment(buffer1, 0, count1)); exchanger.Transfer(2, false); var count2 = await task2; Assert.True(task1.IsCompleted); Assert.True(task2.IsCompleted); AssertASCII("lo", new ArraySegment(buffer2, 0, count2)); } [Fact] public async Task CallingTransferBeforeReadAsync() { var testInput = new TestInput(); var context = new ConnectionContext(); context.SocketInput = new SocketInput(new MemoryPool()); var exchanger = new MessageBodyExchanger(testInput.FrameContext); testInput.Add("Hello"); exchanger.Transfer(5, false); var buffer1 = new byte[1024]; var buffer2 = new byte[1024]; var task1 = exchanger.ReadAsync(new ArraySegment(buffer1)); var task2 = exchanger.ReadAsync(new ArraySegment(buffer2)); Assert.True(task1.IsCompleted); Assert.False(task2.IsCompleted); await task1; var count1 = await task1; Assert.True(task1.IsCompleted); Assert.False(task2.IsCompleted); AssertASCII("Hello", new ArraySegment(buffer1, 0, count1)); } [Fact] public async Task TransferZeroBytesDoesNotReleaseReadAsync() { var testInput = new TestInput(); var context = new ConnectionContext(); context.SocketInput = new SocketInput(new MemoryPool()); var exchanger = new MessageBodyExchanger(testInput.FrameContext); var buffer1 = new byte[1024]; var buffer2 = new byte[1024]; var task1 = exchanger.ReadAsync(new ArraySegment(buffer1)); var task2 = exchanger.ReadAsync(new ArraySegment(buffer2)); Assert.False(task1.IsCompleted); Assert.False(task2.IsCompleted); testInput.Add("Hello"); exchanger.Transfer(3, false); var count1 = await task1; Assert.True(task1.IsCompleted); Assert.False(task2.IsCompleted); AssertASCII("Hel", new ArraySegment(buffer1, 0, count1)); exchanger.Transfer(0, false); Assert.True(task1.IsCompleted); Assert.False(task2.IsCompleted); } [Fact] public async Task TransferFinDoesReleaseReadAsync() { var testInput = new TestInput(); var context = new ConnectionContext(); context.SocketInput = new SocketInput(new MemoryPool()); var exchanger = new MessageBodyExchanger(testInput.FrameContext); var buffer1 = new byte[1024]; var buffer2 = new byte[1024]; var task1 = exchanger.ReadAsync(new ArraySegment(buffer1)); var task2 = exchanger.ReadAsync(new ArraySegment(buffer2)); Assert.False(task1.IsCompleted); Assert.False(task2.IsCompleted); testInput.Add("Hello"); exchanger.Transfer(3, false); var count1 = await task1; Assert.True(task1.IsCompleted); Assert.False(task2.IsCompleted); AssertASCII("Hel", new ArraySegment(buffer1, 0, count1)); exchanger.Transfer(0, true); var count2 = await task2; Assert.True(task1.IsCompleted); Assert.True(task2.IsCompleted); Assert.Equal(0, count2); } [Fact] public async Task TransferFinFirstDoesReturnsCompletedReadAsyncs() { var testInput = new TestInput(); var context = new ConnectionContext(); context.SocketInput = new SocketInput(new MemoryPool()); var exchanger = new MessageBodyExchanger(testInput.FrameContext); testInput.Add("Hello"); exchanger.Transfer(5, true); var buffer1 = new byte[1024]; var buffer2 = new byte[1024]; var task1 = exchanger.ReadAsync(new ArraySegment(buffer1)); var task2 = exchanger.ReadAsync(new ArraySegment(buffer2)); Assert.True(task1.IsCompleted); Assert.True(task2.IsCompleted); var count1 = await task1; var count2 = await task2; AssertASCII("Hello", new ArraySegment(buffer1, 0, count1)); Assert.Equal(0, count2); } private void AssertASCII(string expected, ArraySegment actual) { var encoding = System.Text.Encoding.ASCII; var bytes = encoding.GetBytes(expected); Assert.Equal(bytes.Length, actual.Count); for (var index = 0; index != bytes.Length; ++index) { Assert.Equal(bytes[index], actual.Array[actual.Offset + index]); } } } }