141 lines
2.5 KiB
Go
141 lines
2.5 KiB
Go
package elastic
|
|
|
|
import (
|
|
"math/rand"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestZeroBackoff(t *testing.T) {
|
|
b := ZeroBackoff{}
|
|
_, ok := b.Next(0)
|
|
if !ok {
|
|
t.Fatalf("expected %v, got %v", true, ok)
|
|
}
|
|
}
|
|
|
|
func TestStopBackoff(t *testing.T) {
|
|
b := StopBackoff{}
|
|
_, ok := b.Next(0)
|
|
if ok {
|
|
t.Fatalf("expected %v, got %v", false, ok)
|
|
}
|
|
}
|
|
|
|
func TestConstantBackoff(t *testing.T) {
|
|
b := NewConstantBackoff(time.Second)
|
|
d, ok := b.Next(0)
|
|
if !ok {
|
|
t.Fatalf("expected %v, got %v", true, ok)
|
|
}
|
|
if d != time.Second {
|
|
t.Fatalf("expected %v, got %v", time.Second, d)
|
|
}
|
|
}
|
|
|
|
func TestSimpleBackoff(t *testing.T) {
|
|
var tests = []struct {
|
|
Duration time.Duration
|
|
Continue bool
|
|
}{
|
|
// #0
|
|
{
|
|
Duration: 1 * time.Millisecond,
|
|
Continue: true,
|
|
},
|
|
// #1
|
|
{
|
|
Duration: 2 * time.Millisecond,
|
|
Continue: true,
|
|
},
|
|
// #2
|
|
{
|
|
Duration: 7 * time.Millisecond,
|
|
Continue: true,
|
|
},
|
|
// #3
|
|
{
|
|
Duration: 0,
|
|
Continue: false,
|
|
},
|
|
// #4
|
|
{
|
|
Duration: 0,
|
|
Continue: false,
|
|
},
|
|
}
|
|
|
|
b := NewSimpleBackoff(1, 2, 7)
|
|
|
|
for i, tt := range tests {
|
|
d, ok := b.Next(i)
|
|
if got, want := ok, tt.Continue; got != want {
|
|
t.Fatalf("#%d: expected %v, got %v", i, want, got)
|
|
}
|
|
if got, want := d, tt.Duration; got != want {
|
|
t.Fatalf("#%d: expected %v, got %v", i, want, got)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestExponentialBackoff(t *testing.T) {
|
|
rand.Seed(time.Now().UnixNano())
|
|
|
|
min := time.Duration(8) * time.Millisecond
|
|
max := time.Duration(256) * time.Millisecond
|
|
b := NewExponentialBackoff(min, max)
|
|
|
|
between := func(value time.Duration, a, b int) bool {
|
|
x := int(value / time.Millisecond)
|
|
return a <= x && x <= b
|
|
}
|
|
|
|
got, ok := b.Next(0)
|
|
if !ok {
|
|
t.Fatalf("expected %v, got %v", true, ok)
|
|
}
|
|
if !between(got, 8, 256) {
|
|
t.Errorf("expected [%v..%v], got %v", 8, 256, got)
|
|
}
|
|
|
|
got, ok = b.Next(1)
|
|
if !ok {
|
|
t.Fatalf("expected %v, got %v", true, ok)
|
|
}
|
|
if !between(got, 8, 256) {
|
|
t.Errorf("expected [%v..%v], got %v", 8, 256, got)
|
|
}
|
|
|
|
got, ok = b.Next(2)
|
|
if !ok {
|
|
t.Fatalf("expected %v, got %v", true, ok)
|
|
}
|
|
if !between(got, 8, 256) {
|
|
t.Errorf("expected [%v..%v], got %v", 8, 256, got)
|
|
}
|
|
|
|
got, ok = b.Next(3)
|
|
if !ok {
|
|
t.Fatalf("expected %v, got %v", true, ok)
|
|
}
|
|
if !between(got, 8, 256) {
|
|
t.Errorf("expected [%v..%v], got %v", 8, 256, got)
|
|
}
|
|
|
|
got, ok = b.Next(4)
|
|
if !ok {
|
|
t.Fatalf("expected %v, got %v", true, ok)
|
|
}
|
|
if !between(got, 8, 256) {
|
|
t.Errorf("expected [%v..%v], got %v", 8, 256, got)
|
|
}
|
|
|
|
if _, ok := b.Next(5); ok {
|
|
t.Fatalf("expected %v, got %v", false, ok)
|
|
}
|
|
|
|
if _, ok = b.Next(6); ok {
|
|
t.Fatalf("expected %v, got %v", false, ok)
|
|
}
|
|
}
|