From 68983ec4e9db5ba7f5159eb73356aa2a5a4ab062 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 1 Feb 2021 14:52:23 +0800 Subject: [PATCH] Add unit tests --- .../Volo/Abp/Caching/DistributedCache.cs | 4 +- .../Volo/Abp/Caching/IDistributedCache.cs | 4 +- .../Abp/Caching/DistributedCache_Tests.cs | 235 ++++++++++++++++++ 3 files changed, 239 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs index 5c9a876f4b..1337206464 100644 --- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs +++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs @@ -529,7 +529,7 @@ namespace Volo.Abp.Caching public KeyValuePair[] GetOrAddMany( IEnumerable keys, - Func, IEnumerable>> factory, + Func, List>> factory, Func optionsFactory = null, bool? hideErrors = null, bool considerUow = false) @@ -626,7 +626,7 @@ namespace Volo.Abp.Caching public async Task[]> GetOrAddManyAsync( IEnumerable keys, - Func, Task>>> factory, + Func, Task>>> factory, Func optionsFactory = null, bool? hideErrors = null, bool considerUow = false, diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs index 1d64520898..3806276969 100644 --- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs +++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs @@ -140,7 +140,7 @@ namespace Volo.Abp.Caching /// The cache items. KeyValuePair[] GetOrAddMany( IEnumerable keys, - Func, IEnumerable>> factory, + Func, List>> factory, Func optionsFactory = null, bool? hideErrors = null, bool considerUow = false @@ -159,7 +159,7 @@ namespace Volo.Abp.Caching /// The cache items. Task[]> GetOrAddManyAsync( IEnumerable keys, - Func, Task>>> factory, + Func, Task>>> factory, Func optionsFactory = null, bool? hideErrors = null, bool considerUow = false, diff --git a/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs b/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs index 32876c08fe..c1d5af64ef 100644 --- a/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs +++ b/framework/test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs @@ -712,5 +712,240 @@ namespace Volo.Abp.Caching (await personCache.GetAsync("john")).Name.ShouldBe("John Nash"); (await personCache.GetAsync("baris")).ShouldBeNull(); } + + [Fact] + public async Task Should_Get_And_Add_Multiple_Items_Async() + { + var testkey = "testkey"; + var testkey2 = "testkey2"; + + var testkey3 = new[] {testkey, testkey2}; + var personCache = GetRequiredService>(); + + await personCache.SetAsync(testkey, new PersonCacheItem("john")); + + var cacheValue = await personCache.GetManyAsync(testkey3); + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.Name.ShouldBe("john"); + cacheValue[1].Value.ShouldBeNull(); + + cacheValue = await personCache.GetOrAddManyAsync(testkey3, (missingKeys) => + { + var missingKeyArray = missingKeys.ToArray(); + missingKeyArray.Length.ShouldBe(1); + missingKeyArray[0].ShouldBe(testkey2); + + return Task.FromResult(new List> + { + new(testkey2, new PersonCacheItem("jack")) + }); + }); + + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.Name.ShouldBe("john"); + cacheValue[1].Value.Name.ShouldBe("jack"); + + cacheValue = await personCache.GetManyAsync(testkey3); + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.Name.ShouldBe("john"); + cacheValue[1].Value.Name.ShouldBe("jack"); + } + + [Fact] + public async Task Cache_Should_Only_Available_In_Uow_For_GetOrAddManyAsync() + { + var testkey = "testkey"; + var testkey2 = "testkey2"; + + var testkey3 = new[] {testkey, testkey2}; + + using (var uow = GetRequiredService().Begin()) + { + var personCache = GetRequiredService>(); + + var cacheValue = await personCache.GetOrAddManyAsync(testkey3, (missingKeys) => Task.FromResult(new List> + { + new(testkey, new PersonCacheItem("john")), + new(testkey2, new PersonCacheItem("jack")), + }), considerUow: true); + + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.Name.ShouldBe("john"); + cacheValue[1].Value.Name.ShouldBe("jack"); + + cacheValue = await personCache.GetManyAsync(testkey3, considerUow: true); + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.Name.ShouldBe("john"); + cacheValue[1].Value.Name.ShouldBe("jack"); + + cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false); + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.ShouldBeNull(); + cacheValue[1].Value.ShouldBeNull(); + + uow.OnCompleted(async () => + { + cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false); + cacheValue.ShouldNotBeNull(); + cacheValue[0].Value.Name.ShouldBe("john"); + cacheValue[1].Value.Name.ShouldBe("jack"); + }); + + await uow.CompleteAsync(); + } + } + + [Fact] + public async Task Cache_Should_Rollback_With_Uow_For_GetOrAddManyAsync() + { + var testkey = "testkey"; + var testkey2 = "testkey2"; + + var testkey3 = new[] {testkey, testkey2}; + + var personCache = GetRequiredService>(); + + var cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false); + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.ShouldBeNull(); + cacheValue[1].Value.ShouldBeNull(); + + using (var uow = GetRequiredService().Begin()) + { + cacheValue = await personCache.GetOrAddManyAsync(testkey3, (missingKeys) => Task.FromResult(new List> + { + new(testkey, new PersonCacheItem("john")), + new(testkey2, new PersonCacheItem("jack")), + }), considerUow: true); + + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.Name.ShouldBe("john"); + cacheValue[1].Value.Name.ShouldBe("jack"); + + cacheValue = await personCache.GetManyAsync(testkey3, considerUow: true); + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.Name.ShouldBe("john"); + cacheValue[1].Value.Name.ShouldBe("jack"); + + cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false); + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.ShouldBeNull(); + cacheValue[1].Value.ShouldBeNull(); + } + + cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false); + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.ShouldBeNull(); + cacheValue[1].Value.ShouldBeNull(); + } + + [Fact] + public async Task Should_Remove_Multiple_Items_Async() + { + var testkey = "testkey"; + var testkey2 = "testkey2"; + var testkey3 = new[] {testkey, testkey2}; + + var personCache = GetRequiredService>(); + + await personCache.SetManyAsync(new List> + { + new(testkey, new PersonCacheItem("john")), + new(testkey2, new PersonCacheItem("jack")) + }); + + await personCache.RemoveManyAsync(testkey3); + + var cacheValue = await personCache.GetManyAsync(testkey3); + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.ShouldBeNull(); + cacheValue[1].Value.ShouldBeNull(); + } + + [Fact] + public async Task Cache_Should_Only_Available_In_Uow_For_RemoveManyAsync() + { + var testkey = "testkey"; + var testkey2 = "testkey2"; + var testkey3 = new[] {testkey, testkey2}; + var personCache = GetRequiredService>(); + + var cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false); + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.ShouldBeNull(); + cacheValue[1].Value.ShouldBeNull(); + + using (var uow = GetRequiredService().Begin()) + { + await personCache.SetManyAsync(new List> + { + new(testkey, new PersonCacheItem("john")), + new(testkey2, new PersonCacheItem("jack")) + }); + + cacheValue = await personCache.GetManyAsync(testkey3, considerUow: true); + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.Name.ShouldBe("john"); + cacheValue[1].Value.Name.ShouldBe("jack"); + + await personCache.RemoveManyAsync(testkey3, considerUow: true); + + cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false); + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.Name.ShouldBe("john"); + cacheValue[1].Value.Name.ShouldBe("jack"); + + uow.OnCompleted(async () => + { + cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false); + cacheValue.ShouldNotBeNull(); + cacheValue[0].Value.ShouldBeNull(); + cacheValue[1].Value.ShouldBeNull(); + }); + + await uow.CompleteAsync(); + } + + } + + [Fact] + public async Task Cache_Should_Rollback_With_Uow_For_RemoveManyAsync() + { + var testkey = "testkey"; + var testkey2 = "testkey2"; + var testkey3 = new[] {testkey, testkey2}; + var personCache = GetRequiredService>(); + + var cacheValue = await personCache.GetManyAsync(testkey3, considerUow: false); + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.ShouldBeNull(); + cacheValue[1].Value.ShouldBeNull(); + + using (var uow = GetRequiredService().Begin()) + { + await personCache.SetManyAsync(new List> + { + new(testkey, new PersonCacheItem("john")), + new(testkey2, new PersonCacheItem("jack")) + }, considerUow: true); + + cacheValue = await personCache.GetManyAsync(testkey3, considerUow: true); + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.Name.ShouldBe("john"); + cacheValue[1].Value.Name.ShouldBe("jack"); + + await personCache.RemoveManyAsync(testkey3, considerUow: true); + + cacheValue = await personCache.GetManyAsync(testkey3, considerUow: true); + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.ShouldBeNull(); + cacheValue[1].Value.ShouldBeNull(); + } + + cacheValue = await personCache.GetManyAsync(testkey3, considerUow: true); + cacheValue.Length.ShouldBe(2); + cacheValue[0].Value.ShouldBeNull(); + cacheValue[1].Value.ShouldBeNull(); + } } }