mirror of
https://github.com/hanzos3/go.git
synced 2026-10-30 19:54:46 +00:00
139 lines
3.4 KiB
Go
139 lines
3.4 KiB
Go
package minio
|
|
|
|
import (
|
|
"context"
|
|
"math/rand"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestRetryTimer(t *testing.T) {
|
|
t.Run("withLimit", func(t *testing.T) {
|
|
t.Parallel()
|
|
c := &Client{random: rand.New(rand.NewSource(42))}
|
|
ctx := context.Background()
|
|
var count int
|
|
for range c.newRetryTimer(ctx, 3, time.Millisecond, 10*time.Millisecond, 0.0) {
|
|
count++
|
|
}
|
|
if count != 3 {
|
|
t.Errorf("expected exactly 3 yields")
|
|
}
|
|
})
|
|
|
|
t.Run("checkDelay", func(t *testing.T) {
|
|
t.Parallel()
|
|
c := &Client{random: rand.New(rand.NewSource(42))}
|
|
ctx := context.Background()
|
|
prev := time.Now()
|
|
baseSleep := time.Millisecond
|
|
maxSleep := 10 * time.Millisecond
|
|
for i := range c.newRetryTimer(ctx, 6, baseSleep, maxSleep, 0.0) {
|
|
if i == 0 {
|
|
// there is no sleep for the first execution
|
|
if time.Since(prev) >= time.Millisecond {
|
|
t.Errorf("expected to not sleep for the first instance of the loop")
|
|
}
|
|
prev = time.Now()
|
|
continue
|
|
}
|
|
expect := baseSleep * time.Duration(1<<uint(i-1))
|
|
expect = min(expect, maxSleep)
|
|
if d := time.Since(prev); d < expect || d > 2*maxSleep {
|
|
t.Errorf("expected to sleep for at least %s", expect.String())
|
|
}
|
|
prev = time.Now()
|
|
}
|
|
})
|
|
|
|
t.Run("withBreak", func(t *testing.T) {
|
|
t.Parallel()
|
|
c := &Client{random: rand.New(rand.NewSource(42))}
|
|
ctx := context.Background()
|
|
var count int
|
|
for range c.newRetryTimer(ctx, 10, time.Millisecond, 10*time.Millisecond, 0.5) {
|
|
count++
|
|
if count >= 3 {
|
|
break
|
|
}
|
|
}
|
|
if count != 3 {
|
|
t.Errorf("expected exactly 3 yields")
|
|
}
|
|
})
|
|
|
|
t.Run("withCancelledContext", func(t *testing.T) {
|
|
t.Parallel()
|
|
c := &Client{random: rand.New(rand.NewSource(42))}
|
|
ctx := context.Background()
|
|
ctx, cancel := context.WithCancel(ctx)
|
|
cancel()
|
|
var count int
|
|
for range c.newRetryTimer(ctx, 10, time.Millisecond, 10*time.Millisecond, 0.5) {
|
|
count++
|
|
}
|
|
if count != 0 {
|
|
t.Errorf("expected no yields")
|
|
}
|
|
})
|
|
t.Run("whileCancelledContext", func(t *testing.T) {
|
|
t.Parallel()
|
|
c := &Client{random: rand.New(rand.NewSource(42))}
|
|
ctx := context.Background()
|
|
ctx, cancel := context.WithCancel(ctx)
|
|
var count int
|
|
for range c.newRetryTimer(ctx, 10, time.Millisecond, 10*time.Millisecond, 0.5) {
|
|
count++
|
|
cancel()
|
|
}
|
|
cancel()
|
|
if count != 1 {
|
|
t.Errorf("expected only one yield")
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestRetryContinuous(t *testing.T) {
|
|
t.Run("checkDelay", func(t *testing.T) {
|
|
t.Parallel()
|
|
c := &Client{random: rand.New(rand.NewSource(42))}
|
|
prev := time.Now()
|
|
baseSleep := time.Millisecond
|
|
maxSleep := 10 * time.Millisecond
|
|
for i := range c.newRetryTimerContinous(time.Millisecond, 10*time.Millisecond, 0.0) {
|
|
if i == 0 {
|
|
// there is no sleep for the first execution
|
|
if time.Since(prev) >= time.Millisecond {
|
|
t.Errorf("expected to not sleep for the first instance of the loop")
|
|
}
|
|
prev = time.Now()
|
|
continue
|
|
}
|
|
expect := baseSleep * time.Duration(1<<uint(i-1))
|
|
expect = min(expect, maxSleep)
|
|
if d := time.Since(prev); d < expect || d > 2*maxSleep {
|
|
t.Errorf("expected to sleep for at least %s", expect.String())
|
|
}
|
|
prev = time.Now()
|
|
if i >= 10 {
|
|
break
|
|
}
|
|
}
|
|
})
|
|
|
|
t.Run("withBreak", func(t *testing.T) {
|
|
t.Parallel()
|
|
c := &Client{random: rand.New(rand.NewSource(42))}
|
|
var count int
|
|
for range c.newRetryTimerContinous(time.Millisecond, 10*time.Millisecond, 0.5) {
|
|
count++
|
|
if count >= 3 {
|
|
break
|
|
}
|
|
}
|
|
if count != 3 {
|
|
t.Errorf("expected exactly 3 yields")
|
|
}
|
|
})
|
|
}
|