public void Equals_ReturnsFalseOnDifferentKey() { // Arrange var tagHelperContext1 = GetTagHelperContext("some-id"); var cacheTagHelper1 = new CacheTagHelper(Mock.Of<IMemoryCache>(), new HtmlTestEncoder()) { ViewContext = GetViewContext() }; var tagHelperContext2 = GetTagHelperContext("some-other-id"); var cacheTagHelper2 = new CacheTagHelper(Mock.Of<IMemoryCache>(), new HtmlTestEncoder()) { ViewContext = GetViewContext() }; // Act var cacheTagKey1 = new CacheTagKey(cacheTagHelper1, tagHelperContext1); var cacheTagKey2 = new CacheTagKey(cacheTagHelper2, tagHelperContext2); // Assert Assert.NotEqual(cacheTagKey1, cacheTagKey2); }
public void Equals_ReturnsTrueOnSameKey() { // Arrange var id = Guid.NewGuid().ToString(); var tagHelperContext1 = GetTagHelperContext(id); var cacheTagHelper1 = new CacheTagHelper(Mock.Of<IMemoryCache>(), new HtmlTestEncoder()) { ViewContext = GetViewContext() }; var tagHelperContext2 = GetTagHelperContext(id); var cacheTagHelper2 = new CacheTagHelper(Mock.Of<IMemoryCache>(), new HtmlTestEncoder()) { ViewContext = GetViewContext() }; // Act var cacheTagKey1 = new CacheTagKey(cacheTagHelper1, tagHelperContext1); var cacheTagKey2 = new CacheTagKey(cacheTagHelper2, tagHelperContext2); // Assert Assert.Equal(cacheTagKey1, cacheTagKey2); }
public void GenerateKey_WithMultipleVaryByOptions_CreatesCombinedKey() { // Arrange var expected = "CacheTagHelper||testid||VaryBy||custom-value||" + "VaryByHeader(content-type||text/html)||VaryByUser||someuser"; var tagHelperContext = GetTagHelperContext(); var cacheTagHelper = new CacheTagHelper(Mock.Of<IMemoryCache>(), new HtmlTestEncoder()) { ViewContext = GetViewContext(), VaryByUser = true, VaryByHeader = "content-type", VaryBy = "custom-value" }; cacheTagHelper.ViewContext.HttpContext.Request.Headers["Content-Type"] = "text/html"; var identity = new ClaimsIdentity(new[] { new Claim(ClaimsIdentity.DefaultNameClaimType, "someuser") }); cacheTagHelper.ViewContext.HttpContext.User = new ClaimsPrincipal(identity); // Act var cacheTagKey = new CacheTagKey(cacheTagHelper, tagHelperContext); var key = cacheTagKey.GenerateKey(); // Assert Assert.Equal(expected, key); }
public void GetHashCode_VariesByUniqueId() { // Arrange var tagHelperContext1 = GetTagHelperContext("some-id"); var cacheTagHelper1 = new CacheTagHelper(Mock.Of<IMemoryCache>(), new HtmlTestEncoder()) { ViewContext = GetViewContext() }; var tagHelperContext2 = GetTagHelperContext("some-other-id"); var cacheTagHelper2 = new CacheTagHelper(Mock.Of<IMemoryCache>(), new HtmlTestEncoder()) { ViewContext = GetViewContext() }; var cacheKey1 = new CacheTagKey(cacheTagHelper1, tagHelperContext1); var cacheKey2 = new CacheTagKey(cacheTagHelper2, tagHelperContext2); // Act var hashcode1 = cacheKey1.GetHashCode(); var hashcode2 = cacheKey2.GetHashCode(); // Assert Assert.NotEqual(hashcode1, hashcode2); }
public void GenerateKey_UsesVaryByUserAndAuthenticatedUserName() { // Arrange var expected = "CacheTagHelper||testid||VaryByUser||test_name"; var tagHelperContext = GetTagHelperContext(); var cacheTagHelper = new CacheTagHelper(Mock.Of<IMemoryCache>(), new HtmlTestEncoder()) { ViewContext = GetViewContext(), VaryByUser = true }; var identity = new ClaimsIdentity(new[] { new Claim(ClaimsIdentity.DefaultNameClaimType, "test_name") }); cacheTagHelper.ViewContext.HttpContext.User = new ClaimsPrincipal(identity); // Act var cacheTagKey = new CacheTagKey(cacheTagHelper, tagHelperContext); var key = cacheTagKey.GenerateKey(); // Assert Assert.Equal(expected, key); }
public void GenerateKey_UsesVaryByUser_WhenUserIsNotAuthenticated() { // Arrange var expected = "CacheTagHelper||testid||VaryByUser||"; var tagHelperContext = GetTagHelperContext(); var cacheTagHelper = new CacheTagHelper(Mock.Of<IMemoryCache>(), new HtmlTestEncoder()) { ViewContext = GetViewContext(), VaryByUser = true }; // Act var cacheTagKey = new CacheTagKey(cacheTagHelper, tagHelperContext); var key = cacheTagKey.GenerateKey(); // Assert Assert.Equal(expected, key); }
public void GenerateKey_UsesVaryByQuery(string varyByQuery, string expected) { // Arrange var tagHelperContext = GetTagHelperContext(); var cacheTagHelper = new CacheTagHelper(Mock.Of<IMemoryCache>(), new HtmlTestEncoder()) { ViewContext = GetViewContext(), VaryByQuery = varyByQuery }; cacheTagHelper.ViewContext.HttpContext.Request.QueryString = new QueryString("?sortoption=Adorability&Category=cats&sortOrder="); // Act var cacheTagKey = new CacheTagKey(cacheTagHelper, tagHelperContext); var key = cacheTagKey.GenerateKey(); // Assert Assert.Equal(expected, key); }
public void GenerateKey_UsesVaryByRoute(string varyByRoute, string expected) { // Arrange var tagHelperContext = GetTagHelperContext(); var cacheTagHelper = new CacheTagHelper(Mock.Of<IMemoryCache>(), new HtmlTestEncoder()) { ViewContext = GetViewContext(), VaryByRoute = varyByRoute }; cacheTagHelper.ViewContext.RouteData.Values["id"] = 4; cacheTagHelper.ViewContext.RouteData.Values["category"] = "MyCategory"; // Act var cacheTagKey = new CacheTagKey(cacheTagHelper, tagHelperContext); var key = cacheTagKey.GenerateKey(); // Assert Assert.Equal(expected, key); }
public void GenerateKey_UsesVaryByHeader(string varyByHeader, string expected) { // Arrange var tagHelperContext = GetTagHelperContext(); var cacheTagHelper = new CacheTagHelper(Mock.Of<IMemoryCache>(), new HtmlTestEncoder()) { ViewContext = GetViewContext(), VaryByHeader = varyByHeader }; var headers = cacheTagHelper.ViewContext.HttpContext.Request.Headers; headers["Accept-Language"] = "en-us;charset=utf8"; headers["Accept-Encoding"] = "utf8"; headers["X-CustomHeader"] = "Header-Value"; // Act var cacheTagKey = new CacheTagKey(cacheTagHelper, tagHelperContext); var key = cacheTagKey.GenerateKey(); // Assert Assert.Equal(expected, key); }
public void GenerateKey_UsesVaryByPropertyToGenerateKey(string varyBy) { // Arrange var tagHelperContext = GetTagHelperContext(); var cacheTagHelper = new CacheTagHelper(Mock.Of<IMemoryCache>(), new HtmlTestEncoder()) { ViewContext = GetViewContext(), VaryBy = varyBy }; var expected = "CacheTagHelper||testid||VaryBy||" + varyBy; // Act var cacheTagKey = new CacheTagKey(cacheTagHelper, tagHelperContext); var key = cacheTagKey.GenerateKey(); // Assert Assert.Equal(expected, key); }
public void GenerateKey_UsesVaryByCookieName(string varyByCookie, string expected) { // Arrange var tagHelperContext = GetTagHelperContext(); var cacheTagHelper = new CacheTagHelper(Mock.Of<IMemoryCache>(), new HtmlTestEncoder()) { ViewContext = GetViewContext(), VaryByCookie = varyByCookie }; cacheTagHelper.ViewContext.HttpContext.Request.Headers["Cookie"] = "Cookie0=Cookie0Value;Cookie1=Cookie1Value"; // Act var cacheTagKey = new CacheTagKey(cacheTagHelper, tagHelperContext); var key = cacheTagKey.GenerateKey(); // Assert Assert.Equal(expected, key); }
public void GenerateKey_ReturnsKeyBasedOnTagHelperUniqueId() { // Arrange var id = Guid.NewGuid().ToString(); var tagHelperContext = GetTagHelperContext(id); var cacheTagHelper = new CacheTagHelper(Mock.Of<IMemoryCache>(), new HtmlTestEncoder()) { ViewContext = GetViewContext() }; var expected = "CacheTagHelper||" + id; // Act var cacheTagKey = new CacheTagKey(cacheTagHelper, tagHelperContext); var key = cacheTagKey.GenerateKey(); // Assert Assert.Equal(expected, key); }
public async Task ProcessAsync_ExceptionInProcessing_DoNotThrowInSubsequentRequests() { // Arrange var id = "unique-id"; var childContent = "some-content"; var cache = new MemoryCache(new MemoryCacheOptions()); var counter = 0; Task <TagHelperContent> GetChildContentAsync(bool useCachedResult, HtmlEncoder encoder) { counter++; if (counter < 3) { // throw on first two calls throw new Exception(); } else { // produce content on third call var tagHelperContent = new DefaultTagHelperContent(); tagHelperContent.SetHtmlContent(childContent); return(Task.FromResult <TagHelperContent>(tagHelperContent)); } } var tagHelperContext1 = GetTagHelperContext(id); var tagHelperContext2 = GetTagHelperContext(id); var tagHelperContext3 = GetTagHelperContext(id); var tagHelperContext4 = GetTagHelperContext(id); var tagHelperOutput1 = new TagHelperOutput("cache", new TagHelperAttributeList(), GetChildContentAsync); var tagHelperOutput2 = new TagHelperOutput("cache", new TagHelperAttributeList(), GetChildContentAsync); var tagHelperOutput3 = new TagHelperOutput("cache", new TagHelperAttributeList(), GetChildContentAsync); var tagHelperOutput4 = new TagHelperOutput("cache", new TagHelperAttributeList(), GetChildContentAsync); var cacheTagHelper = new CacheTagHelper(new CacheTagHelperMemoryCacheFactory(cache), new HtmlTestEncoder()) { ViewContext = GetViewContext(), Enabled = true, ExpiresAfter = TimeSpan.FromHours(1.0) }; // Act - 1 await Assert.ThrowsAsync <Exception>(() => cacheTagHelper.ProcessAsync(tagHelperContext1, tagHelperOutput1)); // Assert - 1 Assert.Equal(1, counter); Assert.Empty(tagHelperOutput1.PreContent.GetContent()); Assert.Empty(tagHelperOutput1.PostContent.GetContent()); Assert.False(tagHelperOutput1.IsContentModified); Assert.Empty(tagHelperOutput1.Content.GetContent()); // Act - 2 await Assert.ThrowsAsync <Exception>(() => cacheTagHelper.ProcessAsync(tagHelperContext2, tagHelperOutput2)); // Assert - 2 Assert.Equal(2, counter); Assert.Empty(tagHelperOutput2.PreContent.GetContent()); Assert.Empty(tagHelperOutput2.PostContent.GetContent()); Assert.False(tagHelperOutput2.IsContentModified); Assert.Empty(tagHelperOutput2.Content.GetContent()); // Act - 3 await cacheTagHelper.ProcessAsync(tagHelperContext3, tagHelperOutput3); // Assert - 3 Assert.Equal(3, counter); Assert.Empty(tagHelperOutput3.PreContent.GetContent()); Assert.Empty(tagHelperOutput3.PostContent.GetContent()); Assert.True(tagHelperOutput3.IsContentModified); Assert.Equal(childContent, tagHelperOutput3.Content.GetContent()); // Act - 4 await cacheTagHelper.ProcessAsync(tagHelperContext4, tagHelperOutput4); // Assert - 4 Assert.Equal(3, counter); Assert.Empty(tagHelperOutput4.PreContent.GetContent()); Assert.Empty(tagHelperOutput4.PostContent.GetContent()); Assert.True(tagHelperOutput4.IsContentModified); Assert.Equal(childContent, tagHelperOutput4.Content.GetContent()); }
public async Task ProcessAsync_ExceptionInProcessing_DoesntBlockConcurrentRequests() { // Arrange var id = "unique-id"; var childContent = "some-content"; var event1 = new TaskCompletionSource <int>(TaskCreationOptions.RunContinuationsAsynchronously); var event2 = new TaskCompletionSource <int>(TaskCreationOptions.RunContinuationsAsynchronously); var event3 = new TaskCompletionSource <int>(TaskCreationOptions.RunContinuationsAsynchronously); var calls = 0; var cache = new MemoryCache(new MemoryCacheOptions()); var tagHelperContext1 = GetTagHelperContext(id + 1); var tagHelperContext2 = GetTagHelperContext(id + 2); var tagHelperOutput1 = new TagHelperOutput( "cache", new TagHelperAttributeList(), getChildContentAsync: (useCachedResult, encoder) => { calls++; event2.SetResult(0); throw new Exception(); }); var tagHelperOutput2 = new TagHelperOutput( "cache", new TagHelperAttributeList(), getChildContentAsync: async(useCachedResult, encoder) => { calls++; await event3.Task.TimeoutAfter(TimeSpan.FromSeconds(5)); var tagHelperContent = new DefaultTagHelperContent(); tagHelperContent.SetHtmlContent(childContent); return(tagHelperContent); }); var cacheTagHelper1 = new CacheTagHelper(new CacheTagHelperMemoryCacheFactory(cache), new HtmlTestEncoder()) { ViewContext = GetViewContext(), Enabled = true }; var cacheTagHelper2 = new CacheTagHelper(new CacheTagHelperMemoryCacheFactory(cache), new HtmlTestEncoder()) { ViewContext = GetViewContext(), Enabled = true }; // Act var task1 = Task.Run(async() => { await event1.Task.TimeoutAfter(TimeSpan.FromSeconds(5)); await Assert.ThrowsAsync <Exception>(() => cacheTagHelper1.ProcessAsync(tagHelperContext1, tagHelperOutput1)); event3.SetResult(0); }); var task2 = Task.Run(async() => { await event2.Task.TimeoutAfter(TimeSpan.FromSeconds(5)); await cacheTagHelper2.ProcessAsync(tagHelperContext2, tagHelperOutput2); }); event1.SetResult(0); await Task.WhenAll(task1, task2); // Assert Assert.Empty(tagHelperOutput1.PreContent.GetContent()); Assert.Empty(tagHelperOutput1.PostContent.GetContent()); Assert.False(tagHelperOutput1.IsContentModified); Assert.Empty(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(2, calls); }
public async Task ProcessAsync_ExceptionInProcessing_DoesntBlockConcurrentRequests() { // Arrange var id = "unique-id"; 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); var tagHelperOutput1 = new TagHelperOutput( "cache", new TagHelperAttributeList(), getChildContentAsync: (useCachedResult, encoder) => { calls++; resetEvent2.Set(); throw new Exception(); }); 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(new CacheTagHelperMemoryCacheFactory(cache), new HtmlTestEncoder()) { ViewContext = GetViewContext(), Enabled = true }; var cacheTagHelper2 = new CacheTagHelper(new CacheTagHelperMemoryCacheFactory(cache), new HtmlTestEncoder()) { ViewContext = GetViewContext(), Enabled = true }; // Act var task1 = Task.Run(async() => { resetEvent1.WaitOne(5000); await Assert.ThrowsAsync <Exception>(() => cacheTagHelper1.ProcessAsync(tagHelperContext1, tagHelperOutput1)); resetEvent3.Set(); }); var task2 = Task.Run(async() => { resetEvent2.WaitOne(5000); await cacheTagHelper2.ProcessAsync(tagHelperContext2, tagHelperOutput2); }); resetEvent1.Set(); await Task.WhenAll(task1, task2); // Assert Assert.Empty(tagHelperOutput1.PreContent.GetContent()); Assert.Empty(tagHelperOutput1.PostContent.GetContent()); Assert.False(tagHelperOutput1.IsContentModified); Assert.Empty(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(2, calls); }