Files
mostlymatter/vendor/github.com/segmentio/backo-go/backo_test.go
2016-09-06 19:51:27 -03:00

78 строки
2.0 KiB
Go

package backo
import (
"fmt"
"math"
"testing"
"time"
"github.com/bmizerany/assert"
)
// Tests default backo behaviour.
func TestDefaults(t *testing.T) {
backo := DefaultBacko()
assert.Equal(t, milliseconds(100), backo.Duration(0))
assert.Equal(t, milliseconds(200), backo.Duration(1))
assert.Equal(t, milliseconds(400), backo.Duration(2))
assert.Equal(t, milliseconds(800), backo.Duration(3))
}
// Tests backo does not exceed cap.
func TestCap(t *testing.T) {
backo := NewBacko(milliseconds(100), 2, 0, milliseconds(600))
assert.Equal(t, milliseconds(100), backo.Duration(0))
assert.Equal(t, milliseconds(200), backo.Duration(1))
assert.Equal(t, milliseconds(400), backo.Duration(2))
assert.Equal(t, milliseconds(600), backo.Duration(3))
}
// Tests that jitter adds randomness.
func TestJitter(t *testing.T) {
defaultBacko := NewBacko(milliseconds(100), 2, 1, milliseconds(10*1000))
jitterBacko := NewBacko(milliseconds(100), 2, 1, milliseconds(10*1000))
// TODO: Check jittered durations are within a range.
assert.NotEqual(t, jitterBacko.Duration(0), defaultBacko.Duration(0))
assert.NotEqual(t, jitterBacko.Duration(1), defaultBacko.Duration(1))
assert.NotEqual(t, jitterBacko.Duration(2), defaultBacko.Duration(2))
assert.NotEqual(t, jitterBacko.Duration(3), defaultBacko.Duration(3))
}
func ExampleBacko_BackoffDefault() {
b := DefaultBacko()
ticker := b.NewTicker()
for i := 0; i < 6; i++ {
start := time.Now()
select {
case t := <-ticker.C:
fmt.Println(nearest10Millis(t.Sub(start)))
}
}
ticker.Stop()
// Output:
// 100
// 200
// 400
// 800
// 1600
// 3200
}
func nearest10Millis(d time.Duration) float64 {
// Typically d is something like 11 or 21, so do some magic to round the
// durations to the nearest 10. We divide d by 10, floor it, and multiply it
// by 10 again.
return math.Floor(float64(d/time.Millisecond/10) * 10)
}
// Returns the given milliseconds as time.Duration
func milliseconds(ms int64) time.Duration {
return time.Duration(ms * 1000 * 1000)
}