You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
2.5 KiB
140 lines
2.5 KiB
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) |
|
} |
|
}
|
|
|