Files
go-common/app/service/main/upcredit/mathutil/limiter_test.go
2019-04-22 18:49:16 +08:00

47 lines
921 B
Go

package mathutil
import (
. "github.com/smartystreets/goconvey/convey"
"math"
"testing"
"time"
)
func Test_limiter(t *testing.T) {
Convey("limit interval", t, func() {
var rate = 100.0
var limit = NewLimiter(rate)
var interval = 1.0 / rate
var last time.Time
for i := 0; i < 100; i++ {
var t = <-limit.Token()
if !last.IsZero() {
var diff = t.Sub(last)
So(math.Abs(diff.Seconds()-interval), ShouldBeLessThanOrEqualTo, 0.002)
}
last = t
}
})
Convey("limit count", t, func() {
var rate = 100.0
var seconds = 10.0
var limit = NewLimiter(rate)
var expect = rate * seconds
var timer = time.NewTimer(time.Duration(float64(time.Second) * seconds))
var total = 0
var run = true
for run {
select {
case <-timer.C:
run = false
default:
<-limit.Token()
total++
}
}
So(math.Abs(float64(total)-expect), ShouldBeLessThanOrEqualTo, rate*0.01)
})
}