Example #1
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'

    with pytest.raises(BucketFullException):
        # Try add 6 items within 5 seconds
        # Exceed Rate-1
        for _ in range(6):
            limiter2.try_acquire(item)

    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):
        # Exceed Rate-2
        limiter2.try_acquire(item)

    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)
Example #2
0
def test_simple_01(time_function):
    """Single-rate Limiter with RedisBucket"""
    rate = RequestRate(3, 5 * Duration.SECOND)
    limiter = Limiter(
        rate,
        bucket_class=RedisBucket,
        # Separate buckets used to distinct values from previous run,
        # as time_function return value has different int part.
        bucket_kwargs={
            "redis_pool": pool,
            "bucket_name": str(time_function)
        },
        time_function=time_function,
    )
    item = "vutran_list"

    with pytest.raises(BucketFullException):
        for _ in range(4):
            limiter.try_acquire(item)

    sleep(6)
    limiter.try_acquire(item)
    vol = limiter.get_current_volume(item)
    assert vol == 1

    limiter.try_acquire(item)
    limiter.try_acquire(item)

    with pytest.raises(BucketFullException):
        limiter.try_acquire(item)
Example #3
0
def test_simple_01():
    """ Single-rate Limiter with RedisBucket
    """
    rate = RequestRate(3, 5 * Duration.SECOND)
    limiter = Limiter(
        rate,
        bucket_class=RedisBucket,
        bucket_kwargs={
            "redis_pool": pool,
            "bucket_name": "test-bucket-1"
        },
    )
    item = 'vutran_list'

    with pytest.raises(BucketFullException):
        for _ in range(4):
            limiter.try_acquire(item)

    sleep(6)
    limiter.try_acquire(item)
    vol = limiter.get_current_volume(item)
    assert vol == 1

    limiter.try_acquire(item)
    limiter.try_acquire(item)

    with pytest.raises(BucketFullException):
        limiter.try_acquire(item)
Example #4
0
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
Example #5
0
def test_simple_01():
    """Single-rate Limiter"""
    with pytest.raises(InvalidParams):
        # No rates provided
        Limiter()

    with pytest.raises(InvalidParams):
        rate_1 = RequestRate(3, 5 * Duration.SECOND)
        rate_2 = RequestRate(4, 5 * Duration.SECOND)
        Limiter(rate_1, rate_2)

    rate = RequestRate(3, 5 * Duration.SECOND)

    with pytest.raises(ImmutableClassProperty):
        rate.limit = 10

    with pytest.raises(ImmutableClassProperty):
        rate.interval = 10

    limiter = Limiter(rate)
    item = "vutran"

    has_raised = False
    try:
        for _ in range(4):
            limiter.try_acquire(item)
            sleep(1)
    except BucketFullException as err:
        has_raised = True
        print(err)
        assert str(err)
        assert isinstance(err.meta_info, dict)
        assert 1.9 < err.meta_info["remaining_time"] < 2.0

    assert has_raised

    sleep(6)
    limiter.try_acquire(item)
    vol = limiter.get_current_volume(item)
    assert vol == 1

    limiter.try_acquire(item)
    limiter.try_acquire(item)

    with pytest.raises(BucketFullException):
        limiter.try_acquire(item)
Example #6
0
def test_simple_03():
    """Single-rate Limiter with MemoryListBucket"""
    rate = RequestRate(3, 5 * Duration.SECOND)
    limiter = Limiter(rate, bucket_class=MemoryListBucket)
    item = "vutran_list"

    with pytest.raises(BucketFullException):
        for _ in range(4):
            limiter.try_acquire(item)

    sleep(6)
    limiter.try_acquire(item)
    vol = limiter.get_current_volume(item)
    assert vol == 1

    limiter.try_acquire(item)
    limiter.try_acquire(item)

    with pytest.raises(BucketFullException):
        limiter.try_acquire(item)
Example #7
0
def test_simple_01():
    """ Single-rate Limiter
    """
    rate = RequestRate(3, 5 * Duration.SECOND)
    limiter = Limiter(rate)
    item = 'vutran'

    with pytest.raises(BucketFullException):
        for _ in range(4):
            limiter.try_acquire(item)

    sleep(6)
    limiter.try_acquire(item)
    vol = limiter.get_current_volume(item)
    assert vol == 1

    limiter.try_acquire(item)
    limiter.try_acquire(item)

    with pytest.raises(BucketFullException):
        limiter.try_acquire(item)
Example #8
0
def test_simple_02(time_function):
    """Multi-rates Limiter with RedisBucket"""
    rate_1 = RequestRate(5, 5 * Duration.SECOND)
    rate_2 = RequestRate(7, 9 * Duration.SECOND)
    limiter4 = Limiter(
        rate_1,
        rate_2,
        bucket_class=RedisBucket,
        bucket_kwargs={
            "redis_pool": pool,
            # Separate buckets used to distinct values from previous run,
            # as time_function return value has different int part.
            "bucket_name": str(time_function),
        },
        time_function=time_function,
    )
    item = "redis-test-item"

    with pytest.raises(BucketFullException):
        # Try add 6 items within 5 seconds
        # Exceed Rate-1
        for _ in range(6):
            limiter4.try_acquire(item)

    assert limiter4.get_current_volume(item) == 5

    sleep(6.5)
    # Still shorter than Rate-2 interval, so all items must be kept
    limiter4.try_acquire(item)
    # print('Bucket Rate-1:', limiter4.get_filled_slots(rate_1, item))
    # print('Bucket Rate-2:', limiter4.get_filled_slots(rate_2, item))
    limiter4.try_acquire(item)
    assert limiter4.get_current_volume(item) == 7

    with pytest.raises(BucketFullException):
        # Exceed Rate-2
        limiter4.try_acquire(item)

    sleep(6)
    # 12 seconds passed
    limiter4.try_acquire(item)
    # Only items within last 9 seconds kept, plus the new one
    assert limiter4.get_current_volume(item) == 3

    # print('Bucket Rate-1:', limiter4.get_filled_slots(rate_1, item))
    # print('Bucket Rate-2:', limiter4.get_filled_slots(rate_2, item))
    # Within the nearest 5 second interval
    # Rate-1 has only 1 item, so we can add 4 more
    limiter4.try_acquire(item)
    limiter4.try_acquire(item)
    limiter4.try_acquire(item)
    limiter4.try_acquire(item)

    with pytest.raises(BucketFullException):
        # Exceed Rate-1 again
        limiter4.try_acquire(item)

    # Withint the nearest 9 second-interval, we have 7 items
    assert limiter4.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:', limiter4.get_filled_slots(rate_1, item))
    # print('Bucket Rate-2:', limiter4.get_filled_slots(rate_2, item))
    limiter4.try_acquire(item)
    limiter4.try_acquire(item)

    with pytest.raises(BucketFullException):
        # Exceed Rate-2 again
        limiter4.try_acquire(item)