Fixing race condition in cache helpers unit tests
This commit is contained in:
parent
12d7093278
commit
3924557b87
|
|
@ -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 () =>
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue