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

View File

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