cachenode_test.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. package cache
  2. import (
  3. "errors"
  4. "math/rand"
  5. "sync"
  6. "testing"
  7. "time"
  8. "github.com/alicebob/miniredis"
  9. "github.com/stretchr/testify/assert"
  10. "github.com/tal-tech/go-zero/core/logx"
  11. "github.com/tal-tech/go-zero/core/mathx"
  12. "github.com/tal-tech/go-zero/core/stat"
  13. "github.com/tal-tech/go-zero/core/stores/redis"
  14. "github.com/tal-tech/go-zero/core/syncx"
  15. )
  16. var errTestNotFound = errors.New("not found")
  17. func init() {
  18. logx.Disable()
  19. stat.SetReporter(nil)
  20. }
  21. func TestCacheNode_DelCache(t *testing.T) {
  22. s, err := miniredis.Run()
  23. assert.Nil(t, err)
  24. defer s.Close()
  25. cn := cacheNode{
  26. rds: redis.NewRedis(s.Addr(), redis.NodeType),
  27. r: rand.New(rand.NewSource(time.Now().UnixNano())),
  28. lock: new(sync.Mutex),
  29. unstableExpiry: mathx.NewUnstable(expiryDeviation),
  30. stat: NewCacheStat("any"),
  31. errNotFound: errTestNotFound,
  32. }
  33. assert.Nil(t, cn.DelCache())
  34. assert.Nil(t, cn.DelCache([]string{}...))
  35. assert.Nil(t, cn.DelCache(make([]string, 0)...))
  36. cn.SetCache("first", "one")
  37. assert.Nil(t, cn.DelCache("first"))
  38. cn.SetCache("first", "one")
  39. cn.SetCache("second", "two")
  40. assert.Nil(t, cn.DelCache("first", "second"))
  41. }
  42. func TestCacheNode_InvalidCache(t *testing.T) {
  43. s, err := miniredis.Run()
  44. assert.Nil(t, err)
  45. defer s.Close()
  46. cn := cacheNode{
  47. rds: redis.NewRedis(s.Addr(), redis.NodeType),
  48. r: rand.New(rand.NewSource(time.Now().UnixNano())),
  49. lock: new(sync.Mutex),
  50. unstableExpiry: mathx.NewUnstable(expiryDeviation),
  51. stat: NewCacheStat("any"),
  52. errNotFound: errTestNotFound,
  53. }
  54. s.Set("any", "value")
  55. var str string
  56. assert.NotNil(t, cn.GetCache("any", &str))
  57. assert.Equal(t, "", str)
  58. _, err = s.Get("any")
  59. assert.Equal(t, miniredis.ErrKeyNotFound, err)
  60. }
  61. func TestCacheNode_Take(t *testing.T) {
  62. s, err := miniredis.Run()
  63. assert.Nil(t, err)
  64. defer s.Close()
  65. cn := cacheNode{
  66. rds: redis.NewRedis(s.Addr(), redis.NodeType),
  67. r: rand.New(rand.NewSource(time.Now().UnixNano())),
  68. barrier: syncx.NewSharedCalls(),
  69. lock: new(sync.Mutex),
  70. unstableExpiry: mathx.NewUnstable(expiryDeviation),
  71. stat: NewCacheStat("any"),
  72. errNotFound: errTestNotFound,
  73. }
  74. var str string
  75. err = cn.Take(&str, "any", func(v interface{}) error {
  76. *v.(*string) = "value"
  77. return nil
  78. })
  79. assert.Nil(t, err)
  80. assert.Equal(t, "value", str)
  81. assert.Nil(t, cn.GetCache("any", &str))
  82. val, err := s.Get("any")
  83. assert.Nil(t, err)
  84. assert.Equal(t, `"value"`, val)
  85. }
  86. func TestCacheNode_TakeNotFound(t *testing.T) {
  87. s, err := miniredis.Run()
  88. assert.Nil(t, err)
  89. defer s.Close()
  90. cn := cacheNode{
  91. rds: redis.NewRedis(s.Addr(), redis.NodeType),
  92. r: rand.New(rand.NewSource(time.Now().UnixNano())),
  93. barrier: syncx.NewSharedCalls(),
  94. lock: new(sync.Mutex),
  95. unstableExpiry: mathx.NewUnstable(expiryDeviation),
  96. stat: NewCacheStat("any"),
  97. errNotFound: errTestNotFound,
  98. }
  99. var str string
  100. err = cn.Take(&str, "any", func(v interface{}) error {
  101. return errTestNotFound
  102. })
  103. assert.Equal(t, errTestNotFound, err)
  104. assert.Equal(t, errTestNotFound, cn.GetCache("any", &str))
  105. val, err := s.Get("any")
  106. assert.Nil(t, err)
  107. assert.Equal(t, `*`, val)
  108. s.Set("any", "*")
  109. err = cn.Take(&str, "any", func(v interface{}) error {
  110. return nil
  111. })
  112. assert.Equal(t, errTestNotFound, err)
  113. assert.Equal(t, errTestNotFound, cn.GetCache("any", &str))
  114. s.Del("any")
  115. var errDummy = errors.New("dummy")
  116. err = cn.Take(&str, "any", func(v interface{}) error {
  117. return errDummy
  118. })
  119. assert.Equal(t, errDummy, err)
  120. }
  121. func TestCacheNode_TakeWithExpire(t *testing.T) {
  122. s, err := miniredis.Run()
  123. assert.Nil(t, err)
  124. defer s.Close()
  125. cn := cacheNode{
  126. rds: redis.NewRedis(s.Addr(), redis.NodeType),
  127. r: rand.New(rand.NewSource(time.Now().UnixNano())),
  128. barrier: syncx.NewSharedCalls(),
  129. lock: new(sync.Mutex),
  130. unstableExpiry: mathx.NewUnstable(expiryDeviation),
  131. stat: NewCacheStat("any"),
  132. errNotFound: errors.New("any"),
  133. }
  134. var str string
  135. err = cn.TakeWithExpire(&str, "any", func(v interface{}, expire time.Duration) error {
  136. *v.(*string) = "value"
  137. return nil
  138. })
  139. assert.Nil(t, err)
  140. assert.Equal(t, "value", str)
  141. assert.Nil(t, cn.GetCache("any", &str))
  142. val, err := s.Get("any")
  143. assert.Nil(t, err)
  144. assert.Equal(t, `"value"`, val)
  145. }
  146. func TestCacheNode_String(t *testing.T) {
  147. s, err := miniredis.Run()
  148. assert.Nil(t, err)
  149. defer s.Close()
  150. cn := cacheNode{
  151. rds: redis.NewRedis(s.Addr(), redis.NodeType),
  152. r: rand.New(rand.NewSource(time.Now().UnixNano())),
  153. barrier: syncx.NewSharedCalls(),
  154. lock: new(sync.Mutex),
  155. unstableExpiry: mathx.NewUnstable(expiryDeviation),
  156. stat: NewCacheStat("any"),
  157. errNotFound: errors.New("any"),
  158. }
  159. assert.Equal(t, s.Addr(), cn.String())
  160. }