Fixing race condition in cache helpers unit tests

This commit is contained in:
Sebastien Ros 2016-03-29 10:20:05 -07:00
parent 12d7093278
commit 3924557b87
2 changed files with 57 additions and 14 deletions

View File

@ -716,13 +716,14 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
var childContent = "some-content"; var childContent = "some-content";
var resetEvent1 = new ManualResetEvent(false); var resetEvent1 = new ManualResetEvent(false);
var resetEvent2 = new ManualResetEvent(false); var resetEvent2 = new ManualResetEvent(false);
var resetEvent3 = new ManualResetEvent(false);
var calls = 0; var calls = 0;
var cache = new MemoryCache(new MemoryCacheOptions()); var cache = new MemoryCache(new MemoryCacheOptions());
var tagHelperContext1 = GetTagHelperContext(id + 1); var tagHelperContext1 = GetTagHelperContext(id + 1);
var tagHelperContext2 = GetTagHelperContext(id + 2); var tagHelperContext2 = GetTagHelperContext(id + 2);
TagHelperOutput tagHelperOutput = new TagHelperOutput( var tagHelperOutput1 = new TagHelperOutput(
"cache", "cache",
new TagHelperAttributeList(), new TagHelperAttributeList(),
getChildContentAsync: (useCachedResult, encoder) => getChildContentAsync: (useCachedResult, encoder) =>
@ -735,6 +736,19 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
return Task.FromResult<TagHelperContent>(tagHelperContent); return Task.FromResult<TagHelperContent>(tagHelperContent);
}); });
var tagHelperOutput2 = new TagHelperOutput(
"cache",
new TagHelperAttributeList(),
getChildContentAsync: (useCachedResult, encoder) =>
{
calls++;
resetEvent3.WaitOne(5000);
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetHtmlContent(childContent);
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var cacheTagHelper1 = new CacheTagHelper(cache, new HtmlTestEncoder()) var cacheTagHelper1 = new CacheTagHelper(cache, new HtmlTestEncoder())
{ {
ViewContext = GetViewContext(), ViewContext = GetViewContext(),
@ -752,23 +766,29 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
var task1 = Task.Run(async () => var task1 = Task.Run(async () =>
{ {
resetEvent1.WaitOne(5000); resetEvent1.WaitOne(5000);
await cacheTagHelper1.ProcessAsync(tagHelperContext1, tagHelperOutput); await cacheTagHelper1.ProcessAsync(tagHelperContext1, tagHelperOutput1);
resetEvent3.Set();
}); });
var task2 = Task.Run(async () => var task2 = Task.Run(async () =>
{ {
resetEvent2.WaitOne(5000); resetEvent2.WaitOne(5000);
await cacheTagHelper2.ProcessAsync(tagHelperContext1, tagHelperOutput); await cacheTagHelper2.ProcessAsync(tagHelperContext1, tagHelperOutput2);
}); });
resetEvent1.Set(); resetEvent1.Set();
await Task.WhenAll(task1, task2); await Task.WhenAll(task1, task2);
// Assert // Assert
Assert.Empty(tagHelperOutput.PreContent.GetContent()); Assert.Empty(tagHelperOutput1.PreContent.GetContent());
Assert.Empty(tagHelperOutput.PostContent.GetContent()); Assert.Empty(tagHelperOutput1.PostContent.GetContent());
Assert.True(tagHelperOutput.IsContentModified); Assert.True(tagHelperOutput1.IsContentModified);
Assert.Equal(childContent, tagHelperOutput.Content.GetContent()); Assert.Equal(childContent, tagHelperOutput1.Content.GetContent());
Assert.Empty(tagHelperOutput2.PreContent.GetContent());
Assert.Empty(tagHelperOutput2.PostContent.GetContent());
Assert.True(tagHelperOutput2.IsContentModified);
Assert.Equal(childContent, tagHelperOutput2.Content.GetContent());
Assert.Equal(1, calls); Assert.Equal(1, calls);
} }
@ -781,6 +801,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
var childContent = "some-content"; var childContent = "some-content";
var resetEvent1 = new ManualResetEvent(false); var resetEvent1 = new ManualResetEvent(false);
var resetEvent2 = new ManualResetEvent(false); var resetEvent2 = new ManualResetEvent(false);
var resetEvent3 = new ManualResetEvent(false);
var calls = 0; var calls = 0;
var cache = new MemoryCache(new MemoryCacheOptions()); var cache = new MemoryCache(new MemoryCacheOptions());
@ -804,6 +825,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
getChildContentAsync: (useCachedResult, encoder) => getChildContentAsync: (useCachedResult, encoder) =>
{ {
calls++; calls++;
resetEvent3.WaitOne(5000);
var tagHelperContent = new DefaultTagHelperContent(); var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetHtmlContent(childContent); tagHelperContent.SetHtmlContent(childContent);
@ -828,6 +850,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
{ {
resetEvent1.WaitOne(5000); resetEvent1.WaitOne(5000);
await Assert.ThrowsAsync<Exception>(() => cacheTagHelper1.ProcessAsync(tagHelperContext1, tagHelperOutput1)); await Assert.ThrowsAsync<Exception>(() => cacheTagHelper1.ProcessAsync(tagHelperContext1, tagHelperOutput1));
resetEvent3.Set();
}); });
var task2 = Task.Run(async () => var task2 = Task.Run(async () =>

View File

@ -753,6 +753,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
var childContent = "some-content"; var childContent = "some-content";
var resetEvent1 = new ManualResetEvent(false); var resetEvent1 = new ManualResetEvent(false);
var resetEvent2 = new ManualResetEvent(false); var resetEvent2 = new ManualResetEvent(false);
var resetEvent3 = new ManualResetEvent(false);
var calls = 0; var calls = 0;
var formatter = GetFormatter(); var formatter = GetFormatter();
var storage = GetStorage(); var storage = GetStorage();
@ -764,7 +765,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
var tagHelperContext1 = GetTagHelperContext(); var tagHelperContext1 = GetTagHelperContext();
var tagHelperContext2 = GetTagHelperContext(); var tagHelperContext2 = GetTagHelperContext();
TagHelperOutput tagHelperOutput = new TagHelperOutput( var tagHelperOutput1 = new TagHelperOutput(
"distributed-cache", "distributed-cache",
new TagHelperAttributeList(), new TagHelperAttributeList(),
getChildContentAsync: (useCachedResult, encoder) => getChildContentAsync: (useCachedResult, encoder) =>
@ -777,6 +778,19 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
return Task.FromResult<TagHelperContent>(tagHelperContent); return Task.FromResult<TagHelperContent>(tagHelperContent);
}); });
var tagHelperOutput2 = new TagHelperOutput(
"distributed-cache",
new TagHelperAttributeList(),
getChildContentAsync: (useCachedResult, encoder) =>
{
calls++;
resetEvent3.WaitOne(5000);
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetHtmlContent(childContent);
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var cacheTagHelper1 = new DistributedCacheTagHelper( var cacheTagHelper1 = new DistributedCacheTagHelper(
service, service,
new HtmlTestEncoder()) new HtmlTestEncoder())
@ -798,23 +812,29 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers
var task1 = Task.Run(async () => var task1 = Task.Run(async () =>
{ {
resetEvent1.WaitOne(5000); resetEvent1.WaitOne(5000);
await cacheTagHelper1.ProcessAsync(tagHelperContext1, tagHelperOutput); await cacheTagHelper1.ProcessAsync(tagHelperContext1, tagHelperOutput1);
resetEvent3.Set();
}); });
var task2 = Task.Run(async () => var task2 = Task.Run(async () =>
{ {
resetEvent2.WaitOne(5000); resetEvent2.WaitOne(5000);
await cacheTagHelper2.ProcessAsync(tagHelperContext1, tagHelperOutput); await cacheTagHelper2.ProcessAsync(tagHelperContext1, tagHelperOutput2);
}); });
resetEvent1.Set(); resetEvent1.Set();
await Task.WhenAll(task1, task2); await Task.WhenAll(task1, task2);
// Assert // Assert
Assert.Empty(tagHelperOutput.PreContent.GetContent()); Assert.Empty(tagHelperOutput1.PreContent.GetContent());
Assert.Empty(tagHelperOutput.PostContent.GetContent()); Assert.Empty(tagHelperOutput1.PostContent.GetContent());
Assert.True(tagHelperOutput.IsContentModified); Assert.True(tagHelperOutput1.IsContentModified);
Assert.Equal(childContent, tagHelperOutput.Content.GetContent()); Assert.Equal(childContent, tagHelperOutput1.Content.GetContent());
Assert.Empty(tagHelperOutput2.PreContent.GetContent());
Assert.Empty(tagHelperOutput2.PostContent.GetContent());
Assert.True(tagHelperOutput2.IsContentModified);
Assert.Equal(childContent, tagHelperOutput2.Content.GetContent());
Assert.Equal(1, calls); Assert.Equal(1, calls);
} }