forked from 0xPolygonHermez/zkevm-node
-
Notifications
You must be signed in to change notification settings - Fork 217
/
generic_cache_test.go
176 lines (146 loc) · 4.58 KB
/
generic_cache_test.go
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
package synchronizer
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
)
type mockTimerProvider struct {
now time.Time
}
func (m *mockTimerProvider) Now() time.Time {
return m.now
}
func TestCacheGet(t *testing.T) {
timerProvider := &mockTimerProvider{}
cache := NewCache[string, string](timerProvider, time.Hour)
// Add an item to the cache
cache.Set("key1", "value1")
// Test that the item can be retrieved from the cache
value, ok := cache.Get("key1")
assert.True(t, ok)
assert.Equal(t, "value1", value)
// Test that an item that doesn't exist in the cache returns false
_, ok = cache.Get("key2")
assert.False(t, ok)
// Test that an item that has expired is removed from the cache
timerProvider.now = time.Now().Add(2 * time.Hour)
_, ok = cache.Get("key1")
assert.False(t, ok)
}
func TestCacheSet(t *testing.T) {
timerProvider := &mockTimerProvider{}
cache := NewCache[string, string](timerProvider, time.Hour)
// Add an item to the cache
cache.Set("key1", "value1")
// Test that the item can be retrieved from the cache
value, ok := cache.Get("key1")
assert.True(t, ok)
assert.Equal(t, "value1", value)
// Test that an item that doesn't exist in the cache returns false
_, ok = cache.Get("key2")
assert.False(t, ok)
// Test that an item that has expired is removed from the cache
timerProvider.now = time.Now().Add(2 * time.Hour)
_, ok = cache.Get("key1")
assert.False(t, ok)
// Test that an item can be updated in the cache
cache.Set("key1", "value2")
value, ok = cache.Get("key1")
assert.True(t, ok)
assert.Equal(t, "value2", value)
// Test that a new item can be added to the cache
cache.Set("key2", "value3")
value, ok = cache.Get("key2")
assert.True(t, ok)
assert.Equal(t, "value3", value)
}
func TestCacheDelete(t *testing.T) {
timerProvider := &mockTimerProvider{}
cache := NewCache[string, string](timerProvider, time.Hour)
// Add an item to the cache
cache.Set("key1", "value1")
// Delete the item from the cache
cache.Delete("key1")
// Test that the item has been removed from the cache
_, ok := cache.Get("key1")
assert.False(t, ok)
// Test that deleting a non-existent item does not cause an error
cache.Delete("key2")
}
func TestCacheClear(t *testing.T) {
timerProvider := &mockTimerProvider{}
cache := NewCache[string, string](timerProvider, time.Hour)
// Add some items to the cache
cache.Set("key1", "value1")
cache.Set("key2", "value2")
cache.Set("key3", "value3")
// Clear the cache
cache.Clear()
// Test that all items have been removed from the cache
_, ok := cache.Get("key1")
assert.False(t, ok)
_, ok = cache.Get("key2")
assert.False(t, ok)
_, ok = cache.Get("key3")
assert.False(t, ok)
}
func TestCacheDeleteOutdated(t *testing.T) {
timerProvider := &mockTimerProvider{}
cache := NewCache[string, string](timerProvider, time.Hour)
now := time.Now()
timerProvider.now = now
// Add some items to the cache
cache.Set("key1", "value1")
cache.Set("key2", "value2")
timerProvider.now = now.Add(2 * time.Hour)
cache.Set("key3", "value3")
// Call DeleteOutdated to remove the outdated items
cache.DeleteOutdated()
assert.Equal(t, 1, cache.Len())
// Test that key1 and key2 have been removed, but key3 is still present
_, ok := cache.Get("key1")
assert.False(t, ok)
_, ok = cache.Get("key2")
assert.False(t, ok)
_, ok = cache.Get("key3")
assert.True(t, ok)
}
func TestCacheGetDoesntReturnsOutdatedValues(t *testing.T) {
timerProvider := &mockTimerProvider{}
cache := NewCache[string, string](timerProvider, time.Hour)
now := time.Now()
timerProvider.now = now
// Add some items to the cache
cache.Set("key1", "value1")
cache.Set("key2", "value2")
timerProvider.now = now.Add(2 * time.Hour)
cache.Set("key3", "value3")
// Test that key1 and key2 are outdated, but key3 is still present
_, ok := cache.Get("key1")
assert.False(t, ok)
_, ok = cache.Get("key2")
assert.False(t, ok)
_, ok = cache.Get("key3")
assert.True(t, ok)
}
func TestCacheGetExtendsTimeOfLiveOfItems(t *testing.T) {
timerProvider := &mockTimerProvider{}
cache := NewCache[string, string](timerProvider, time.Hour)
now := time.Now()
timerProvider.now = now
// Add some items to the cache
cache.Set("key1", "value1")
cache.Set("key2", "value2")
timerProvider.now = now.Add(59 * time.Minute)
_, ok := cache.Get("key1")
assert.True(t, ok)
timerProvider.now = now.Add(61 * time.Minute)
cache.Set("key3", "value3")
// Test that key1 have been extended, key2 are outdated, and key3 is still present
_, ok = cache.Get("key1")
assert.True(t, ok)
_, ok = cache.Get("key2")
assert.False(t, ok)
_, ok = cache.Get("key3")
assert.True(t, ok)
}