@@ -3,6 +3,8 @@ package limiter
3
3
import (
4
4
"context"
5
5
"strings"
6
+ "sync"
7
+ "sync/atomic"
6
8
"testing"
7
9
"time"
8
10
@@ -16,23 +18,22 @@ func TestDeadlineLimiter(t *testing.T) {
16
18
t .Run ("Unblocked" , func (t2 * testing.T ) {
17
19
asrt := assert .New (t2 )
18
20
l := limit .NewSettableLimit ("test" , 10 , nil )
19
- noopLogger := limit.NoopLimitLogger {}
20
21
defaultLimiter , err := NewDefaultLimiter (
21
22
l ,
22
23
defaultMinWindowTime ,
23
24
defaultMaxWindowTime ,
24
25
defaultMinRTTThreshold ,
25
26
defaultWindowSize ,
26
27
strategy .NewSimpleStrategy (10 ),
27
- noopLogger ,
28
+ nil ,
28
29
core .EmptyMetricRegistryInstance ,
29
30
)
30
31
if ! asrt .NoError (err ) {
31
32
asrt .FailNow ("" )
32
33
}
33
34
asrt .NotNil (defaultLimiter )
34
- deadline := time .Now ().Add (time .Second * 15 )
35
- deadlineLimiter := NewDeadlineLimiter (defaultLimiter , deadline , noopLogger )
35
+ deadline := time .Now ().Add (time .Second * 15 )
36
+ deadlineLimiter := NewDeadlineLimiter (defaultLimiter , deadline , nil )
36
37
// stringer
37
38
asrt .True (strings .Contains (deadlineLimiter .String (), "DeadlineLimiter{delegate=DefaultLimiter{" ))
38
39
@@ -71,7 +72,7 @@ func TestDeadlineLimiter(t *testing.T) {
71
72
asrt .FailNow ("" )
72
73
}
73
74
asrt .NotNil (defaultLimiter )
74
- deadline := time .Now ().Add (time .Second * 1 )
75
+ deadline := time .Now ().Add (time .Second * 1 )
75
76
deadlineLimiter := NewDeadlineLimiter (defaultLimiter , deadline , noopLogger )
76
77
77
78
i := 1
@@ -94,5 +95,48 @@ func TestDeadlineLimiter(t *testing.T) {
94
95
asrt .True (deadlineFound , "expected deadline to be reached but not after %d attempts" , i )
95
96
asrt .Equal (2 , i , "expected deadline to be exceeded on second attempt" )
96
97
})
97
- }
98
98
99
+ t .Run ("limit reached" , func (t2 * testing.T ) {
100
+ asrt := assert .New (t2 )
101
+ l := limit .NewFixedLimit ("test" , 1 , nil )
102
+ noopLogger := limit.BuiltinLimitLogger {}
103
+ defaultLimiter , err := NewDefaultLimiter (
104
+ l ,
105
+ defaultMinWindowTime ,
106
+ defaultMaxWindowTime ,
107
+ defaultMinRTTThreshold ,
108
+ defaultWindowSize ,
109
+ strategy .NewSimpleStrategy (1 ),
110
+ noopLogger ,
111
+ core .EmptyMetricRegistryInstance ,
112
+ )
113
+ if ! asrt .NoError (err ) {
114
+ asrt .FailNow ("" )
115
+ }
116
+ asrt .NotNil (defaultLimiter )
117
+ deadline := time .Now ().Add (time .Second * 1 )
118
+ deadlineLimiter := NewDeadlineLimiter (defaultLimiter , deadline , noopLogger )
119
+
120
+ var deadlineFound atomic.Value
121
+ deadlineFound .Store (false )
122
+ var wg sync.WaitGroup
123
+ wg .Add (3 )
124
+
125
+ for i := 0 ; i < 3 ; i ++ {
126
+ go func (c int ) {
127
+ defer wg .Done ()
128
+ listener , ok := deadlineLimiter .Acquire (context .Background ())
129
+ if ok && listener != nil {
130
+ time .Sleep (time .Second )
131
+ listener .OnSuccess ()
132
+ } else {
133
+ deadlineFound .Store (true )
134
+ }
135
+ }(i )
136
+ time .Sleep (time .Millisecond * 5 )
137
+ }
138
+ wg .Wait ()
139
+
140
+ asrt .True (deadlineFound .Load ().(bool ), "expected deadline limit to be reached but not after 2 attempts" )
141
+ })
142
+ }
0 commit comments