1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
package ratelimiter
import (
"sync"
"testing"
"time"
)
var testlimits = []int{1, 10, 50, 100, 1000}
func TestRateLimiterSingleThreaded(t *testing.T) {
for i, limit := range testlimits {
l := NewLimiter(limit)
count := 0
tick := time.NewTicker(time.Second)
go func() {
for _ = range tick.C {
// Allow a count up to one more than the limit as scheduling of
// goroutine vs the main thread could cause this check to not be
// run quite in time for limit.
if count > limit+1 {
t.Errorf("#%d: Too many operations per second. Expected %d, got %d", i, limit, count)
}
count = 0
}
}()
for i := 0; i < 3*limit; i++ {
l.Wait()
count++
}
tick.Stop()
}
}
func TestRateLimiterGoroutines(t *testing.T) {
for i, limit := range testlimits {
l := NewLimiter(limit)
count := 0
tick := time.NewTicker(time.Second)
go func() {
for _ = range tick.C {
// Allow a count up to one more than the limit as scheduling of
// goroutine vs the main thread could cause this check to not be
// run quite in time for limit.
if count > limit+1 {
t.Errorf("#%d: Too many operations per second. Expected %d, got %d", i, limit, count)
}
count = 0
}
}()
var wg sync.WaitGroup
for i := 0; i < 3*limit; i++ {
wg.Add(1)
go func() {
l.Wait()
count++
wg.Done()
}()
}
wg.Wait()
tick.Stop()
}
}
|