summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/segmentio/backo-go/backo_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/segmentio/backo-go/backo_test.go')
-rw-r--r--vendor/github.com/segmentio/backo-go/backo_test.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/vendor/github.com/segmentio/backo-go/backo_test.go b/vendor/github.com/segmentio/backo-go/backo_test.go
new file mode 100644
index 000000000..89933acf7
--- /dev/null
+++ b/vendor/github.com/segmentio/backo-go/backo_test.go
@@ -0,0 +1,77 @@
+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)
+}