-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlimiter_test.go
83 lines (65 loc) · 1.76 KB
/
limiter_test.go
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package limiter
import (
"github.com/sadfun/limiter/storage"
"testing"
"time"
)
func TestLimiter(t *testing.T) {
t.Run("Dummy", func(t *testing.T) {
dummyTest(t, 10, 100*time.Millisecond)
dummyTest(t, 1, 100*time.Millisecond)
})
t.Run("Leak", func(t *testing.T) {
// Fill full bucket quickly, then try to do one more request after duration/limit.
// This test is failing with many Token Bucket implementations.
limit := 10
duration := time.Second
limiter := NewLimiter[string](&Config[string]{
Limit: limit,
Duration: duration,
Storage: storage.NewMapStorage[string](),
})
if !limiter.UseN("key", limit) {
t.Error("UseN failed")
}
time.Sleep(
time.Duration(duration.Nanoseconds()/int64(limit)) + time.Millisecond,
)
if limiter.UseN("key", 1) {
t.Error("Limiter leaked request after divided duration")
}
time.Sleep(
time.Duration(duration.Nanoseconds()-(duration.Nanoseconds()/int64(limit))) - 10*time.Millisecond,
)
if limiter.UseN("key", 1) {
t.Error("Limiter leaked request after almost full duration")
}
time.Sleep(
10 * time.Millisecond,
)
if !limiter.UseN("key", limit) {
t.Error("Limiter did not allow requests after full duration")
}
})
}
func dummyTest(t *testing.T, limit int, duration time.Duration) {
// Fill full bucket quickly, then try to do one more request without and with delay.
limiter := NewLimiter[string](&Config[string]{
Limit: limit,
Duration: duration,
Storage: storage.NewMapStorage[string](),
})
if !limiter.UseN("key", limit) {
t.Error("UseN failed")
}
if limiter.UseN("key", 1) {
t.Error("UseN succeeded")
}
time.Sleep(duration)
if !limiter.UseN("key", 1) {
t.Error("UseN failed")
}
if !limiter.UseN("key", limit-1) {
t.Error("UseN failed")
}
}