8 func BenchmarkLRU_Rand(b *testing.B) {
11 b.Fatalf("err: %v", err)
14 trace := make([]int64, b.N*2)
15 for i := 0; i < b.N*2; i++ {
16 trace[i] = rand.Int63() % 32768
22 for i := 0; i < 2*b.N; i++ {
24 l.Add(trace[i], trace[i])
26 _, ok := l.Get(trace[i])
34 b.Logf("hit: %d miss: %d ratio: %f", hit, miss, float64(hit)/float64(miss))
37 func BenchmarkLRU_Freq(b *testing.B) {
40 b.Fatalf("err: %v", err)
43 trace := make([]int64, b.N*2)
44 for i := 0; i < b.N*2; i++ {
46 trace[i] = rand.Int63() % 16384
48 trace[i] = rand.Int63() % 32768
54 for i := 0; i < b.N; i++ {
55 l.Add(trace[i], trace[i])
58 for i := 0; i < b.N; i++ {
59 _, ok := l.Get(trace[i])
66 b.Logf("hit: %d miss: %d ratio: %f", hit, miss, float64(hit)/float64(miss))
69 func TestLRU(t *testing.T) {
71 onEvicted := func(k interface{}, v interface{}) {
73 t.Fatalf("Evict values not equal (%v!=%v)", k, v)
77 l, err := NewWithEvict(128, onEvicted)
79 t.Fatalf("err: %v", err)
82 for i := 0; i < 256; i++ {
86 t.Fatalf("bad len: %v", l.Len())
89 if evictCounter != 128 {
90 t.Fatalf("bad evict count: %v", evictCounter)
93 for i, k := range l.Keys() {
94 if v, ok := l.Get(k); !ok || v != k || v != i+128 {
95 t.Fatalf("bad key: %v", k)
98 for i := 0; i < 128; i++ {
101 t.Fatalf("should be evicted")
104 for i := 128; i < 256; i++ {
107 t.Fatalf("should not be evicted")
110 for i := 128; i < 192; i++ {
114 t.Fatalf("should be deleted")
118 l.Get(192) // expect 192 to be last key in l.Keys()
120 for i, k := range l.Keys() {
121 if (i < 63 && k != i+193) || (i == 63 && k != 192) {
122 t.Fatalf("out of order key: %v", k)
128 t.Fatalf("bad len: %v", l.Len())
130 if _, ok := l.Get(200); ok {
131 t.Fatalf("should contain nothing")
135 // test that Add returns true/false if an eviction occurred
136 func TestLRUAdd(t *testing.T) {
138 onEvicted := func(k interface{}, v interface{}) {
142 l, err := NewWithEvict(1, onEvicted)
144 t.Fatalf("err: %v", err)
147 if l.Add(1, 1) == true || evictCounter != 0 {
148 t.Errorf("should not have an eviction")
150 if l.Add(2, 2) == false || evictCounter != 1 {
151 t.Errorf("should have an eviction")
155 // test that Contains doesn't update recent-ness
156 func TestLRUContains(t *testing.T) {
159 t.Fatalf("err: %v", err)
165 t.Errorf("1 should be contained")
170 t.Errorf("Contains should not have updated recent-ness of 1")
174 // test that Contains doesn't update recent-ness
175 func TestLRUContainsOrAdd(t *testing.T) {
178 t.Fatalf("err: %v", err)
183 contains, evict := l.ContainsOrAdd(1, 1)
185 t.Errorf("1 should be contained")
188 t.Errorf("nothing should be evicted here")
192 contains, evict = l.ContainsOrAdd(1, 1)
194 t.Errorf("1 should not have been contained")
197 t.Errorf("an eviction should have occurred")
200 t.Errorf("now 1 should be contained")
204 // test that Peek doesn't update recent-ness
205 func TestLRUPeek(t *testing.T) {
208 t.Fatalf("err: %v", err)
213 if v, ok := l.Peek(1); !ok || v != 1 {
214 t.Errorf("1 should be set to 1: %v, %v", v, ok)
219 t.Errorf("should not have updated recent-ness of 1")