63 lines
1.8 KiB
Go
63 lines
1.8 KiB
Go
|
package controller
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
"github.com/stretchr/testify/require"
|
||
|
)
|
||
|
|
||
|
func TestRateLimiter_Backoff(t *testing.T) {
|
||
|
t.Parallel()
|
||
|
|
||
|
limiter := NewRateLimiter(1*time.Millisecond, 1*time.Second)
|
||
|
|
||
|
request := Request{Kind: "one"}
|
||
|
require.Equal(t, 1*time.Millisecond, limiter.NextRetry(request))
|
||
|
require.Equal(t, 2*time.Millisecond, limiter.NextRetry(request))
|
||
|
require.Equal(t, 4*time.Millisecond, limiter.NextRetry(request))
|
||
|
require.Equal(t, 8*time.Millisecond, limiter.NextRetry(request))
|
||
|
require.Equal(t, 16*time.Millisecond, limiter.NextRetry(request))
|
||
|
|
||
|
requestTwo := Request{Kind: "two"}
|
||
|
require.Equal(t, 1*time.Millisecond, limiter.NextRetry(requestTwo))
|
||
|
require.Equal(t, 2*time.Millisecond, limiter.NextRetry(requestTwo))
|
||
|
|
||
|
limiter.Forget(request)
|
||
|
require.Equal(t, 1*time.Millisecond, limiter.NextRetry(request))
|
||
|
}
|
||
|
|
||
|
func TestRateLimiter_Overflow(t *testing.T) {
|
||
|
t.Parallel()
|
||
|
|
||
|
limiter := NewRateLimiter(1*time.Millisecond, 1000*time.Second)
|
||
|
|
||
|
request := Request{Kind: "one"}
|
||
|
for i := 0; i < 5; i++ {
|
||
|
limiter.NextRetry(request)
|
||
|
}
|
||
|
// ensure we have a normally incrementing exponential backoff
|
||
|
require.Equal(t, 32*time.Millisecond, limiter.NextRetry(request))
|
||
|
|
||
|
overflow := Request{Kind: "overflow"}
|
||
|
for i := 0; i < 1000; i++ {
|
||
|
limiter.NextRetry(overflow)
|
||
|
}
|
||
|
// make sure we're capped at the passed in max backoff
|
||
|
require.Equal(t, 1000*time.Second, limiter.NextRetry(overflow))
|
||
|
|
||
|
limiter = NewRateLimiter(1*time.Minute, 1000*time.Hour)
|
||
|
|
||
|
for i := 0; i < 2; i++ {
|
||
|
limiter.NextRetry(request)
|
||
|
}
|
||
|
// ensure we have a normally incrementing exponential backoff
|
||
|
require.Equal(t, 4*time.Minute, limiter.NextRetry(request))
|
||
|
|
||
|
for i := 0; i < 1000; i++ {
|
||
|
limiter.NextRetry(overflow)
|
||
|
}
|
||
|
// make sure we're capped at the passed in max backoff
|
||
|
require.Equal(t, 1000*time.Hour, limiter.NextRetry(overflow))
|
||
|
}
|