@@ -155,5 +155,123 @@ public void AddDomain_ParamGreaterThanDefault_UsesParam()
155
155
156
156
Assert . IsTrue ( timer . ElapsedMilliseconds > 190 ) ;
157
157
}
158
+
159
+ [ Test ]
160
+ public void AddDomain_AddDuplicateDomain_FirstAddWins ( )
161
+ {
162
+ var domainRateLimiter = new DomainRateLimiter ( 5 ) ;
163
+ var domain = new Uri ( "http://a.com" ) ;
164
+
165
+ domainRateLimiter . AddDomain ( domain , 50 ) ;
166
+ domainRateLimiter . AddDomain ( domain , 150 ) ; //This should be ignored
167
+
168
+ var timer = System . Diagnostics . Stopwatch . StartNew ( ) ;
169
+ domainRateLimiter . RateLimit ( domain ) ;
170
+ domainRateLimiter . RateLimit ( domain ) ;
171
+ timer . Stop ( ) ;
172
+
173
+ Assert . IsTrue ( timer . ElapsedMilliseconds >= 50 && timer . ElapsedMilliseconds < 150 , string . Format ( "Expected it to take more than 50 but less than 150 but only took {0}" , timer . ElapsedMilliseconds ) ) ;
174
+ }
175
+
176
+
177
+ [ Test ]
178
+ [ ExpectedException ( typeof ( ArgumentNullException ) ) ]
179
+ public void AddOrUpdateDomain_NullUri ( )
180
+ {
181
+ new DomainRateLimiter ( 1000 ) . AddOrUpdateDomain ( null , 100 ) ;
182
+ }
183
+
184
+ [ Test ]
185
+ [ ExpectedException ( typeof ( ArgumentException ) ) ]
186
+ public void AddOrUpdateDomain_ZeroCrawlDelay ( )
187
+ {
188
+ new DomainRateLimiter ( 1000 ) . AddOrUpdateDomain ( new Uri ( "http://a.com" ) , 0 ) ;
189
+ }
190
+
191
+ [ Test ]
192
+ [ ExpectedException ( typeof ( ArgumentException ) ) ]
193
+ public void AddOrUpdateDomain_NegativeCrawlDelay ( )
194
+ {
195
+ new DomainRateLimiter ( 1000 ) . AddOrUpdateDomain ( new Uri ( "http://a.com" ) , - 1 ) ;
196
+ }
197
+
198
+ [ Test ]
199
+ public void AddOrUpdateDomain_ParamLessThanDefault_UsesDefault ( )
200
+ {
201
+ Uri rootUri = new Uri ( "http://a.com/" ) ;
202
+ Uri pageUri1 = new Uri ( "http://a.com/a.html" ) ;
203
+ Uri pageUri2 = new Uri ( "http://a.com/b.html" ) ;
204
+
205
+ Stopwatch timer = Stopwatch . StartNew ( ) ;
206
+ DomainRateLimiter unitUnderTest = new DomainRateLimiter ( 100 ) ;
207
+
208
+ unitUnderTest . AddOrUpdateDomain ( rootUri , 5 ) ;
209
+
210
+ unitUnderTest . RateLimit ( rootUri ) ;
211
+ unitUnderTest . RateLimit ( pageUri1 ) ;
212
+ unitUnderTest . RateLimit ( pageUri2 ) ;
213
+ timer . Stop ( ) ;
214
+
215
+ Assert . IsTrue ( timer . ElapsedMilliseconds > 190 ) ;
216
+ }
217
+
218
+ [ Test ]
219
+ public void AddOrUpdateDomain_ParamGreaterThanDefault_UsesParam ( )
220
+ {
221
+ Uri rootUri = new Uri ( "http://a.com/" ) ;
222
+ Uri pageUri1 = new Uri ( "http://a.com/a.html" ) ;
223
+ Uri pageUri2 = new Uri ( "http://a.com/b.html" ) ;
224
+
225
+ Stopwatch timer = Stopwatch . StartNew ( ) ;
226
+ DomainRateLimiter unitUnderTest = new DomainRateLimiter ( 5 ) ;
227
+
228
+ unitUnderTest . AddOrUpdateDomain ( rootUri , 100 ) ;
229
+
230
+ unitUnderTest . RateLimit ( rootUri ) ;
231
+ unitUnderTest . RateLimit ( pageUri1 ) ;
232
+ unitUnderTest . RateLimit ( pageUri2 ) ;
233
+ timer . Stop ( ) ;
234
+
235
+ Assert . IsTrue ( timer . ElapsedMilliseconds > 190 ) ;
236
+ }
237
+
238
+ [ Test ]
239
+ public void AddOrUpdateDomain_AddDuplicateDomain_LastUpdateWins ( )
240
+ {
241
+ var domainRateLimiter = new DomainRateLimiter ( 5 ) ;
242
+ var domain = new Uri ( "http://a.com" ) ;
243
+
244
+ domainRateLimiter . AddOrUpdateDomain ( domain , 50 ) ;
245
+ domainRateLimiter . AddOrUpdateDomain ( domain , 150 ) ; //This should override the previous
246
+
247
+ var timer = System . Diagnostics . Stopwatch . StartNew ( ) ;
248
+ domainRateLimiter . RateLimit ( domain ) ;
249
+ domainRateLimiter . RateLimit ( domain ) ;
250
+ timer . Stop ( ) ;
251
+
252
+ Assert . IsTrue ( timer . ElapsedMilliseconds >= 150 , $ "Expected it to take more than 150 millisecs but only took { timer . ElapsedMilliseconds } ") ;
253
+ }
254
+
255
+
256
+ [ Test ]
257
+ public void RemoveDomain_NoLongerRateLimitsThatDomain ( )
258
+ {
259
+ //Arrange
260
+ var domainRateLimiter = new DomainRateLimiter ( 5 ) ;
261
+ var domain = new Uri ( "http://a.com" ) ;
262
+
263
+ domainRateLimiter . AddDomain ( domain , 1000 ) ;
264
+
265
+ //Act
266
+ domainRateLimiter . RemoveDomain ( domain ) ;
267
+
268
+ //Assert
269
+ var timer = System . Diagnostics . Stopwatch . StartNew ( ) ;
270
+ domainRateLimiter . RateLimit ( domain ) ;
271
+ domainRateLimiter . RateLimit ( domain ) ;
272
+ timer . Stop ( ) ;
273
+
274
+ Assert . IsTrue ( timer . ElapsedMilliseconds < 25 , $ "Expected it to take less than 25 millisecs but only took { timer . ElapsedMilliseconds } ") ;
275
+ }
158
276
}
159
277
}
0 commit comments