tokenlimit_test.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package limit
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/alicebob/miniredis"
  6. "github.com/stretchr/testify/assert"
  7. "github.com/tal-tech/go-zero/core/logx"
  8. "github.com/tal-tech/go-zero/core/stores/redis"
  9. )
  10. func init() {
  11. logx.Disable()
  12. }
  13. func TestTokenLimit_Rescue(t *testing.T) {
  14. s, err := miniredis.Run()
  15. assert.Nil(t, err)
  16. const (
  17. total = 100
  18. rate = 5
  19. burst = 10
  20. )
  21. l := NewTokenLimiter(rate, burst, redis.NewRedis(s.Addr(), redis.NodeType), "tokenlimit")
  22. s.Close()
  23. var allowed int
  24. for i := 0; i < total; i++ {
  25. time.Sleep(time.Second / time.Duration(total))
  26. if i == total>>1 {
  27. assert.Nil(t, s.Restart())
  28. }
  29. if l.Allow() {
  30. allowed++
  31. }
  32. // make sure start monitor more than once doesn't matter
  33. l.startMonitor()
  34. }
  35. assert.True(t, allowed >= burst+rate)
  36. }
  37. func TestTokenLimit_Take(t *testing.T) {
  38. s, err := miniredis.Run()
  39. assert.Nil(t, err)
  40. defer s.Close()
  41. const (
  42. total = 100
  43. rate = 5
  44. burst = 10
  45. )
  46. l := NewTokenLimiter(rate, burst, redis.NewRedis(s.Addr(), redis.NodeType), "tokenlimit")
  47. var allowed int
  48. for i := 0; i < total; i++ {
  49. time.Sleep(time.Second / time.Duration(total))
  50. if l.Allow() {
  51. allowed++
  52. }
  53. }
  54. assert.True(t, allowed >= burst+rate)
  55. }
  56. func TestTokenLimit_TakeBurst(t *testing.T) {
  57. s, err := miniredis.Run()
  58. assert.Nil(t, err)
  59. defer s.Close()
  60. const (
  61. total = 100
  62. rate = 5
  63. burst = 10
  64. )
  65. l := NewTokenLimiter(rate, burst, redis.NewRedis(s.Addr(), redis.NodeType), "tokenlimit")
  66. var allowed int
  67. for i := 0; i < total; i++ {
  68. if l.Allow() {
  69. allowed++
  70. }
  71. }
  72. assert.True(t, allowed >= burst)
  73. }