PagedBufferedTextWriter does not flush synchronous data prior to writing data asynchronously

Fixes #5241
This commit is contained in:
Pranav K 2016-09-08 11:29:22 -07:00
parent 43071319aa
commit d9ff1d81d6
2 changed files with 66 additions and 6 deletions

View File

@ -86,19 +86,22 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
_charBuffer.Append(value);
}
public override Task WriteAsync(char value)
public override async Task WriteAsync(char value)
{
return _inner.WriteAsync(value);
await FlushAsync();
await _inner.WriteAsync(value);
}
public override Task WriteAsync(char[] buffer, int index, int count)
public override async Task WriteAsync(char[] buffer, int index, int count)
{
return _inner.WriteAsync(buffer, index, count);
await FlushAsync();
await _inner.WriteAsync(buffer, index, count);
}
public override Task WriteAsync(string value)
public override async Task WriteAsync(string value)
{
return _inner.WriteAsync(value);
await FlushAsync();
await _inner.WriteAsync(value);
}
protected override void Dispose(bool disposing)

View File

@ -187,6 +187,63 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
Assert.Equal<char>(Content, inner.ToString().ToCharArray());
}
[Fact]
public async Task SynchronousWrites_FollowedByAsyncWriteString_WritesAllContent()
{
// Arrange
var pool = new TestArrayPool();
var inner = new StringWriter();
var writer = new PagedBufferedTextWriter(new TestArrayPool(), inner);
// Act
writer.Write('a');
writer.Write(new[] { 'b', 'c', 'd' });
writer.Write("ef");
await writer.WriteAsync("ghi");
// Assert
Assert.Equal("abcdefghi", inner.ToString());
}
[Fact]
public async Task SynchronousWrites_FollowedByAsyncWriteChar_WritesAllContent()
{
// Arrange
var pool = new TestArrayPool();
var inner = new StringWriter();
var writer = new PagedBufferedTextWriter(new TestArrayPool(), inner);
// Act
writer.Write('a');
writer.Write(new[] { 'b', 'c', 'd' });
writer.Write("ef");
await writer.WriteAsync('g');
// Assert
Assert.Equal("abcdefg", inner.ToString());
}
[Fact]
public async Task SynchronousWrites_FollowedByAsyncWriteCharArray_WritesAllContent()
{
// Arrange
var pool = new TestArrayPool();
var inner = new StringWriter();
var writer = new PagedBufferedTextWriter(new TestArrayPool(), inner);
// Act
writer.Write('a');
writer.Write(new[] { 'b', 'c', 'd' });
writer.Write("ef");
await writer.WriteAsync(new[] { 'g', 'h', 'i' });
// Assert
Assert.Equal("abcdefghi", inner.ToString());
}
[Fact]
public async Task FlushAsync_ReturnsPages()
{