test_that("throttling affects request performance", {
skip_on_cran()
on.exit(throttle_reset())
local_mocked_bindings(unix_time = function() 0)
req <- request_test() %>% req_throttle(capacity = 4, fill_time_s = 1)
. <- replicate(4, req_perform(req))
local_mocked_bindings(unix_time = function() 0.1)
expect_snapshot(time <- system.time(req_perform(req))[[3]])
expect_gte(time, 1 / 4 - 0.1)
})
test_that("first request isn't throttled", {
on.exit(throttle_reset())
mock_time <- 0
local_mocked_bindings(unix_time = function() mock_time)
req <- request_test() %>% req_throttle(rate = 1, fill_time_s = 1)
expect_equal(throttle_delay(req), 0)
mock_time <- 0.1
expect_equal(throttle_delay(req), 0.9)
mock_time <- 1.5
expect_equal(throttle_delay(req), 0.5)
})
test_that("realm defaults to hostname but can be overridden", {
on.exit(throttle_reset())
expect_named(the$throttle, character())
request_test() %>% req_throttle(100 / 1)
expect_named(the$throttle, "127.0.0.1")
throttle_reset()
request_test() %>% req_throttle(100 / 1, realm = "custom")
expect_named(the$throttle, "custom")
})
# token bucket ----------------------------------------------------------------
test_that("token bucket respects capacity limits", {
mock_time <- 0
local_mocked_bindings(unix_time = function() mock_time)
bucket <- TokenBucket$new(capacity = 2, fill_time_s = 1)
expect_equal(bucket$take_token(), 0)
expect_equal(bucket$tokens, 1)
expect_equal(bucket$take_token(), 0)
expect_equal(bucket$tokens, 0)
expect_equal(bucket$take_token(), 0.5)
mock_time <- 0.5
expect_equal(bucket$take_token(), 0.5)
})
test_that("token bucket handles fractions correctly", {
mock_time <- 0
local_mocked_bindings(unix_time = function() mock_time)
bucket <- TokenBucket$new(capacity = 2, fill_time_s = 1)
bucket$tokens <- 0
expect_equal(bucket$take_token(), 0.5)
expect_equal(bucket$tokens, -1)
mock_time <- 0.5
expect_equal(bucket$refill(), 0)
bucket$last_fill <- 0
bucket$tokens <- 0
mock_time <- 0.4
expect_equal(bucket$refill(), 0.80)
expect_equal(bucket$take_token(), 0.1)
mock_time <- mock_time + 0.1
expect_equal(bucket$refill(), 0)
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.