def test_flushing(): """Multi-rates Limiter with RedisBucket""" rate_1 = RequestRate(5, 5 * Duration.SECOND) limiter = Limiter( rate_1, bucket_class=RedisBucket, bucket_kwargs={ "redis_pool": pool, "bucket_name": "Flushing-Bucket", }, ) item = "redis-test-item" for _ in range(3): limiter.try_acquire(item) size = limiter.get_current_volume(item) assert size == 3 assert limiter.flush_all() == 1 size = limiter.get_current_volume(item) assert size == 0
def test_simple_02(): """Multi-rates Limiter""" rate_1 = RequestRate(5, 5 * Duration.SECOND) rate_2 = RequestRate(7, 9 * Duration.SECOND) limiter2 = Limiter(rate_1, rate_2) item = "tranvu" err = None with pytest.raises(BucketFullException) as err: # Try add 6 items within 5 seconds # Exceed Rate-1 for _ in range(6): limiter2.try_acquire(item) print(err.value.meta_info) assert limiter2.get_current_volume(item) == 5 sleep(6) # Still shorter than Rate-2 interval, so all items must be kept limiter2.try_acquire(item) limiter2.try_acquire(item) assert limiter2.get_current_volume(item) == 7 with pytest.raises(BucketFullException) as err: # Exceed Rate-2 limiter2.try_acquire(item) print(err.value.meta_info) sleep(6) # 12 seconds passed limiter2.try_acquire(item) # Only items within last 9 seconds kept, plus the new one assert limiter2.get_current_volume(item) == 3 # print('Bucket Rate-1:', limiter2.get_filled_slots(rate_1, item)) # print('Bucket Rate-2:', limiter2.get_filled_slots(rate_2, item)) # Within the nearest 5 second interval # Rate-1 has only 1 item, so we can add 4 more limiter2.try_acquire(item) limiter2.try_acquire(item) limiter2.try_acquire(item) limiter2.try_acquire(item) with pytest.raises(BucketFullException): # Exceed Rate-1 again limiter2.try_acquire(item) # Withint the nearest 9 second-interval, we have 7 items assert limiter2.get_current_volume(item) == 7 # Fast forward to 6 more seconds # Bucket Rate-1 is refreshed and empty by now # Bucket Rate-2 has now only 5 items sleep(6) # print('Bucket Rate-1:', limiter2.get_filled_slots(rate_1, item)) # print('Bucket Rate-2:', limiter2.get_filled_slots(rate_2, item)) limiter2.try_acquire(item) limiter2.try_acquire(item) with pytest.raises(BucketFullException): # Exceed Rate-2 again limiter2.try_acquire(item) assert limiter2.flush_all() == 1 assert limiter2.get_current_volume(item) == 0