48
48
)
49
49
50
50
func watchDebug (ctx context.Context , r * Limiter , t * testing.T ) {
51
- t .Helper ()
52
51
watchDebugMutex .Lock ()
53
52
defer watchDebugMutex .Unlock ()
54
53
rd := r .DebugChannel ()
@@ -68,25 +67,28 @@ func watchDebug(ctx context.Context, r *Limiter, t *testing.T) {
68
67
}
69
68
}
70
69
71
- func peekCheckLimited (t * testing.T , limiter * Limiter , shouldbe bool ) {
72
- t .Helper ()
70
+ func peekCheckLimited (t * testing.T , limiter * Limiter , shouldbe , stringer bool ) {
71
+ limited := limiter .Peek (dummyTicker )
72
+ if stringer {
73
+ limited = limiter .PeekStringer (dummyTicker )
74
+ }
73
75
switch {
74
- case limiter . Peek ( dummyTicker ) && ! shouldbe :
76
+ case limited && ! shouldbe :
75
77
if ct , ok := limiter .Patrons .Get (dummyTicker .UniqueKey ()); ok {
76
78
t .Errorf ("Should not have been limited. Ratelimiter count: %d" , ct )
77
79
} else {
78
80
t .Fatalf ("dummyTicker does not exist in ratelimiter at all!" )
79
81
}
80
- case ! limiter . Peek ( dummyTicker ) && shouldbe :
82
+ case ! limited && shouldbe :
81
83
if ct , ok := limiter .Patrons .Get (dummyTicker .UniqueKey ()); ok {
82
84
t .Errorf ("Should have been limited. Ratelimiter count: %d" , ct )
83
85
} else {
84
86
t .Fatalf ("dummyTicker does not exist in ratelimiter at all!" )
85
87
}
86
- case limiter . Peek ( dummyTicker ) && shouldbe :
87
- t .Logf ("dummyTicker is limited" )
88
- case ! limiter . Peek ( dummyTicker ) && ! shouldbe :
89
- t .Logf ("dummyTicker is not limited" )
88
+ case limited && shouldbe :
89
+ t .Logf ("dummyTicker is limited as expected. " )
90
+ case ! limited && ! shouldbe :
91
+ t .Logf ("dummyTicker is not limited as expected. " )
90
92
}
91
93
}
92
94
@@ -105,6 +107,10 @@ func (tick *ticker) UniqueKey() string {
105
107
return "TestItem"
106
108
}
107
109
110
+ func (tick * ticker ) String () string {
111
+ return "TestItem"
112
+ }
113
+
108
114
func Test_ResetItem (t * testing.T ) {
109
115
limiter := NewLimiter (500 , 1 )
110
116
ctx , cancel := context .WithCancel (context .Background ())
@@ -114,26 +120,36 @@ func Test_ResetItem(t *testing.T) {
114
120
limiter .Check (dummyTicker )
115
121
}
116
122
limiter .ResetItem (dummyTicker )
117
- peekCheckLimited (t , limiter , false )
123
+ peekCheckLimited (t , limiter , false , false )
118
124
cancel ()
119
125
}
120
126
121
127
func Test_NewDefaultLimiter (t * testing.T ) {
122
128
limiter := NewDefaultLimiter ()
123
129
limiter .Check (dummyTicker )
124
- peekCheckLimited (t , limiter , false )
130
+ peekCheckLimited (t , limiter , false , false )
125
131
for n := 0 ; n != DefaultBurst ; n ++ {
126
132
limiter .Check (dummyTicker )
127
133
}
128
- peekCheckLimited (t , limiter , true )
134
+ peekCheckLimited (t , limiter , true , false )
135
+ }
136
+
137
+ func Test_CheckAndPeekStringer (t * testing.T ) {
138
+ limiter := NewDefaultLimiter ()
139
+ limiter .CheckStringer (dummyTicker )
140
+ peekCheckLimited (t , limiter , false , true )
141
+ for n := 0 ; n != DefaultBurst ; n ++ {
142
+ limiter .CheckStringer (dummyTicker )
143
+ }
144
+ peekCheckLimited (t , limiter , true , true )
129
145
}
130
146
131
147
func Test_NewLimiter (t * testing.T ) {
132
148
limiter := NewLimiter (5 , 1 )
133
149
limiter .Check (dummyTicker )
134
- peekCheckLimited (t , limiter , false )
150
+ peekCheckLimited (t , limiter , false , false )
135
151
limiter .Check (dummyTicker )
136
- peekCheckLimited (t , limiter , true )
152
+ peekCheckLimited (t , limiter , true , false )
137
153
}
138
154
139
155
func Test_NewDefaultStrictLimiter (t * testing.T ) {
@@ -144,9 +160,9 @@ func Test_NewDefaultStrictLimiter(t *testing.T) {
144
160
for n := 0 ; n < 25 ; n ++ {
145
161
limiter .Check (dummyTicker )
146
162
}
147
- peekCheckLimited (t , limiter , false )
163
+ peekCheckLimited (t , limiter , false , false )
148
164
limiter .Check (dummyTicker )
149
- peekCheckLimited (t , limiter , true )
165
+ peekCheckLimited (t , limiter , true , false )
150
166
cancel ()
151
167
limiter = nil
152
168
}
@@ -156,23 +172,23 @@ func Test_NewStrictLimiter(t *testing.T) {
156
172
ctx , cancel := context .WithCancel (context .Background ())
157
173
go watchDebug (ctx , limiter , t )
158
174
limiter .Check (dummyTicker )
159
- peekCheckLimited (t , limiter , false )
175
+ peekCheckLimited (t , limiter , false , false )
160
176
limiter .Check (dummyTicker )
161
- peekCheckLimited (t , limiter , true )
177
+ peekCheckLimited (t , limiter , true , false )
162
178
limiter .Check (dummyTicker )
163
179
// for coverage, first we give the debug messages a couple seconds to be safe,
164
180
// then we wait for the cache eviction to trigger a debug message.
165
181
time .Sleep (2 * time .Second )
166
182
t .Logf (<- limiter .DebugChannel ())
167
- peekCheckLimited (t , limiter , false )
183
+ peekCheckLimited (t , limiter , false , false )
168
184
for n := 0 ; n != 6 ; n ++ {
169
185
limiter .Check (dummyTicker )
170
186
}
171
- peekCheckLimited (t , limiter , true )
187
+ peekCheckLimited (t , limiter , true , false )
172
188
time .Sleep (5 * time .Second )
173
- peekCheckLimited (t , limiter , true )
189
+ peekCheckLimited (t , limiter , true , false )
174
190
time .Sleep (8 * time .Second )
175
- peekCheckLimited (t , limiter , false )
191
+ peekCheckLimited (t , limiter , false , false )
176
192
cancel ()
177
193
limiter = nil
178
194
}
@@ -184,35 +200,35 @@ func Test_NewHardcoreLimiter(t *testing.T) {
184
200
for n := 0 ; n != 4 ; n ++ {
185
201
limiter .Check (dummyTicker )
186
202
}
187
- peekCheckLimited (t , limiter , false )
203
+ peekCheckLimited (t , limiter , false , false )
188
204
if ! limiter .Check (dummyTicker ) {
189
205
t .Errorf ("Should have been limited" )
190
206
}
191
207
t .Logf ("limited once, waiting for cache eviction" )
192
208
time .Sleep (2 * time .Second )
193
- peekCheckLimited (t , limiter , false )
209
+ peekCheckLimited (t , limiter , false , false )
194
210
for n := 0 ; n != 4 ; n ++ {
195
211
limiter .Check (dummyTicker )
196
212
}
197
- peekCheckLimited (t , limiter , false )
213
+ peekCheckLimited (t , limiter , false , false )
198
214
if ! limiter .Check (dummyTicker ) {
199
215
t .Errorf ("Should have been limited" )
200
216
}
201
217
limiter .Check (dummyTicker )
202
218
limiter .Check (dummyTicker )
203
219
time .Sleep (3 * time .Second )
204
- peekCheckLimited (t , limiter , true )
220
+ peekCheckLimited (t , limiter , true , false )
205
221
time .Sleep (5 * time .Second )
206
- peekCheckLimited (t , limiter , false )
222
+ peekCheckLimited (t , limiter , false , false )
207
223
for n := 0 ; n != 4 ; n ++ {
208
224
limiter .Check (dummyTicker )
209
225
}
210
- peekCheckLimited (t , limiter , false )
226
+ peekCheckLimited (t , limiter , false , false )
211
227
for n := 0 ; n != 10 ; n ++ {
212
228
limiter .Check (dummyTicker )
213
229
}
214
230
time .Sleep (10 * time .Second )
215
- peekCheckLimited (t , limiter , true )
231
+ peekCheckLimited (t , limiter , true , false )
216
232
cancel ()
217
233
// for coverage, triggering the switch statement case for hardcore logic
218
234
limiter2 := NewHardcoreLimiter (2 , 5 )
@@ -221,9 +237,9 @@ func Test_NewHardcoreLimiter(t *testing.T) {
221
237
for n := 0 ; n != 6 ; n ++ {
222
238
limiter2 .Check (dummyTicker )
223
239
}
224
- peekCheckLimited (t , limiter2 , true )
240
+ peekCheckLimited (t , limiter2 , true , false )
225
241
time .Sleep (4 * time .Second )
226
- peekCheckLimited (t , limiter2 , false )
242
+ peekCheckLimited (t , limiter2 , false , false )
227
243
cancel2 ()
228
244
}
229
245
@@ -314,3 +330,18 @@ func Test_ConcurrentShouldLimit(t *testing.T) {
314
330
concurrentTest (t , 50 , 21 , 20 , true )
315
331
concurrentTest (t , 50 , 51 , 50 , true )
316
332
}
333
+
334
+ func Test_debugChannelOverflow (t * testing.T ) {
335
+ limiter := NewDefaultLimiter ()
336
+ _ = limiter .DebugChannel ()
337
+ for n := 0 ; n != 78 ; n ++ {
338
+ limiter .Check (dummyTicker )
339
+ if limiter .debugLost > 0 {
340
+ t .Fatalf ("debug channel overflowed" )
341
+ }
342
+ }
343
+ limiter .Check (dummyTicker )
344
+ if limiter .debugLost == 0 {
345
+ t .Fatalf ("debug channel did not overflow" )
346
+ }
347
+ }
0 commit comments