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  }