1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
package cache
import (
"context"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
const (
key = 1
itemVal = 123
)
func TestEntry(t *testing.T) {
c := New[int, int](time.Minute)
expires := time.Now().Add(time.Hour)
checkEntry := func() {
entry := c.GetOrCreateCacheEntry(key)
entry.Lock(context.Background())
defer entry.Unlock()
assert.True(t, entry.HasItem)
assert.False(t, entry.IsExpiredLocked(time.Now()))
assert.False(t, entry.IsNeedRefreshLocked())
assert.Equal(t, itemVal, entry.Item)
assert.Equal(t, expires, entry.Expires)
}
entry := c.GetOrCreateCacheEntry(key)
entry.Lock(context.Background())
defer entry.Unlock()
go checkEntry() // started while holding the lock
assert.False(t, entry.HasItem)
assert.True(t, entry.IsExpiredLocked(time.Now()))
assert.True(t, entry.IsNeedRefreshLocked())
entry.Item = itemVal
entry.HasItem = true
entry.Expires = expires
}
func TestEvictExpiredEntries_RemovesExpired(t *testing.T) {
c := New[int, int](time.Minute)
func() { // init entry
entry := c.GetOrCreateCacheEntry(key)
entry.Lock(context.Background())
defer entry.Unlock()
entry.Item = itemVal
entry.HasItem = true
entry.Expires = time.Now().Add(-time.Second)
}()
c.EvictExpiredEntries()
entry := c.GetOrCreateCacheEntry(key)
entry.Lock(context.Background())
defer entry.Unlock()
assert.Zero(t, entry.Item)
assert.Zero(t, entry.Expires)
}
func TestEvictExpiredEntries_IgnoresBusy(t *testing.T) {
c := New[int, int](time.Minute)
expires := time.Now().Add(-time.Second)
func() {
entry := c.GetOrCreateCacheEntry(key)
entry.Lock(context.Background())
defer entry.Unlock()
entry.Expires = expires
entry.Item = itemVal
entry.HasItem = true
c.EvictExpiredEntries() // evict while locked
}()
entry := c.GetOrCreateCacheEntry(key)
entry.Lock(context.Background())
defer entry.Unlock()
assert.Equal(t, itemVal, entry.Item)
assert.Equal(t, expires, entry.Expires)
}
|