github.com/argoproj/argo-cd/v3@v3.2.1/util/cache/cache_test.go (about) 1 package cache 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/alicebob/miniredis/v2" 8 "github.com/redis/go-redis/v9" 9 "github.com/spf13/cobra" 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 13 "github.com/argoproj/argo-cd/v3/common" 14 ) 15 16 func TestAddCacheFlagsToCmd(t *testing.T) { 17 cache, err := AddCacheFlagsToCmd(&cobra.Command{})() 18 require.NoError(t, err) 19 assert.Equal(t, 24*time.Hour, cache.client.(*redisCache).expiration) 20 } 21 22 func NewInMemoryRedis() (*redis.Client, func()) { 23 mr, err := miniredis.Run() 24 if err != nil { 25 panic(err) 26 } 27 return redis.NewClient(&redis.Options{Addr: mr.Addr()}), mr.Close 28 } 29 30 func TestCacheClient(t *testing.T) { 31 clientRedis, stopRedis := NewInMemoryRedis() 32 defer stopRedis() 33 redisCache := NewRedisCache(clientRedis, 5*time.Second, RedisCompressionNone) 34 clientMemCache := NewInMemoryCache(60 * time.Second) 35 twoLevelClient := NewTwoLevelClient(redisCache, 5*time.Second) 36 // Run tests for both Redis and InMemoryCache 37 for _, client := range []CacheClient{clientMemCache, redisCache, twoLevelClient} { 38 cache := NewCache(client) 39 t.Run("SetItem", func(t *testing.T) { 40 err := cache.SetItem("foo", "bar", &CacheActionOpts{Expiration: 60 * time.Second, DisableOverwrite: true, Delete: false}) 41 require.NoError(t, err) 42 var output string 43 err = cache.GetItem("foo", &output) 44 require.NoError(t, err) 45 assert.Equal(t, "bar", output) 46 }) 47 t.Run("SetCacheItem W/Disable Overwrite", func(t *testing.T) { 48 err := cache.SetItem("foo", "bar", &CacheActionOpts{Expiration: 60 * time.Second, DisableOverwrite: true, Delete: false}) 49 require.NoError(t, err) 50 var output string 51 err = cache.GetItem("foo", &output) 52 require.NoError(t, err) 53 assert.Equal(t, "bar", output) 54 err = cache.SetItem("foo", "bar", &CacheActionOpts{Expiration: 60 * time.Second, DisableOverwrite: true, Delete: false}) 55 require.NoError(t, err) 56 err = cache.GetItem("foo", &output) 57 require.NoError(t, err) 58 assert.Equal(t, "bar", output, "output should not have changed with DisableOverwrite set to true") 59 }) 60 t.Run("GetItem", func(t *testing.T) { 61 var val string 62 err := cache.GetItem("foo", &val) 63 require.NoError(t, err) 64 assert.Equal(t, "bar", val) 65 }) 66 t.Run("DeleteItem", func(t *testing.T) { 67 err := cache.SetItem("foo", "bar", &CacheActionOpts{Expiration: 0, Delete: true}) 68 require.NoError(t, err) 69 var val string 70 err = cache.GetItem("foo", &val) 71 require.Error(t, err) 72 assert.Empty(t, val) 73 }) 74 t.Run("Check for nil items", func(t *testing.T) { 75 err := cache.SetItem("foo", nil, &CacheActionOpts{Expiration: 0, Delete: true}) 76 require.ErrorContains(t, err, "cannot set nil item") 77 err = cache.GetItem("foo", nil) 78 assert.ErrorContains(t, err, "cannot get item") 79 }) 80 } 81 } 82 83 // Smoke test to ensure key changes aren't done accidentally 84 func TestGenerateCacheKey(t *testing.T) { 85 client := NewInMemoryCache(60 * time.Second) 86 cache := NewCache(client) 87 testKey := cache.generateFullKey("testkey") 88 assert.Equal(t, "testkey|"+common.CacheVersion, testKey) 89 }