Skip to content

Commit 4320996

Browse files
authored
Fix back compat issues against v2.0.0 (#344)
* event * fix all issues * fix tests * annotate backcompat * cleanup proj * interface tests * interface tests * cleanup TLRU * fix net48 test * range checks ---------
1 parent ab780a6 commit 4320996

30 files changed

+338
-156
lines changed

BitFaster.Caching.Benchmarks/Lru/TLruTimeBenchmark.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ private static readonly ConcurrentLruCore<int, int, TickCountLruItem<int, int>,
2222
= new ConcurrentLruCore<int, int, TickCountLruItem<int, int>, TLruTicksPolicy<int, int>, NoTelemetryPolicy<int, int>>
2323
(1, new EqualCapacityPartition(3), EqualityComparer<int>.Default, new TLruTicksPolicy<int, int>(TimeSpan.FromSeconds(1)), default);
2424

25-
private static readonly ConcurrentLruCore<int, int, LongTickCountLruItem<int, int>, TlruStopwatchPolicy<int, int>, NoTelemetryPolicy<int, int>> stopwatchTLru
26-
= new ConcurrentLruCore<int, int, LongTickCountLruItem<int, int>, TlruStopwatchPolicy<int, int>, NoTelemetryPolicy<int, int>>
27-
(1, new EqualCapacityPartition(3), EqualityComparer<int>.Default, new TlruStopwatchPolicy<int, int>(TimeSpan.FromSeconds(1)), default);
25+
private static readonly ConcurrentLruCore<int, int, LongTickCountLruItem<int, int>, TLruLongTicksPolicy<int, int>, NoTelemetryPolicy<int, int>> stopwatchTLru
26+
= new ConcurrentLruCore<int, int, LongTickCountLruItem<int, int>, TLruLongTicksPolicy<int, int>, NoTelemetryPolicy<int, int>>
27+
(1, new EqualCapacityPartition(3), EqualityComparer<int>.Default, new TLruLongTicksPolicy<int, int>(TimeSpan.FromSeconds(1)), default);
2828

2929
[Benchmark(Baseline = true)]
3030
public void DateTimeUtcNow()

BitFaster.Caching.UnitTests/Atomic/AtomicFactoryAsyncCacheTests.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ public void WhenRemovedEventHandlerIsRegisteredItIsFired()
7676
this.removedItems.First().Key.Should().Be(1);
7777
}
7878

79+
// backcompat: remove conditional compile
80+
#if NETCOREAPP3_0_OR_GREATER
7981
[Fact]
8082
public void WhenUpdatedEventHandlerIsRegisteredItIsFired()
8183
{
@@ -88,6 +90,7 @@ public void WhenUpdatedEventHandlerIsRegisteredItIsFired()
8890
this.updatedItems.First().OldValue.Should().Be(2);
8991
this.updatedItems.First().NewValue.Should().Be(3);
9092
}
93+
#endif
9194

9295
[Fact]
9396
public void WhenKeyDoesNotExistAddOrUpdateAddsNewItem()

BitFaster.Caching.UnitTests/Atomic/AtomicFactoryCacheTests.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ public void WhenRemovedEventHandlerIsRegisteredItIsFired()
6565
this.removedItems.First().Key.Should().Be(1);
6666
}
6767

68+
// backcompat: remove conditional compile
69+
#if NETCOREAPP3_0_OR_GREATER
6870
[Fact]
6971
public void WhenUpdatedEventHandlerIsRegisteredItIsFired()
7072
{
@@ -77,7 +79,7 @@ public void WhenUpdatedEventHandlerIsRegisteredItIsFired()
7779
this.updatedItems.First().OldValue.Should().Be(2);
7880
this.updatedItems.First().NewValue.Should().Be(3);
7981
}
80-
82+
#endif
8183
[Fact]
8284
public void WhenNoInnerEventsNoOuterEvents()
8385
{

BitFaster.Caching.UnitTests/CacheEventProxyBaseTests.cs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ public void WhenTwoRemovedEventHandlersAddedThenOneRemovedEventIsFired()
5454
this.removedItems.First().Key.Should().Be(1);
5555
}
5656

57+
// backcompat: remove conditional compile
58+
#if NETCOREAPP3_0_OR_GREATER
5759
[Fact]
5860
public void WheUpdatedEventHandlerIsRegisteredItIsFired()
5961
{
@@ -88,7 +90,7 @@ public void WhenTwoUpdatedEventHandlersAddedThenOneRemovedEventIsFired()
8890

8991
this.updatedItems.First().Key.Should().Be(1);
9092
}
91-
93+
#endif
9294
private void OnItemRemoved(object sender, ItemRemovedEventArgs<int, int> e)
9395
{
9496
this.removedItems.Add(e);
@@ -142,5 +144,36 @@ protected override ItemUpdatedEventArgs<K, V> TranslateOnUpdated(ItemUpdatedEven
142144
return new ItemUpdatedEventArgs<K, V>(inner.Key, inner.OldValue.ValueIfCreated, inner.NewValue.ValueIfCreated);
143145
}
144146
}
147+
148+
// backcompat: remove (virtual method with default impl only needed for back compat)
149+
[Fact]
150+
public void WhenUpdatedEventHandlerIsRegisteredAndProxyUsesDefaultUpdateTranslateItIsFired()
151+
{
152+
var proxy = new EventProxyWithDefault<int, int>(this.testCacheEvents);
153+
154+
proxy.ItemUpdated += OnItemUpdated;
155+
156+
this.testCacheEvents.FireUpdated(1, new AtomicFactory<int, int>(2), new AtomicFactory<int, int>(3));
157+
158+
#if NETCOREAPP3_0_OR_GREATER
159+
this.updatedItems.First().Key.Should().Be(1);
160+
#else
161+
this.updatedItems.Should().BeEmpty();
162+
#endif
163+
}
164+
165+
// backcompat: remove (class uses default TranslateOnUpdated method)
166+
private class EventProxyWithDefault<K, V> : CacheEventProxyBase<K, AtomicFactory<K, V>, V>
167+
{
168+
public EventProxyWithDefault(ICacheEvents<K, AtomicFactory<K, V>> inner)
169+
: base(inner)
170+
{
171+
}
172+
173+
protected override ItemRemovedEventArgs<K, V> TranslateOnRemoved(ItemRemovedEventArgs<K, AtomicFactory<K, V>> inner)
174+
{
175+
return new ItemRemovedEventArgs<K, V>(inner.Key, inner.Value.ValueIfCreated, inner.Reason);
176+
}
177+
}
145178
}
146179
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+

2+
using Moq;
3+
using Xunit;
4+
5+
namespace BitFaster.Caching.UnitTests
6+
{
7+
// backcompat: remove
8+
#if NETCOREAPP3_1_OR_GREATER
9+
public class CacheEventsTests
10+
{
11+
[Fact]
12+
public void WhenInterfaceDefaultItemUpdatedRegisteredNoOp()
13+
{
14+
var metrics = new Mock<ICacheEvents<int, int>>();
15+
metrics.CallBase = true;
16+
17+
metrics.Object.ItemUpdated += NoOpItemUpdated;
18+
metrics.Object.ItemUpdated -= NoOpItemUpdated;
19+
}
20+
21+
private void NoOpItemUpdated(object sender, ItemUpdatedEventArgs<int, int> e)
22+
{
23+
}
24+
}
25+
#endif
26+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+

2+
using FluentAssertions;
3+
using Moq;
4+
using Xunit;
5+
6+
namespace BitFaster.Caching.UnitTests
7+
{
8+
// backcompat: remove
9+
#if NETCOREAPP3_1_OR_GREATER
10+
public class CacheMetricsTests
11+
{
12+
[Fact]
13+
public void WhenInterfaceDefaultUpdatedInvokedReturnZero()
14+
{
15+
var metrics = new Mock<ICacheMetrics>();
16+
metrics.CallBase = true;
17+
18+
metrics.Object.Updated.Should().Be(0);
19+
}
20+
}
21+
#endif
22+
}

BitFaster.Caching.UnitTests/Lfu/ConcurrentLfuTests.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,8 @@ public void WhenWriteBufferIsFullAddDoesMaintenance()
432432
cache.TryGet(-1, out var _).Should().BeFalse();
433433
}
434434

435+
// backcompat: remove conditional compile
436+
#if NETCOREAPP3_0_OR_GREATER
435437
[Fact]
436438
public void WhenWriteBufferIsFullUpdatesAreDropped()
437439
{
@@ -453,6 +455,7 @@ public void WhenWriteBufferIsFullUpdatesAreDropped()
453455

454456
cache.Metrics.Value.Updated.Should().Be(bufferSize);
455457
}
458+
#endif
456459

457460
[Fact]
458461
public void EvictionPolicyReturnsCapacity()

BitFaster.Caching.UnitTests/Lru/ClassicLruTests.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -373,21 +373,23 @@ public void WhenKeyExistsTryUpdateUpdatesValueAndReturnsTrue()
373373
}
374374

375375
[Fact]
376-
public void WhenKeyExistsTryUpdateIncrementsUpdateCount()
376+
public void WhenKeyDoesNotExistTryUpdateReturnsFalse()
377377
{
378378
lru.GetOrAdd(1, valueFactory.Create);
379379

380-
lru.TryUpdate(1, "2").Should().BeTrue();
381-
382-
lru.Metrics.Value.Updated.Should().Be(1);
380+
lru.TryUpdate(2, "3").Should().BeFalse();
383381
}
384382

383+
// backcompat: remove conditional compile
384+
#if NETCOREAPP3_0_OR_GREATER
385385
[Fact]
386-
public void WhenKeyDoesNotExistTryUpdateReturnsFalse()
386+
public void WhenKeyExistsTryUpdateIncrementsUpdateCount()
387387
{
388388
lru.GetOrAdd(1, valueFactory.Create);
389389

390-
lru.TryUpdate(2, "3").Should().BeFalse();
390+
lru.TryUpdate(1, "2").Should().BeTrue();
391+
392+
lru.Metrics.Value.Updated.Should().Be(1);
391393
}
392394

393395
[Fact]
@@ -399,6 +401,7 @@ public void WhenKeyDoesNotExistTryUpdateDoesNotIncrementCounter()
399401

400402
lru.Metrics.Value.Updated.Should().Be(0);
401403
}
404+
#endif
402405

403406
[Fact]
404407
public void WhenKeyDoesNotExistAddOrUpdateAddsNewItem()

BitFaster.Caching.UnitTests/Lru/ConcurrentLruBuilderTests.cs

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -53,31 +53,6 @@ public void TestMetricsTLru()
5353
lru.Policy.Eviction.Value.Capacity.Should().Be(128);
5454
}
5555

56-
#if NETCOREAPP3_0_OR_GREATER
57-
[Fact]
58-
public void TestHighResClockTLru()
59-
{
60-
ICache<int, int> lru = new ConcurrentLruBuilder<int, int>()
61-
.WithExpireAfterWrite(TimeSpan.FromMilliseconds(10))
62-
.Build();
63-
64-
lru.Should().BeOfType<ConcurrentLruCore<int, int, LongTickCountLruItem<int, int>, TlruStopwatchPolicy<int, int>, NoTelemetryPolicy<int, int>>>();
65-
lru.Policy.Eviction.Value.Capacity.Should().Be(128);
66-
}
67-
68-
[Fact]
69-
public void TestHighResClockMetricsTLru()
70-
{
71-
ICache<int, int> lru = new ConcurrentLruBuilder<int, int>()
72-
.WithExpireAfterWrite(TimeSpan.FromMilliseconds(10))
73-
.WithMetrics()
74-
.Build();
75-
76-
lru.Should().BeOfType<ConcurrentLruCore<int, int, LongTickCountLruItem<int, int>, TlruStopwatchPolicy<int, int>, TelemetryPolicy<int, int>>>();
77-
lru.Policy.Eviction.Value.Capacity.Should().Be(128);
78-
}
79-
#endif
80-
8156
[Fact]
8257
public void AsAsyncTestFastLru()
8358
{

BitFaster.Caching.UnitTests/Lru/ConcurrentLruTests.cs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -642,21 +642,23 @@ public void WhenKeyExistsTryUpdateDisposesOldValue()
642642
}
643643

644644
[Fact]
645-
public void WhenKeyExistsTryUpdateIncrementsUpdateCount()
645+
public void WhenKeyDoesNotExistTryUpdateReturnsFalse()
646646
{
647647
lru.GetOrAdd(1, valueFactory.Create);
648648

649-
lru.TryUpdate(1, "2").Should().BeTrue();
650-
651-
lru.Metrics.Value.Updated.Should().Be(1);
649+
lru.TryUpdate(2, "3").Should().BeFalse();
652650
}
653651

652+
// backcompat: remove conditional compile
653+
#if NETCOREAPP3_0_OR_GREATER
654654
[Fact]
655-
public void WhenKeyDoesNotExistTryUpdateReturnsFalse()
655+
public void WhenKeyExistsTryUpdateIncrementsUpdateCount()
656656
{
657657
lru.GetOrAdd(1, valueFactory.Create);
658658

659-
lru.TryUpdate(2, "3").Should().BeFalse();
659+
lru.TryUpdate(1, "2").Should().BeTrue();
660+
661+
lru.Metrics.Value.Updated.Should().Be(1);
660662
}
661663

662664
[Fact]
@@ -668,7 +670,7 @@ public void WhenKeyDoesNotExistTryUpdateDoesNotIncrementCounter()
668670

669671
lru.Metrics.Value.Updated.Should().Be(0);
670672
}
671-
673+
#endif
672674
[Fact]
673675
public void WhenKeyDoesNotExistAddOrUpdateAddsNewItem()
674676
{
@@ -713,6 +715,8 @@ public void WhenKeyDoesNotExistAddOrUpdateMaintainsLruOrder()
713715
lru.WarmCount.Should().Be(1); // items must have been enqueued and cycled for one of them to reach the warm queue
714716
}
715717

718+
// backcompat: remove conditional compile
719+
#if NETCOREAPP3_0_OR_GREATER
716720
[Fact]
717721
public void WhenItemExistsAddOrUpdateFiresUpdateEvent()
718722
{
@@ -761,6 +765,7 @@ public void WhenItemUpdatedEventIsUnregisteredEventIsNotFired()
761765

762766
updatedItems.Count.Should().Be(0);
763767
}
768+
#endif
764769

765770
[Fact]
766771
public void WhenCacheIsEmptyClearIsNoOp()

0 commit comments

Comments
 (0)