diff --git a/BitFaster.Caching.UnitTests/Lru/FastConcurrentLruTests.cs b/BitFaster.Caching.UnitTests/Lru/FastConcurrentLruTests.cs index 4083e0fd..9c009f7c 100644 --- a/BitFaster.Caching.UnitTests/Lru/FastConcurrentLruTests.cs +++ b/BitFaster.Caching.UnitTests/Lru/FastConcurrentLruTests.cs @@ -2,7 +2,6 @@ using BitFaster.Caching.Lru; using System; using System.Collections.Generic; -using System.Text; using Xunit; namespace BitFaster.Caching.UnitTests.Lru @@ -35,5 +34,21 @@ public void ConstructPartitionCtorReturnsCapacity() x.Capacity.Should().Be(3); } + + [Fact] + public void MetricsHasValueIsFalse() + { + var x = new FastConcurrentLru(3); + + x.Metrics.HasValue.Should().BeFalse(); + } + + [Fact] + public void EventsHasValueIsFalse() + { + var x = new FastConcurrentLru(3); + + x.Events.HasValue.Should().BeFalse(); + } } } diff --git a/BitFaster.Caching.UnitTests/Lru/FastConcurrentTLruTests.cs b/BitFaster.Caching.UnitTests/Lru/FastConcurrentTLruTests.cs index 188c15b3..39b92577 100644 --- a/BitFaster.Caching.UnitTests/Lru/FastConcurrentTLruTests.cs +++ b/BitFaster.Caching.UnitTests/Lru/FastConcurrentTLruTests.cs @@ -53,5 +53,21 @@ public async Task WhenItemsAreExpiredExpireRemovesExpiredItems() lru.Count.Should().Be(0); } + + [Fact] + public void MetricsHasValueIsFalse() + { + var x = new FastConcurrentTLru(3, TimeSpan.FromSeconds(1)); + + x.Metrics.HasValue.Should().BeFalse(); + } + + [Fact] + public void EventsHasValueIsFalse() + { + var x = new FastConcurrentTLru(3, TimeSpan.FromSeconds(1)); + + x.Events.HasValue.Should().BeFalse(); + } } } diff --git a/BitFaster.Caching/Lru/ConcurrentLruCore.cs b/BitFaster.Caching/Lru/ConcurrentLruCore.cs index d3c74a1f..e6b81123 100644 --- a/BitFaster.Caching/Lru/ConcurrentLruCore.cs +++ b/BitFaster.Caching/Lru/ConcurrentLruCore.cs @@ -104,10 +104,10 @@ public ConcurrentLruCore( public int Capacity => this.capacity.Hot + this.capacity.Warm + this.capacity.Cold; /// - public Optional Metrics => new(new Proxy(this)); + public Optional Metrics => CreateMetrics(this); /// - public Optional> Events => new(new Proxy(this)); + public Optional> Events => CreateEvents(this); /// public CachePolicy Policy => CreatePolicy(this); @@ -782,6 +782,26 @@ private static CachePolicy CreatePolicy(ConcurrentLruCore lru) return new CachePolicy(new Optional(p), lru.itemPolicy.CanDiscard() ? new Optional(p) : Optional.None()); } + private static Optional CreateMetrics(ConcurrentLruCore lru) + { + if (typeof(T) == typeof(NoTelemetryPolicy)) + { + return Optional.None(); + } + + return new(new Proxy(lru)); + } + + private static Optional> CreateEvents(ConcurrentLruCore lru) + { + if (typeof(T) == typeof(NoTelemetryPolicy)) + { + return Optional>.None(); + } + + return new(new Proxy(lru)); + } + // To get JIT optimizations, policies must be structs. // If the structs are returned directly via properties, they will be copied. Since // telemetryPolicy is a mutable struct, copy is bad. One workaround is to store the