File: Features\RequestBodyPipeFeatureTests.cs
Web Access
Project: src\src\Http\Http\test\Microsoft.AspNetCore.Http.Tests.csproj (Microsoft.AspNetCore.Http.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Buffers;
using System.IO.Pipelines;
using System.Text;
using Moq;
 
namespace Microsoft.AspNetCore.Http.Features;
 
public class RequestBodyPipeFeatureTests
{
    [Fact]
    public void RequestBodyReturnsStreamPipeReader()
    {
        var context = new DefaultHttpContext();
        var expectedStream = new MemoryStream();
        context.Request.Body = expectedStream;
 
        var feature = new RequestBodyPipeFeature(context);
 
        var pipeBody = feature.Reader;
 
        Assert.NotNull(pipeBody);
    }
 
    [Fact]
    public async Task RequestBodyGetsDataFromSecondStream()
    {
        var context = new DefaultHttpContext();
        context.Request.Body = new MemoryStream(Encoding.ASCII.GetBytes("hahaha"));
        var feature = new RequestBodyPipeFeature(context);
        var _ = feature.Reader;
 
        var expectedString = "abcdef";
        context.Request.Body = new MemoryStream(Encoding.ASCII.GetBytes(expectedString));
        var data = await feature.Reader.ReadAsync();
        Assert.Equal(expectedString, GetStringFromReadResult(data));
    }
 
    [Fact]
    public async Task RequestBodyDoesZeroByteRead()
    {
        var context = new DefaultHttpContext();
        var mockStream = new Mock<Stream>();
 
        var bufferLengths = new List<int>();
 
        mockStream.Setup(s => s.CanRead).Returns(true);
        mockStream.Setup(s => s.ReadAsync(It.IsAny<Memory<byte>>(), It.IsAny<CancellationToken>())).Returns<Memory<byte>, CancellationToken>((buffer, token) =>
        {
            bufferLengths.Add(buffer.Length);
            return ValueTask.FromResult(0);
        });
 
        context.Request.Body = mockStream.Object;
        var feature = new RequestBodyPipeFeature(context);
        var data = await feature.Reader.ReadAsync();
 
        Assert.Equal(2, bufferLengths.Count);
        Assert.Equal(0, bufferLengths[0]);
        Assert.Equal(4096, bufferLengths[1]);
    }
 
    private static string GetStringFromReadResult(ReadResult data)
    {
        return Encoding.ASCII.GetString(data.Buffer.ToArray());
    }
}