aboutsummaryrefslogtreecommitdiffstats
path: root/evict_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'evict_test.go')
-rw-r--r--evict_test.go200
1 files changed, 107 insertions, 93 deletions
diff --git a/evict_test.go b/evict_test.go
index 1813e94..5938b51 100644
--- a/evict_test.go
+++ b/evict_test.go
@@ -3,33 +3,55 @@ package cache
import (
"testing"
"time"
-
- "github.com/stretchr/testify/assert"
)
-func createSentinel(t testing.TB) *node {
- t.Helper()
+func createSentinel(tb testing.TB) *node {
+ tb.Helper()
+
n1 := &node{Key: []byte("Sentinel")}
n1.EvictNext = n1
n1.EvictPrev = n1
+
return n1
}
-func getListOrder(t testing.TB, evict *node) []*node {
- t.Helper()
+func getListOrder(tb testing.TB, evict *node) []*node {
+ tb.Helper()
var order []*node
+
current := evict.EvictNext
for current != evict {
order = append(order, current)
current = current.EvictNext
}
+
for _, n := range order {
- assert.Same(t, n, n.EvictPrev.EvictNext)
+ tb.Helper()
+ if n != n.EvictPrev.EvictNext {
+ tb.Fatalf("expected %#v, got %#v", n, n.EvictPrev.EvictNext)
+ }
}
+
return order
}
+func checkOrder(tb testing.TB, policy evictOrderedPolicy, expected []*node) {
+ tb.Helper()
+
+ order := getListOrder(tb, policy.getEvict())
+
+ if len(order) != len(expected) {
+ tb.Errorf("expected length %v, got %v", len(expected), len(order))
+ }
+
+ for i, n := range expected {
+ if order[i] != n {
+ tb.Errorf("element %v did not match: \nexpected: %#v\n got: %#v", i, n, order[i])
+ }
+ }
+}
+
func TestFIFOPolicy(t *testing.T) {
t.Parallel()
@@ -41,13 +63,10 @@ func TestFIFOPolicy(t *testing.T) {
n0 := &node{Key: []byte("0")}
n1 := &node{Key: []byte("1")}
- policy.OnInsert(n0)
policy.OnInsert(n1)
+ policy.OnInsert(n0)
- order := getListOrder(t, policy.evict)
- assert.Len(t, order, 2)
- assert.Same(t, order[0], n1)
- assert.Same(t, order[1], n0)
+ checkOrder(t, policy, []*node{n0, n1})
})
t.Run("Evict", func(t *testing.T) {
@@ -65,7 +84,9 @@ func TestFIFOPolicy(t *testing.T) {
policy.OnInsert(n1)
evictedNode := policy.Evict()
- assert.Same(t, n0, evictedNode)
+ if n0 != evictedNode {
+ t.Errorf("expected %#v, got %#v", n0, evictedNode)
+ }
})
t.Run("Evict noEvict", func(t *testing.T) {
@@ -75,50 +96,25 @@ func TestFIFOPolicy(t *testing.T) {
policy.OnInsert(&node{})
- assert.Nil(t, policy.Evict())
+ if policy.Evict() != nil {
+ t.Errorf("expected nil, got %#v", policy.Evict())
+ }
})
t.Run("Empty List", func(t *testing.T) {
t.Parallel()
policy := fifoPolicy{evict: createSentinel(t)}
-
- assert.Nil(t, policy.Evict())
+ if policy.Evict() != nil {
+ t.Errorf("expected nil, got %#v", policy.Evict())
+ }
})
})
-
- t.Run("Eviction Order", func(t *testing.T) {
- t.Parallel()
-
- policy := lfuPolicy{evict: createSentinel(t)}
-
- n0 := &node{Key: []byte("0"), Access: 1}
- n1 := &node{Key: []byte("1"), Access: 1}
-
- policy.OnInsert(n0)
- policy.OnInsert(n1)
-
- evictedNode := policy.Evict()
- assert.Same(t, n0, evictedNode) // Assuming FIFO order for same access count
- })
-
- t.Run("With Zero TTL", func(t *testing.T) {
- t.Parallel()
-
- policy := ltrPolicy{evict: createSentinel(t), evictZero: false}
-
- n0 := &node{Key: []byte("0"), Expiration: time.Time{}}
- n1 := &node{Key: []byte("1"), Expiration: time.Now().Add(1 * time.Hour)}
-
- policy.OnInsert(n0)
- policy.OnInsert(n1)
-
- evictedNode := policy.Evict()
- assert.Same(t, n1, evictedNode) // n0 should not be evicted due to zero TTL
- })
}
func TestLRUPolicy(t *testing.T) {
+ t.Parallel()
+
t.Run("OnInsert", func(t *testing.T) {
t.Parallel()
@@ -130,10 +126,7 @@ func TestLRUPolicy(t *testing.T) {
policy.OnInsert(n0)
policy.OnInsert(n1)
- order := getListOrder(t, policy.evict)
- assert.Len(t, order, 2)
- assert.Same(t, order[0], n1)
- assert.Same(t, order[1], n0)
+ checkOrder(t, policy, []*node{n1, n0})
})
t.Run("OnAccess", func(t *testing.T) {
@@ -149,10 +142,7 @@ func TestLRUPolicy(t *testing.T) {
policy.OnAccess(n0)
- order := getListOrder(t, policy.evict)
- assert.Len(t, order, 2)
- assert.Same(t, order[0], n0)
- assert.Same(t, order[1], n1)
+ checkOrder(t, policy, []*node{n0, n1})
})
t.Run("Evict", func(t *testing.T) {
@@ -170,7 +160,9 @@ func TestLRUPolicy(t *testing.T) {
policy.OnInsert(n1)
evictedNode := policy.Evict()
- assert.Same(t, n0, evictedNode)
+ if n0 != evictedNode {
+ t.Errorf("expected %#v, got %#v", n0, evictedNode)
+ }
})
t.Run("OnAccess End", func(t *testing.T) {
@@ -187,7 +179,9 @@ func TestLRUPolicy(t *testing.T) {
policy.OnAccess(n0)
evictedNode := policy.Evict()
- assert.Same(t, n1, evictedNode)
+ if n1 != evictedNode {
+ t.Errorf("expected %#v, got %#v", n1, evictedNode)
+ }
})
t.Run("OnAccess Interleaved", func(t *testing.T) {
@@ -203,15 +197,19 @@ func TestLRUPolicy(t *testing.T) {
policy.OnInsert(n1)
evictedNode := policy.Evict()
- assert.Same(t, n0, evictedNode)
+
+ if n0 != evictedNode {
+ t.Errorf("expected %#v, got %#v", n0, evictedNode)
+ }
})
t.Run("Empty", func(t *testing.T) {
t.Parallel()
policy := lruPolicy{evict: createSentinel(t)}
-
- assert.Nil(t, policy.Evict())
+ if policy.Evict() != nil {
+ t.Errorf("expected nil, got %#v", policy.Evict())
+ }
})
})
}
@@ -230,10 +228,7 @@ func TestLFUPolicy(t *testing.T) {
policy.OnInsert(n0)
policy.OnInsert(n1)
- order := getListOrder(t, policy.evict)
- assert.Len(t, order, 2)
- assert.Contains(t, order, n0)
- assert.Contains(t, order, n1)
+ checkOrder(t, policy, []*node{n1, n0})
})
t.Run("OnAccess", func(t *testing.T) {
@@ -249,10 +244,7 @@ func TestLFUPolicy(t *testing.T) {
policy.OnAccess(n0)
- order := getListOrder(t, policy.evict)
- assert.Len(t, order, 2)
- assert.Same(t, order[0], n0)
- assert.Same(t, order[1], n1)
+ checkOrder(t, policy, []*node{n0, n1})
})
t.Run("Evict", func(t *testing.T) {
@@ -272,7 +264,9 @@ func TestLFUPolicy(t *testing.T) {
policy.OnAccess(n0)
evictedNode := policy.Evict()
- assert.Same(t, n1, evictedNode)
+ if n1 != evictedNode {
+ t.Errorf("expected %#v, got %#v", n1, evictedNode)
+ }
})
t.Run("Evict After Multiple Accesses", func(t *testing.T) {
@@ -292,15 +286,19 @@ func TestLFUPolicy(t *testing.T) {
policy.OnAccess(n1)
evictedNode := policy.Evict()
- assert.Same(t, n0, evictedNode)
+
+ if n0 != evictedNode {
+ t.Errorf("expected %#v, got %#v", n0, evictedNode)
+ }
})
t.Run("Empty List", func(t *testing.T) {
t.Parallel()
policy := lfuPolicy{evict: createSentinel(t)}
-
- assert.Nil(t, policy.Evict())
+ if policy.Evict() != nil {
+ t.Errorf("expected nil, got %#v", policy.Evict())
+ }
})
})
}
@@ -322,10 +320,7 @@ func TestLTRPolicy(t *testing.T) {
policy.OnInsert(n0)
policy.OnInsert(n1)
- order := getListOrder(t, policy.evict)
- assert.Len(t, order, 2)
- assert.Same(t, n0, order[0])
- assert.Same(t, n1, order[1])
+ checkOrder(t, policy, []*node{n0, n1})
})
t.Run("Without TTL", func(t *testing.T) {
@@ -339,10 +334,7 @@ func TestLTRPolicy(t *testing.T) {
policy.OnInsert(n0)
policy.OnInsert(n1)
- order := getListOrder(t, policy.evict)
- assert.Len(t, order, 2)
- assert.Same(t, n1, order[0])
- assert.Same(t, n0, order[1])
+ checkOrder(t, policy, []*node{n1, n0})
})
})
@@ -363,10 +355,7 @@ func TestLTRPolicy(t *testing.T) {
n0.Expiration = time.Now().Add(3 * time.Hour)
policy.OnUpdate(n0)
- order := getListOrder(t, policy.evict)
- assert.Len(t, order, 2)
- assert.Same(t, n0, order[1])
- assert.Same(t, n1, order[0])
+ checkOrder(t, policy, []*node{n1, n0})
})
t.Run("With TTL Decrease", func(t *testing.T) {
@@ -383,10 +372,7 @@ func TestLTRPolicy(t *testing.T) {
n1.Expiration = time.Now().Add(30 * time.Minute)
policy.OnUpdate(n1)
- order := getListOrder(t, policy.evict)
- assert.Len(t, order, 2)
- assert.Same(t, n1, order[1])
- assert.Same(t, n0, order[0])
+ checkOrder(t, policy, []*node{n0, n1})
})
})
@@ -405,7 +391,25 @@ func TestLTRPolicy(t *testing.T) {
policy.OnInsert(n1)
evictedNode := policy.Evict()
- assert.Same(t, n0, evictedNode)
+ if n0 != evictedNode {
+ t.Errorf("expected %#v, got %#v", n0, evictedNode)
+ }
+ })
+
+ t.Run("no evictZero", func(t *testing.T) {
+ t.Parallel()
+
+ policy := ltrPolicy{evict: createSentinel(t), evictZero: false}
+
+ n0 := &node{Key: []byte("0")}
+ n1 := &node{Key: []byte("1")}
+
+ policy.OnInsert(n0)
+ policy.OnInsert(n1)
+
+ if policy.Evict() != nil {
+ t.Errorf("expected nil, got %#v", policy.Evict())
+ }
})
t.Run("Evict TTL", func(t *testing.T) {
@@ -420,7 +424,10 @@ func TestLTRPolicy(t *testing.T) {
policy.OnInsert(n1)
evictedNode := policy.Evict()
- assert.Same(t, n1, evictedNode)
+
+ if n1 != evictedNode {
+ t.Errorf("expected %#v, got %#v", n0, evictedNode)
+ }
})
t.Run("Evict TTL Update", func(t *testing.T) {
@@ -438,7 +445,10 @@ func TestLTRPolicy(t *testing.T) {
policy.OnUpdate(n0)
evictedNode := policy.Evict()
- assert.Same(t, n0, evictedNode)
+
+ if n0 != evictedNode {
+ t.Errorf("expected %#v, got %#v", n0, evictedNode)
+ }
})
t.Run("Evict TTL Update Down", func(t *testing.T) {
@@ -456,15 +466,19 @@ func TestLTRPolicy(t *testing.T) {
policy.OnUpdate(n1)
evictedNode := policy.Evict()
- assert.Same(t, n1, evictedNode)
+
+ if n1 != evictedNode {
+ t.Errorf("expected %#v, got %#v", n0, evictedNode)
+ }
})
t.Run("Empty List", func(t *testing.T) {
t.Parallel()
policy := ltrPolicy{evict: createSentinel(t), evictZero: true}
-
- assert.Nil(t, policy.Evict())
+ if policy.Evict() != nil {
+ t.Errorf("expected nil, got %#v", policy.Evict())
+ }
})
})
}