github.com/castai/kvisor@v1.7.1-0.20240516114728-b3572a2607b5/pkg/bucketcache/bucketcache_test.go (about) 1 package bucketcache 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/require" 7 ) 8 9 func intHash(n int) uint32 { 10 return uint32(n) 11 } 12 13 func TestBucketCache(t *testing.T) { 14 t.Run("add single value", func(t *testing.T) { 15 r := require.New(t) 16 17 key := 10 18 val := 20 19 20 cache, err := New[int, int](10, 5, intHash) 21 r.NoError(err) 22 23 added := cache.AddToBucket(key, val) 24 r.True(added) 25 26 vals := cache.GetBucket(key) 27 r.Equal([]int{val}, vals) 28 }) 29 30 t.Run("add multiple values", func(t *testing.T) { 31 r := require.New(t) 32 33 key := 10 34 vals := []int{20, 30, 40} 35 36 cache, err := New[int, int](10, 5, intHash) 37 r.NoError(err) 38 39 for _, v := range vals { 40 added := cache.AddToBucket(key, v) 41 r.True(added) 42 } 43 44 result := cache.GetBucket(key) 45 r.Equal(vals, result) 46 }) 47 48 t.Run("add multiple buckets", func(t *testing.T) { 49 r := require.New(t) 50 51 key1 := 10 52 val1 := 20 53 54 key2 := 90 55 val2 := 99 56 57 cache, err := New[int, int](10, 5, intHash) 58 r.NoError(err) 59 60 added := cache.AddToBucket(key1, val1) 61 r.True(added) 62 63 added = cache.AddToBucket(key2, val2) 64 r.True(added) 65 66 vals := cache.GetBucket(key1) 67 r.Equal([]int{val1}, vals) 68 69 vals = cache.GetBucket(key2) 70 r.Equal([]int{val2}, vals) 71 }) 72 73 t.Run("should not add more values than max bucket size", func(t *testing.T) { 74 r := require.New(t) 75 76 key := 10 77 vals := []int{1, 2, 3, 4, 5, 6, 7, 8} 78 79 cache, err := New[int, int](2, 2, intHash) 80 r.NoError(err) 81 82 for i, val := range vals { 83 added := cache.AddToBucket(key, val) 84 if i < 2 { 85 r.True(added) 86 } else { 87 r.False(added) 88 } 89 } 90 91 result := cache.GetBucket(key) 92 r.Equal([]int{1, 2}, result) 93 }) 94 95 t.Run("should drop oldest bucket when going over cache size", func(t *testing.T) { 96 r := require.New(t) 97 98 key1 := 11 99 key2 := 12 100 key3 := 13 101 102 cache, err := New[int, int](2, 2, intHash) 103 r.NoError(err) 104 105 cache.AddToBucket(key1, 1) 106 cache.AddToBucket(key2, 2) 107 cache.AddToBucket(key3, 3) 108 109 result := cache.GetBucket(key1) 110 r.Nil(result) 111 112 result = cache.GetBucket(key2) 113 r.Equal([]int{2}, result) 114 115 result = cache.GetBucket(key3) 116 r.Equal([]int{3}, result) 117 }) 118 }