123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- package fx
- import (
- "context"
- "errors"
- "testing"
- "time"
- "github.com/stretchr/testify/assert"
- )
- func TestRetry(t *testing.T) {
- assert.NotNil(t, DoWithRetry(func() error {
- return errors.New("any")
- }))
- times1 := 0
- assert.Nil(t, DoWithRetry(func() error {
- times1++
- if times1 == defaultRetryTimes {
- return nil
- }
- return errors.New("any")
- }))
- times2 := 0
- assert.NotNil(t, DoWithRetry(func() error {
- times2++
- if times2 == defaultRetryTimes+1 {
- return nil
- }
- return errors.New("any")
- }))
- total := 2 * defaultRetryTimes
- times3 := 0
- assert.Nil(t, DoWithRetry(func() error {
- times3++
- if times3 == total {
- return nil
- }
- return errors.New("any")
- }, WithRetry(total)))
- }
- func TestRetryWithTimeout(t *testing.T) {
- assert.Nil(t, DoWithRetry(func() error {
- return nil
- }, WithTimeout(time.Millisecond*500)))
- times1 := 0
- assert.Nil(t, DoWithRetry(func() error {
- times1++
- if times1 == 1 {
- return errors.New("any ")
- }
- time.Sleep(time.Millisecond * 150)
- return nil
- }, WithTimeout(time.Millisecond*250)))
- total := defaultRetryTimes
- times2 := 0
- assert.Nil(t, DoWithRetry(func() error {
- times2++
- if times2 == total {
- return nil
- }
- time.Sleep(time.Millisecond * 50)
- return errors.New("any")
- }, WithTimeout(time.Millisecond*50*(time.Duration(total)+2))))
- assert.NotNil(t, DoWithRetry(func() error {
- return errors.New("any")
- }, WithTimeout(time.Millisecond*250)))
- }
- func TestRetryWithInterval(t *testing.T) {
- times1 := 0
- assert.NotNil(t, DoWithRetry(func() error {
- times1++
- if times1 == 1 {
- return errors.New("any")
- }
- time.Sleep(time.Millisecond * 150)
- return nil
- }, WithTimeout(time.Millisecond*250), WithInterval(time.Millisecond*150)))
- times2 := 0
- assert.NotNil(t, DoWithRetry(func() error {
- times2++
- if times2 == 2 {
- return nil
- }
- time.Sleep(time.Millisecond * 150)
- return errors.New("any ")
- }, WithTimeout(time.Millisecond*250), WithInterval(time.Millisecond*150)))
- }
- func TestRetryCtx(t *testing.T) {
- t.Run("with timeout", func(t *testing.T) {
- assert.NotNil(t, DoWithRetryCtx(context.Background(), func(ctx context.Context, retryCount int) error {
- if retryCount == 0 {
- return errors.New("any")
- }
- time.Sleep(time.Millisecond * 150)
- return nil
- }, WithTimeout(time.Millisecond*250), WithInterval(time.Millisecond*150)))
- assert.NotNil(t, DoWithRetryCtx(context.Background(), func(ctx context.Context, retryCount int) error {
- if retryCount == 1 {
- return nil
- }
- time.Sleep(time.Millisecond * 150)
- return errors.New("any ")
- }, WithTimeout(time.Millisecond*250), WithInterval(time.Millisecond*150)))
- })
- t.Run("with deadline exceeded", func(t *testing.T) {
- ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Millisecond*250))
- defer cancel()
- var times int
- assert.Error(t, DoWithRetryCtx(ctx, func(ctx context.Context, retryCount int) error {
- times++
- time.Sleep(time.Millisecond * 150)
- return errors.New("any")
- }, WithInterval(time.Millisecond*150)))
- assert.Equal(t, 1, times)
- })
- t.Run("with deadline not exceeded", func(t *testing.T) {
- ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Millisecond*250))
- defer cancel()
- var times int
- assert.NoError(t, DoWithRetryCtx(ctx, func(ctx context.Context, retryCount int) error {
- times++
- if times == defaultRetryTimes {
- return nil
- }
- time.Sleep(time.Millisecond * 50)
- return errors.New("any")
- }))
- assert.Equal(t, defaultRetryTimes, times)
- })
- }
|