github.com/sequix/cortex@v1.1.6/pkg/chunk/cache/fifo_cache_test.go (about) 1 package cache 2 3 import ( 4 "context" 5 "fmt" 6 "strconv" 7 "testing" 8 "time" 9 10 "github.com/stretchr/testify/require" 11 ) 12 13 const size = 10 14 const overwrite = 5 15 16 func TestFifoCache(t *testing.T) { 17 c := NewFifoCache("test", FifoCacheConfig{Size: size, Validity: 1 * time.Minute}) 18 ctx := context.Background() 19 20 // Check put / get works 21 keys := []string{} 22 values := []interface{}{} 23 for i := 0; i < size; i++ { 24 keys = append(keys, strconv.Itoa(i)) 25 values = append(values, i) 26 } 27 c.Put(ctx, keys, values) 28 require.Len(t, c.index, size) 29 require.Len(t, c.entries, size) 30 31 for i := 0; i < size; i++ { 32 value, ok := c.Get(ctx, strconv.Itoa(i)) 33 require.True(t, ok) 34 require.Equal(t, i, value.(int)) 35 } 36 37 // Check evictions 38 keys = []string{} 39 values = []interface{}{} 40 for i := size; i < size+overwrite; i++ { 41 keys = append(keys, strconv.Itoa(i)) 42 values = append(values, i) 43 } 44 c.Put(ctx, keys, values) 45 require.Len(t, c.index, size) 46 require.Len(t, c.entries, size) 47 48 for i := 0; i < size-overwrite; i++ { 49 _, ok := c.Get(ctx, strconv.Itoa(i)) 50 require.False(t, ok) 51 } 52 for i := size; i < size+overwrite; i++ { 53 value, ok := c.Get(ctx, strconv.Itoa(i)) 54 require.True(t, ok) 55 require.Equal(t, i, value.(int)) 56 } 57 58 // Check updates work 59 keys = []string{} 60 values = []interface{}{} 61 for i := size; i < size+overwrite; i++ { 62 keys = append(keys, strconv.Itoa(i)) 63 values = append(values, i*2) 64 } 65 c.Put(ctx, keys, values) 66 require.Len(t, c.index, size) 67 require.Len(t, c.entries, size) 68 69 for i := size; i < size+overwrite; i++ { 70 value, ok := c.Get(ctx, strconv.Itoa(i)) 71 require.True(t, ok) 72 require.Equal(t, i*2, value.(int)) 73 } 74 } 75 76 func TestFifoCacheExpiry(t *testing.T) { 77 c := NewFifoCache("test", FifoCacheConfig{Size: size, Validity: 5 * time.Millisecond}) 78 ctx := context.Background() 79 80 c.Put(ctx, []string{"0"}, []interface{}{0}) 81 82 value, ok := c.Get(ctx, "0") 83 require.True(t, ok) 84 require.Equal(t, 0, value.(int)) 85 86 // Expire the entry. 87 time.Sleep(5 * time.Millisecond) 88 _, ok = c.Get(ctx, strconv.Itoa(0)) 89 require.False(t, ok) 90 } 91 92 func (c *FifoCache) print() { 93 fmt.Println("first", c.first, "last", c.last) 94 for i, entry := range c.entries { 95 fmt.Printf(" %d -> key: %s, value: %v, next: %d, prev: %d\n", i, entry.key, entry.value, entry.next, entry.prev) 96 } 97 }