@@ -135,38 +135,47 @@ func TestApplyServiceLimit(t *testing.T) {
135
135
136
136
// Test with nil limiter
137
137
var limiter * serviceLimiter
138
- tokens := limiter .applyServiceLimit (time .Now (), 50.0 )
138
+ now := time .Now ()
139
+ tokens , minTrickleTimeMs := limiter .applyServiceLimit (now , 50.0 )
139
140
re .Equal (50.0 , tokens )
141
+ re .Zero (minTrickleTimeMs )
140
142
141
143
// Test with zero service limit (no limit)
142
144
limiter = newServiceLimiter (constant .NullKeyspaceID , 0.0 , nil )
143
- now : = time .Now ()
144
- tokens = limiter .applyServiceLimit (now , 50.0 )
145
+ now = time .Now ()
146
+ tokens , minTrickleTimeMs = limiter .applyServiceLimit (now , 50.0 )
145
147
re .Equal (50.0 , tokens )
148
+ re .Zero (minTrickleTimeMs )
146
149
147
150
// Test request within available tokens (need to set available tokens first)
148
151
limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
152
+ now = time .Now ()
149
153
limiter .AvailableTokens = 100.0 // Manually set available tokens
150
154
limiter .LastUpdate = now
151
- tokens = limiter .applyServiceLimit (now , 50.0 )
155
+ tokens , minTrickleTimeMs = limiter .applyServiceLimit (now , 50.0 )
152
156
re .Equal (50.0 , tokens )
153
157
re .Equal (50.0 , limiter .AvailableTokens ) // 100 - 50 = 50
158
+ re .Equal (int64 (500 ), minTrickleTimeMs ) // 50/100 * 1000 = 500ms
154
159
155
160
// Test request exactly equal to available tokens
156
161
limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
162
+ now = time .Now ()
157
163
limiter .AvailableTokens = 100.0 // Manually set available tokens
158
164
limiter .LastUpdate = now
159
- tokens = limiter .applyServiceLimit (now , 100.0 )
165
+ tokens , minTrickleTimeMs = limiter .applyServiceLimit (now , 100.0 )
160
166
re .Equal (100.0 , tokens )
161
167
re .Equal (0.0 , limiter .AvailableTokens )
168
+ re .Equal (int64 (1000 ), minTrickleTimeMs ) // 100/100 * 1000 = 1000ms
162
169
163
170
// Test request exceeding available tokens
164
171
limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
172
+ now = time .Now ()
165
173
limiter .LastUpdate = now
166
174
limiter .AvailableTokens = 30.0
167
- tokens = limiter .applyServiceLimit (now , 80.0 )
175
+ tokens , minTrickleTimeMs = limiter .applyServiceLimit (now , 80.0 )
168
176
re .Equal (30.0 , tokens ) // Only available tokens granted
169
177
re .Equal (0.0 , limiter .AvailableTokens )
178
+ re .Equal (int64 (300 ), minTrickleTimeMs ) // 30/100 * 1000 = 300ms
170
179
}
171
180
172
181
func TestApplyServiceLimitWithRefill (t * testing.T ) {
@@ -180,21 +189,23 @@ func TestApplyServiceLimitWithRefill(t *testing.T) {
180
189
181
190
// Request after 1 second should trigger refill first
182
191
futureTime := baseTime .Add (time .Second )
183
- tokens := limiter .applyServiceLimit (futureTime , 50.0 )
192
+ tokens , minTrickleTimeMs := limiter .applyServiceLimit (futureTime , 50.0 )
184
193
re .Equal (50.0 , tokens )
185
194
re .Equal (70.0 , limiter .AvailableTokens ) // 20 + 100 - 50 = 70
186
195
re .Equal (futureTime , limiter .LastUpdate )
196
+ re .Equal (int64 (500 ), minTrickleTimeMs ) // 50/100 * 1000 = 500ms
187
197
188
198
// Test partial refill scenario
189
199
limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
190
200
limiter .LastUpdate = baseTime
191
201
limiter .AvailableTokens = 10.0
192
202
193
203
halfSecondLater := baseTime .Add (500 * time .Millisecond )
194
- tokens = limiter .applyServiceLimit (halfSecondLater , 80.0 )
204
+ tokens , minTrickleTimeMs = limiter .applyServiceLimit (halfSecondLater , 80.0 )
195
205
// After refill: 10 + 100*0.5 = 60 tokens available
196
206
re .Equal (60.0 , tokens )
197
207
re .Equal (0.0 , limiter .AvailableTokens )
208
+ re .Equal (int64 (600 ), minTrickleTimeMs ) // 60/100 * 1000 = 600ms
198
209
}
199
210
200
211
func TestServiceLimiterEdgeCases (t * testing.T ) {
@@ -205,32 +216,37 @@ func TestServiceLimiterEdgeCases(t *testing.T) {
205
216
limiter .AvailableTokens = 0.1 // Manually set available tokens
206
217
limiter .LastUpdate = time .Now () // Set LastUpdate to current time to avoid refill
207
218
now := time .Now ()
208
- tokens := limiter .applyServiceLimit (now , 1.0 )
209
- re .InDelta (0.1 , tokens , 0.001 ) // Use InDelta to handle floating point precision
219
+ tokens , minTrickleTimeMs := limiter .applyServiceLimit (now , 1.0 )
220
+ re .InDelta (0.1 , tokens , 0.001 ) // Use InDelta to handle floating point precision
221
+ re .Equal (int64 (1000 ), minTrickleTimeMs ) // 0.1/0.1 * 1000 = 1000ms
210
222
211
223
// Test with very large service limit
212
224
limiter = newServiceLimiter (constant .NullKeyspaceID , 1000000.0 , nil )
213
225
limiter .AvailableTokens = 1000000.0 // Manually set available tokens
214
- tokens = limiter .applyServiceLimit (now , 500000.0 )
226
+ tokens , minTrickleTimeMs = limiter .applyServiceLimit (now , 500000.0 )
215
227
re .Equal (500000.0 , tokens )
228
+ re .Equal (int64 (500 ), minTrickleTimeMs ) // 500000/1000000 * 1000 = 500ms
216
229
217
230
// Test with zero requested tokens
218
231
limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
219
232
limiter .AvailableTokens = 100.0 // Manually set available tokens
220
- tokens = limiter .applyServiceLimit (now , 0.0 )
233
+ tokens , minTrickleTimeMs = limiter .applyServiceLimit (now , 0.0 )
221
234
re .Equal (0.0 , tokens )
222
235
re .Equal (100.0 , limiter .AvailableTokens ) // Should remain unchanged
236
+ re .Zero (minTrickleTimeMs )
223
237
224
238
// Test with fractional tokens
225
239
limiter = newServiceLimiter (constant .NullKeyspaceID , 10.5 , nil )
226
240
limiter .LastUpdate = now
227
241
limiter .AvailableTokens = 5.25
228
- tokens = limiter .applyServiceLimit (now , 7.75 )
242
+ tokens , minTrickleTimeMs = limiter .applyServiceLimit (now , 7.75 )
229
243
re .Equal (5.25 , tokens )
244
+ re .Equal (int64 (500 ), minTrickleTimeMs ) // 5.25/10.5 * 1000 = 500ms
230
245
// Test apply with 0 available ru
231
- tokens = limiter .applyServiceLimit (now , 5 )
246
+ tokens , minTrickleTimeMs = limiter .applyServiceLimit (now , 5 )
232
247
re .Equal (0.0 , tokens )
233
248
re .Equal (0.0 , limiter .AvailableTokens )
249
+ re .Zero (minTrickleTimeMs )
234
250
}
235
251
236
252
func TestSetServiceLimit (t * testing.T ) {
0 commit comments