diff --git a/core/stores/cache/cachenode_test.go b/core/stores/cache/cachenode_test.go index 0a2c358c..6e16a102 100644 --- a/core/stores/cache/cachenode_test.go +++ b/core/stores/cache/cachenode_test.go @@ -34,8 +34,10 @@ func init() { func TestCacheNode_DelCache(t *testing.T) { t.Run("del cache", func(t *testing.T) { - store := redistest.CreateRedis(t) - store.Type = redis.ClusterType + r, err := miniredis.Run() + assert.NoError(t, err) + defer r.Close() + store := redis.New(r.Addr(), redis.Cluster()) cn := cacheNode{ rds: store, @@ -166,40 +168,99 @@ func TestCacheNode_TakeBadRedis(t *testing.T) { } func TestCacheNode_TakeNotFound(t *testing.T) { - store := redistest.CreateRedis(t) + t.Run("not found", func(t *testing.T) { + store := redistest.CreateRedis(t) - cn := cacheNode{ - rds: store, - r: rand.New(rand.NewSource(time.Now().UnixNano())), - barrier: syncx.NewSingleFlight(), - lock: new(sync.Mutex), - unstableExpiry: mathx.NewUnstable(expiryDeviation), - stat: NewStat("any"), - errNotFound: errTestNotFound, - } - var str string - err := cn.Take(&str, "any", func(v any) error { - return errTestNotFound - }) - assert.True(t, cn.IsNotFound(err)) - assert.True(t, cn.IsNotFound(cn.Get("any", &str))) - val, err := store.Get("any") - assert.Nil(t, err) - assert.Equal(t, `*`, val) + cn := cacheNode{ + rds: store, + r: rand.New(rand.NewSource(time.Now().UnixNano())), + barrier: syncx.NewSingleFlight(), + lock: new(sync.Mutex), + unstableExpiry: mathx.NewUnstable(expiryDeviation), + stat: NewStat("any"), + errNotFound: errTestNotFound, + } + var str string + err := cn.Take(&str, "any", func(v any) error { + return errTestNotFound + }) + assert.True(t, cn.IsNotFound(err)) + assert.True(t, cn.IsNotFound(cn.Get("any", &str))) + val, err := store.Get("any") + assert.Nil(t, err) + assert.Equal(t, `*`, val) - store.Set("any", "*") - err = cn.Take(&str, "any", func(v any) error { - return nil - }) - assert.True(t, cn.IsNotFound(err)) - assert.True(t, cn.IsNotFound(cn.Get("any", &str))) + store.Set("any", "*") + err = cn.Take(&str, "any", func(v any) error { + return nil + }) + assert.True(t, cn.IsNotFound(err)) + assert.True(t, cn.IsNotFound(cn.Get("any", &str))) - store.Del("any") - errDummy := errors.New("dummy") - err = cn.Take(&str, "any", func(v any) error { - return errDummy + store.Del("any") + errDummy := errors.New("dummy") + err = cn.Take(&str, "any", func(v any) error { + return errDummy + }) + assert.Equal(t, errDummy, err) + }) + + t.Run("not found with redis error", func(t *testing.T) { + r, err := miniredis.Run() + assert.NoError(t, err) + defer r.Close() + store, err := redis.NewRedis(redis.RedisConf{ + Host: r.Addr(), + Type: redis.NodeType, + }) + assert.NoError(t, err) + + cn := cacheNode{ + rds: store, + r: rand.New(rand.NewSource(time.Now().UnixNano())), + barrier: syncx.NewSingleFlight(), + lock: new(sync.Mutex), + unstableExpiry: mathx.NewUnstable(expiryDeviation), + stat: NewStat("any"), + errNotFound: errTestNotFound, + } + var str string + err = cn.Take(&str, "any", func(v any) error { + r.SetError("mock error") + return errTestNotFound + }) + assert.True(t, cn.IsNotFound(err)) + }) +} + +func TestCacheNode_TakeCtxWithRedisError(t *testing.T) { + t.Run("not found with redis error", func(t *testing.T) { + r, err := miniredis.Run() + assert.NoError(t, err) + defer r.Close() + store, err := redis.NewRedis(redis.RedisConf{ + Host: r.Addr(), + Type: redis.NodeType, + }) + assert.NoError(t, err) + + cn := cacheNode{ + rds: store, + r: rand.New(rand.NewSource(time.Now().UnixNano())), + barrier: syncx.NewSingleFlight(), + lock: new(sync.Mutex), + unstableExpiry: mathx.NewUnstable(expiryDeviation), + stat: NewStat("any"), + errNotFound: errTestNotFound, + } + var str string + err = cn.Take(&str, "any", func(v any) error { + str = "foo" + r.SetError("mock error") + return nil + }) + assert.NoError(t, err) }) - assert.Equal(t, errDummy, err) } func TestCacheNode_TakeNotFoundButChangedByOthers(t *testing.T) { diff --git a/core/stores/cache/cacheopt_test.go b/core/stores/cache/cacheopt_test.go new file mode 100644 index 00000000..7b7d82c4 --- /dev/null +++ b/core/stores/cache/cacheopt_test.go @@ -0,0 +1,28 @@ +package cache + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestCacheOptions(t *testing.T) { + t.Run("default options", func(t *testing.T) { + o := newOptions() + assert.Equal(t, defaultExpiry, o.Expiry) + assert.Equal(t, defaultNotFoundExpiry, o.NotFoundExpiry) + }) + + t.Run("with expiry", func(t *testing.T) { + o := newOptions(WithExpiry(time.Second)) + assert.Equal(t, time.Second, o.Expiry) + assert.Equal(t, defaultNotFoundExpiry, o.NotFoundExpiry) + }) + + t.Run("with not found expiry", func(t *testing.T) { + o := newOptions(WithNotFoundExpiry(time.Second)) + assert.Equal(t, defaultExpiry, o.Expiry) + assert.Equal(t, time.Second, o.NotFoundExpiry) + }) +}