diff --git a/BitFaster.Caching.UnitTests/Atomic/AtomicFactorySoakTests.cs b/BitFaster.Caching.UnitTests/Atomic/AtomicFactorySoakTests.cs new file mode 100644 index 00000000..ca13cc3f --- /dev/null +++ b/BitFaster.Caching.UnitTests/Atomic/AtomicFactorySoakTests.cs @@ -0,0 +1,30 @@ +using System.Linq; +using System.Threading.Tasks; +using BitFaster.Caching.Lru; +using FluentAssertions; +using Xunit; + +namespace BitFaster.Caching.UnitTests.Atomic +{ + [Collection("Soak")] + public class AtomicFactorySoakTests + { + [Fact] + public async Task WhenGetOrAddIsConcurrentValuesCreatedAtomically() + { + var cache = new ConcurrentLruBuilder().WithAtomicGetOrAdd().WithCapacity(1024).Build(); + + var counters = new int[4]; + + await Threaded.Run(4, (r) => + { + for (int i = 0; i < 1024; i++) + { + cache.GetOrAdd(i, k => { counters[r]++; return k; }); + } + }); + + counters.Sum(x => x).Should().Be(1024); + } + } +}