Allow RazorSourceDocument to consume empty streams.

- Added tests to validate how encoding flows when used with empty streams in addition to their usability (not throwing).

#947
This commit is contained in:
N. Taylor Mullen 2017-02-08 16:00:45 -08:00
parent d72cd469bd
commit f861c23d1f
3 changed files with 58 additions and 21 deletions

View File

@ -14,6 +14,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F8C12DD6-659D-405A-AA27-FB22AD92A010}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F8C12DD6-659D-405A-AA27-FB22AD92A010}"
ProjectSection(SolutionItems) = preProject ProjectSection(SolutionItems) = preProject
build\common.props = build\common.props
NuGet.config = NuGet.config NuGet.config = NuGet.config
EndProjectSection EndProjectSection
EndProject EndProject

View File

@ -50,31 +50,38 @@ namespace Microsoft.AspNetCore.Razor.Evolution
private static RazorSourceDocument ReadFromInternal(Stream stream, string filename, Encoding encoding) private static RazorSourceDocument ReadFromInternal(Stream stream, string filename, Encoding encoding)
{ {
var reader = new StreamReader( var streamLength = (int)stream.Length;
stream, var content = string.Empty;
encoding ?? Encoding.UTF8, var contentEncoding = encoding ?? Encoding.UTF8;
detectEncodingFromByteOrderMarks: true,
bufferSize: (int)stream.Length,
leaveOpen: true);
using (reader) if (streamLength > 0)
{ {
var content = reader.ReadToEnd(); var reader = new StreamReader(
stream,
contentEncoding,
detectEncodingFromByteOrderMarks: true,
bufferSize: streamLength,
leaveOpen: true);
if (encoding == null) using (reader)
{ {
encoding = reader.CurrentEncoding; content = reader.ReadToEnd();
}
else if (encoding != reader.CurrentEncoding)
{
throw new InvalidOperationException(
Resources.FormatMismatchedContentEncoding(
encoding.EncodingName,
reader.CurrentEncoding.EncodingName));
}
return new DefaultRazorSourceDocument(content, encoding, filename); if (encoding == null)
{
contentEncoding = reader.CurrentEncoding;
}
else if (encoding != reader.CurrentEncoding)
{
throw new InvalidOperationException(
Resources.FormatMismatchedContentEncoding(
encoding.EncodingName,
reader.CurrentEncoding.EncodingName));
}
}
} }
return new DefaultRazorSourceDocument(content, contentEncoding, filename);
} }
} }
} }

View File

@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.Evolution
public class RazorSourceDocumentTest public class RazorSourceDocumentTest
{ {
[Fact] [Fact]
public void Create() public void ReadFrom()
{ {
// Arrange // Arrange
var content = TestRazorSourceDocument.CreateStreamContent(); var content = TestRazorSourceDocument.CreateStreamContent();
@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Razor.Evolution
} }
[Fact] [Fact]
public void Create_WithEncoding() public void ReadFrom_WithEncoding()
{ {
// Arrange // Arrange
var content = TestRazorSourceDocument.CreateStreamContent(encoding: Encoding.UTF32); var content = TestRazorSourceDocument.CreateStreamContent(encoding: Encoding.UTF32);
@ -38,6 +38,20 @@ namespace Microsoft.AspNetCore.Razor.Evolution
Assert.Same(Encoding.UTF32, Assert.IsType<DefaultRazorSourceDocument>(document).Encoding); Assert.Same(Encoding.UTF32, Assert.IsType<DefaultRazorSourceDocument>(document).Encoding);
} }
[Fact]
public void ReadFrom_EmptyStream_WithEncoding()
{
// Arrange
var content = TestRazorSourceDocument.CreateStreamContent(content: string.Empty, encoding: Encoding.UTF32);
// Act
var document = RazorSourceDocument.ReadFrom(content, "file.cshtml", Encoding.UTF32);
// Assert
Assert.Equal("file.cshtml", document.Filename);
Assert.Same(Encoding.UTF32, Assert.IsType<DefaultRazorSourceDocument>(document).Encoding);
}
[Fact] [Fact]
public void ReadFrom_DetectsEncoding() public void ReadFrom_DetectsEncoding()
{ {
@ -53,6 +67,21 @@ namespace Microsoft.AspNetCore.Razor.Evolution
Assert.Equal(Encoding.UTF32, document.Encoding); Assert.Equal(Encoding.UTF32, document.Encoding);
} }
[Fact]
public void ReadFrom_EmptyStream_DetectsEncoding()
{
// Arrange
var content = TestRazorSourceDocument.CreateStreamContent(content: string.Empty, encoding: Encoding.UTF32);
// Act
var document = RazorSourceDocument.ReadFrom(content, "file.cshtml");
// Assert
Assert.IsType<DefaultRazorSourceDocument>(document);
Assert.Equal("file.cshtml", document.Filename);
Assert.Equal(Encoding.UTF32, document.Encoding);
}
[Fact] [Fact]
public void ReadFrom_FailsOnMismatchedEncoding() public void ReadFrom_FailsOnMismatchedEncoding()
{ {