Skip to content

Commit 6d8fbe4

Browse files
committed
Add tests for single-item cache bug in v3.0.7
The intrinsic linked list change (61f5066) introduced a bug where items with next==nil && prev==nil are incorrectly detected as "not in list". This affects the first/only item in the cache: - Promotion treats it as new, double-counting size - Deletion skips size decrement and onDelete callback
1 parent 8fc5b99 commit 6d8fbe4

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

layeredcache_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,41 @@ func Test_LayedCache_OnDeleteCallbackCalled(t *testing.T) {
163163
assert.Equal(t, atomic.LoadInt32(&onDeleteFnCalled), 1)
164164
}
165165

166+
func Test_LayeredCache_SingleItemSizeAccounting(t *testing.T) {
167+
cache := Layered(Configure[*SizedItem]().GetsPerPromote(1))
168+
defer cache.Stop()
169+
170+
cache.Set("group", "only", &SizedItem{1, 10}, time.Minute)
171+
cache.SyncUpdates()
172+
assert.Equal(t, cache.GetSize(), 10)
173+
174+
cache.Get("group", "only")
175+
cache.Get("group", "only")
176+
cache.SyncUpdates()
177+
assert.Equal(t, cache.GetSize(), 10)
178+
}
179+
180+
func Test_LayeredCache_SingleItemDelete(t *testing.T) {
181+
onDeleteCalled := int32(0)
182+
onDeleteFn := func(item *Item[string]) {
183+
atomic.AddInt32(&onDeleteCalled, 1)
184+
}
185+
186+
cache := Layered(Configure[string]().OnDelete(onDeleteFn))
187+
defer cache.Stop()
188+
189+
cache.Set("group", "only", "value", time.Minute)
190+
cache.SyncUpdates()
191+
assert.Equal(t, cache.GetSize(), 1)
192+
193+
cache.Delete("group", "only")
194+
cache.SyncUpdates()
195+
196+
assert.Equal(t, cache.Get("group", "only"), nil)
197+
assert.Equal(t, atomic.LoadInt32(&onDeleteCalled), 1)
198+
assert.Equal(t, cache.GetSize(), 0)
199+
}
200+
166201
func Test_LayedCache_DeletesALayer(t *testing.T) {
167202
cache := newLayered[string]()
168203
defer cache.Stop()

0 commit comments

Comments
 (0)