123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- package limit
- import (
- "testing"
- "github.com/alicebob/miniredis/v2"
- "github.com/stretchr/testify/assert"
- "github.com/wuntsong-org/go-zero-plus/core/stores/redis"
- "github.com/wuntsong-org/go-zero-plus/core/stores/redis/redistest"
- )
- func TestPeriodLimit_Take(t *testing.T) {
- testPeriodLimit(t)
- }
- func TestPeriodLimit_TakeWithAlign(t *testing.T) {
- testPeriodLimit(t, Align())
- }
- func TestPeriodLimit_RedisUnavailable(t *testing.T) {
- s, err := miniredis.Run()
- assert.Nil(t, err)
- const (
- seconds = 1
- quota = 5
- )
- l := NewPeriodLimit(seconds, quota, redis.New(s.Addr()), "periodlimit")
- s.Close()
- val, err := l.Take("first")
- assert.NotNil(t, err)
- assert.Equal(t, 0, val)
- }
- func testPeriodLimit(t *testing.T, opts ...PeriodOption) {
- store := redistest.CreateRedis(t)
- const (
- seconds = 1
- total = 100
- quota = 5
- )
- l := NewPeriodLimit(seconds, quota, store, "periodlimit", opts...)
- var allowed, hitQuota, overQuota int
- for i := 0; i < total; i++ {
- val, err := l.Take("first")
- if err != nil {
- t.Error(err)
- }
- switch val {
- case Allowed:
- allowed++
- case HitQuota:
- hitQuota++
- case OverQuota:
- overQuota++
- default:
- t.Error("unknown status")
- }
- }
- assert.Equal(t, quota-1, allowed)
- assert.Equal(t, 1, hitQuota)
- assert.Equal(t, total-quota, overQuota)
- }
- func TestQuotaFull(t *testing.T) {
- s, err := miniredis.Run()
- assert.Nil(t, err)
- l := NewPeriodLimit(1, 1, redis.New(s.Addr()), "periodlimit")
- val, err := l.Take("first")
- assert.Nil(t, err)
- assert.Equal(t, HitQuota, val)
- }
|