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

@ -49,21 +49,27 @@ 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 streamLength = (int)stream.Length;
var content = string.Empty;
var contentEncoding = encoding ?? Encoding.UTF8;
if (streamLength > 0)
{ {
var reader = new StreamReader( var reader = new StreamReader(
stream, stream,
encoding ?? Encoding.UTF8, contentEncoding,
detectEncodingFromByteOrderMarks: true, detectEncodingFromByteOrderMarks: true,
bufferSize: (int)stream.Length, bufferSize: streamLength,
leaveOpen: true); leaveOpen: true);
using (reader) using (reader)
{ {
var content = reader.ReadToEnd(); content = reader.ReadToEnd();
if (encoding == null) if (encoding == null)
{ {
encoding = reader.CurrentEncoding; contentEncoding = reader.CurrentEncoding;
} }
else if (encoding != reader.CurrentEncoding) else if (encoding != reader.CurrentEncoding)
{ {
@ -72,9 +78,10 @@ namespace Microsoft.AspNetCore.Razor.Evolution
encoding.EncodingName, encoding.EncodingName,
reader.CurrentEncoding.EncodingName)); reader.CurrentEncoding.EncodingName));
} }
}
}
return new DefaultRazorSourceDocument(content, encoding, filename); 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()
{ {