Skip to content
This repository was archived by the owner on Dec 14, 2018. It is now read-only.

Commit b0fb438

Browse files
committed
Test changes
1 parent 48d62b3 commit b0fb438

File tree

7 files changed

+227
-40
lines changed

7 files changed

+227
-40
lines changed

src/Microsoft.AspNet.Mvc.Razor/RazorTextWriter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ public override async Task FlushAsync()
274274
public void CopyTo(TextWriter writer)
275275
{
276276
var targetRazorTextWriter = writer as RazorTextWriter;
277-
if (targetRazorTextWriter != null)
277+
if (targetRazorTextWriter != null && targetRazorTextWriter.IsBuffered)
278278
{
279279
targetRazorTextWriter.Buffer.Add(Buffer);
280280
}
@@ -292,7 +292,7 @@ public void CopyTo(TextWriter writer)
292292
public Task CopyToAsync(TextWriter writer)
293293
{
294294
var targetRazorTextWriter = writer as RazorTextWriter;
295-
if (targetRazorTextWriter != null)
295+
if (targetRazorTextWriter != null && targetRazorTextWriter.IsBuffered)
296296
{
297297
targetRazorTextWriter.Buffer.Add(Buffer);
298298
}

test/Microsoft.AspNet.Mvc.FunctionalTests/FlushPointTest.cs

Lines changed: 75 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System;
5+
using System.IO;
6+
using System.Text;
7+
using System.Threading;
58
using System.Threading.Tasks;
69
using Microsoft.AspNet.Builder;
710
using Microsoft.AspNet.TestHost;
11+
using Microsoft.Framework.DependencyInjection;
12+
using Microsoft.Framework.DependencyInjection.Fallback;
813
using RazorWebSite;
914
using Xunit;
1015

@@ -16,43 +21,91 @@ public class FlushPointTest
1621
private readonly Action<IBuilder> _app = new Startup().Configure;
1722

1823
[Fact]
19-
public async Task FlushPointsAreExecutedForPagesWithLayouts()
24+
public void FlushPointsAreExecutedForPagesWithLayouts()
2025
{
21-
var expected =
22-
@"<title>Page With Layout</title>
26+
var waitService = new WaitService();
27+
var serviceProvider = GetServiceProvider(waitService);
28+
var server = TestServer.Create(serviceProvider, _app);
29+
var client = server.CreateClient();
30+
var invoked = false;
2331

32+
// Act
33+
var result = client.GetStreamAsync("http://localhost/FlushPoint/PageWithLayout");
34+
var thread = new Thread(() =>
35+
{
36+
waitService.WaitForServer();
37+
var stream = result.Result;
2438

25-
RenderBody content
39+
// Assert - 1
40+
Assert.Equal(@"<title>Page With Layout</title>", GetTrimmedString(stream));
2641

42+
waitService.WaitForServer();
2743

28-
<span>Content that takes time to produce</span>";
29-
var server = TestServer.Create(_provider, _app);
30-
var client = server.Handler;
44+
// Assert - 2
45+
Assert.Equal(@"RenderBody content", GetTrimmedString(stream));
3146

32-
// Act
33-
var result = await client.GetAsync("http://localhost/FlushPoint/PageWithLayout");
47+
invoked = true;
48+
});
49+
thread.Start();
3450

3551
// Assert
36-
var body = await result.HttpContext.Response.ReadBodyAsStringAsync();
37-
Assert.Equal(expected, body.Trim());
52+
thread.Join();
53+
Assert.True(invoked);
54+
Assert.Equal(@"<span>Content that takes time to produce</span>",
55+
GetTrimmedString(result.Result));
3856
}
3957

4058
[Fact]
41-
public async Task FlushPointsAreExecutedForPagesWithoutLayouts()
59+
public void FlushPointsAreExecutedForPagesWithoutLayouts()
4260
{
43-
var expected =
44-
@"Initial content
61+
var expected1 = "Initial content";
62+
var expected2 = "Secondary content";
63+
var expected3 = "Final content";
64+
var waitService = new WaitService();
65+
var serviceProvider = GetServiceProvider(waitService);
4566

46-
Final content";
47-
var server = TestServer.Create(_provider, _app);
48-
var client = server.Handler;
67+
var server = TestServer.Create(serviceProvider, _app);
68+
var client = server.CreateClient();
69+
var invoked = false;
4970

5071
// Act
51-
var result = await client.GetAsync("http://localhost/FlushPoint/PageWithoutLayout");
72+
var result = client.GetStreamAsync("http://localhost/FlushPoint/PageWithoutLayout");
5273

53-
// Assert
54-
var body = await result.HttpContext.Response.ReadBodyAsStringAsync();
55-
Assert.Equal(expected, body.Trim());
74+
var thread = new Thread(() =>
75+
{
76+
waitService.WaitForServer();
77+
var stream = result.Result;
78+
79+
// Assert - 1
80+
Assert.Equal(expected1, GetTrimmedString(stream));
81+
82+
waitService.WaitForServer();
83+
84+
// Assert - 2
85+
Assert.Equal(expected2, GetTrimmedString(stream));
86+
87+
invoked = true;
88+
});
89+
thread.Start();
90+
91+
// Assert - 2
92+
thread.Join();
93+
Assert.True(invoked);
94+
Assert.Equal(expected3, GetTrimmedString(result.Result));
95+
}
96+
97+
private IServiceProvider GetServiceProvider(WaitService waitService)
98+
{
99+
var services = new ServiceCollection();
100+
services.AddInstance(waitService);
101+
return services.BuildServiceProvider(_provider);
102+
}
103+
104+
private string GetTrimmedString(Stream stream)
105+
{
106+
var buffer = new byte[1024];
107+
var count = stream.Read(buffer, 0, buffer.Length);
108+
return Encoding.UTF8.GetString(buffer, 0, count).Trim();
56109
}
57110
}
58-
}
111+
}

test/Microsoft.AspNet.Mvc.Razor.Test/RazorTextWriterTest.cs

Lines changed: 101 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Text;
88
using System.Threading.Tasks;
99
using Microsoft.AspNet.Testing;
10+
using Moq;
1011
using Xunit;
1112

1213
namespace Microsoft.AspNet.Mvc.Razor.Test
@@ -19,7 +20,7 @@ public void Write_WritesDataTypes_ToBuffer()
1920
{
2021
// Arrange
2122
var expected = new[] { "True", "3", "18446744073709551615", "Hello world", "3.14", "2.718", "m" };
22-
var writer = new RazorTextWriter(Encoding.UTF8);
23+
var writer = new RazorTextWriter(TextWriter.Null, Encoding.UTF8);
2324

2425
// Act
2526
writer.Write(true);
@@ -34,14 +35,81 @@ public void Write_WritesDataTypes_ToBuffer()
3435
Assert.Equal<object>(expected, writer.Buffer.BufferEntries);
3536
}
3637

38+
[Fact]
39+
[ReplaceCulture]
40+
public void Write_WritesDataTypes_ToUnderlyingStream_WhenNotBuffering()
41+
{
42+
// Arrange
43+
var expected = new[] { "True", "3", "18446744073709551615", "Hello world", "3.14", "2.718" };
44+
var unbufferedWriter = new Mock<TextWriter>();
45+
var writer = new RazorTextWriter(unbufferedWriter.Object, Encoding.UTF8);
46+
var testClass = new TestClass();
47+
48+
// Act
49+
writer.Flush();
50+
writer.Write(true);
51+
writer.Write(3);
52+
writer.Write(ulong.MaxValue);
53+
writer.Write(testClass);
54+
writer.Write(3.14);
55+
writer.Write(2.718m);
56+
57+
// Assert
58+
Assert.Empty(writer.Buffer.BufferEntries);
59+
foreach (var item in expected)
60+
{
61+
unbufferedWriter.Verify(v => v.Write(item), Times.Once());
62+
}
63+
}
64+
65+
[Fact]
66+
[ReplaceCulture]
67+
public void Write_WritesCharValues_ToUnderlyingStream_WhenNotBuffering()
68+
{
69+
// Arrange
70+
var unbufferedWriter = new Mock<TextWriter> { CallBase = true };
71+
var writer = new RazorTextWriter(unbufferedWriter.Object, Encoding.UTF8);
72+
var buffer = new[] { 'a', 'b', 'c' };
73+
74+
// Act
75+
writer.Flush();
76+
writer.Write('a');
77+
writer.Write(buffer, 1, 2);
78+
79+
// Assert
80+
Assert.Empty(writer.Buffer.BufferEntries);
81+
unbufferedWriter.Verify(v => v.Write('a'), Times.Once());
82+
unbufferedWriter.Verify(v => v.Write(buffer, 1, 2), Times.Once());
83+
}
84+
85+
[Fact]
86+
[ReplaceCulture]
87+
public async Task Write_WritesStringValues_ToUnbufferedStream_WhenNotBuffering()
88+
{
89+
// Arrange
90+
var unbufferedWriter = new Mock<TextWriter>();
91+
var writer = new RazorTextWriter(unbufferedWriter.Object, Encoding.UTF8);
92+
var buffer = new[] { 'a', 'b', 'c' };
93+
94+
// Act
95+
await writer.FlushAsync();
96+
writer.Write("a");
97+
writer.WriteLine("ab");
98+
99+
// Assert
100+
Assert.Empty(writer.Buffer.BufferEntries);
101+
unbufferedWriter.Verify(v => v.WriteLine("a"), Times.Once());
102+
unbufferedWriter.Verify(v => v.WriteLine("ab"), Times.Once());
103+
}
104+
37105
[Fact]
38106
[ReplaceCulture]
39107
public void WriteLine_WritesDataTypes_ToBuffer()
40108
{
41109
// Arrange
42110
var newLine = Environment.NewLine;
43111
var expected = new List<object> { "False", newLine, "1.1", newLine, "3", newLine };
44-
var writer = new RazorTextWriter(Encoding.UTF8);
112+
var writer = new RazorTextWriter(TextWriter.Null, Encoding.UTF8);
45113

46114
// Act
47115
writer.WriteLine(false);
@@ -52,14 +120,36 @@ public void WriteLine_WritesDataTypes_ToBuffer()
52120
Assert.Equal(expected, writer.Buffer.BufferEntries);
53121
}
54122

123+
[Fact]
124+
[ReplaceCulture]
125+
public void WriteLine_WritesDataTypes_ToUnbufferedStream_WhenNotBuffering()
126+
{
127+
// Arrange
128+
var unbufferedWriter = new Mock<TextWriter>();
129+
var writer = new RazorTextWriter(unbufferedWriter.Object, Encoding.UTF8);
130+
131+
// Act
132+
writer.Flush();
133+
writer.WriteLine(false);
134+
writer.WriteLine(1.1f);
135+
writer.WriteLine(3L);
136+
137+
// Assert
138+
Assert.Empty(writer.Buffer.BufferEntries);
139+
unbufferedWriter.Verify(v => v.Write("False"), Times.Once());
140+
unbufferedWriter.Verify(v => v.Write(1.1f), Times.Once());
141+
unbufferedWriter.Verify(v => v.Write(3L), Times.Once());
142+
unbufferedWriter.Verify(v => v.WriteLine(), Times.Exactly(3));
143+
}
144+
55145
[Fact]
56146
public async Task Write_WritesCharBuffer()
57147
{
58148
// Arrange
59149
var input1 = new ArraySegment<char>(new char[] { 'a', 'b', 'c', 'd' }, 1, 3);
60150
var input2 = new ArraySegment<char>(new char[] { 'e', 'f' }, 0, 2);
61151
var input3 = new ArraySegment<char>(new char[] { 'g', 'h', 'i', 'j' }, 3, 1);
62-
var writer = new RazorTextWriter(Encoding.UTF8);
152+
var writer = new RazorTextWriter(TextWriter.Null, Encoding.UTF8);
63153

64154
// Act
65155
writer.Write(input1.Array, input1.Offset, input1.Count);
@@ -80,7 +170,7 @@ public async Task WriteLines_WritesCharBuffer()
80170
{
81171
// Arrange
82172
var newLine = Environment.NewLine;
83-
var writer = new RazorTextWriter(Encoding.UTF8);
173+
var writer = new RazorTextWriter(TextWriter.Null, Encoding.UTF8);
84174

85175
// Act
86176
writer.WriteLine();
@@ -100,7 +190,7 @@ public async Task Write_WritesStringBuffer()
100190
var input2 = "from";
101191
var input3 = "ASP";
102192
var input4 = ".Net";
103-
var writer = new RazorTextWriter(Encoding.UTF8);
193+
var writer = new RazorTextWriter(TextWriter.Null, Encoding.UTF8);
104194

105195
// Act
106196
writer.Write(input1);
@@ -117,8 +207,8 @@ public async Task Write_WritesStringBuffer()
117207
public void Copy_CopiesContent_IfTargetTextWriterIsARazorTextWriter()
118208
{
119209
// Arrange
120-
var source = new RazorTextWriter(Encoding.UTF8);
121-
var target = new RazorTextWriter(Encoding.UTF8);
210+
var source = new RazorTextWriter(TextWriter.Null, Encoding.UTF8);
211+
var target = new RazorTextWriter(TextWriter.Null, Encoding.UTF8);
122212

123213
// Act
124214
source.Write("Hello world");
@@ -136,7 +226,7 @@ public void Copy_CopiesContent_IfTargetTextWriterIsARazorTextWriter()
136226
public void Copy_WritesContent_IfTargetTextWriterIsNotARazorTextWriter()
137227
{
138228
// Arrange
139-
var source = new RazorTextWriter(Encoding.UTF8);
229+
var source = new RazorTextWriter(TextWriter.Null, Encoding.UTF8);
140230
var target = new StringWriter();
141231
var expected = @"Hello world
142232
abc";
@@ -154,8 +244,8 @@ public void Copy_WritesContent_IfTargetTextWriterIsNotARazorTextWriter()
154244
public async Task CopyAsync_WritesContent_IfTargetTextWriterIsARazorTextWriter()
155245
{
156246
// Arrange
157-
var source = new RazorTextWriter(Encoding.UTF8);
158-
var target = new RazorTextWriter(Encoding.UTF8);
247+
var source = new RazorTextWriter(TextWriter.Null,Encoding.UTF8);
248+
var target = new RazorTextWriter(TextWriter.Null, Encoding.UTF8);
159249

160250
// Act
161251
source.WriteLine("Hello world");
@@ -172,7 +262,7 @@ public async Task CopyAsync_WritesContent_IfTargetTextWriterIsARazorTextWriter()
172262
public async Task CopyAsync_WritesContent_IfTargetTextWriterIsNotARazorTextWriter()
173263
{
174264
// Arrange
175-
var source = new RazorTextWriter(Encoding.UTF8);
265+
var source = new RazorTextWriter(TextWriter.Null, Encoding.UTF8);
176266
var target = new StringWriter();
177267
var expected = @"Hello world
178268
";
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System;
2+
using System.Threading;
3+
4+
namespace RazorWebSite
5+
{
6+
public class WaitService
7+
{
8+
private readonly ManualResetEventSlim _serverResetEvent = new ManualResetEventSlim();
9+
private readonly ManualResetEventSlim _clientResetEvent = new ManualResetEventSlim();
10+
11+
public void WaitForClient()
12+
{
13+
_clientResetEvent.Set();
14+
_serverResetEvent.Reset();
15+
_serverResetEvent.Wait(TimeSpan.FromSeconds(10));
16+
}
17+
18+
public void WaitForServer()
19+
{
20+
_serverResetEvent.Set();
21+
_clientResetEvent.Reset();
22+
23+
_clientResetEvent.Wait(TimeSpan.FromSeconds(10));
24+
}
25+
}
26+
}
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1-
@{
1+
@inject WaitService WaitService
2+
@{
23
Layout = "/Views/Shared/_LayoutWithFlush.cshtml";
34
ViewBag.Title = "Page With Layout";
45
}
56
RenderBody content
67
@section content
78
{
9+
@{
10+
FlushAsync().Wait();
11+
WaitService.WaitForClient();
12+
}
813
<span>Content that takes time to produce</span>
914
}

0 commit comments

Comments
 (0)