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  }