bitbucket.org/ai69/amoy@v0.2.3/retry_test.go (about)

     1  package amoy
     2  
     3  import (
     4  	"errors"
     5  	"testing"
     6  	"time"
     7  )
     8  
     9  type mockFuncWrapper struct {
    10  	cnt int
    11  	num int
    12  	err error
    13  }
    14  
    15  func newMockFuncWrapper(num int, err error) *mockFuncWrapper {
    16  	return &mockFuncWrapper{
    17  		cnt: 0,
    18  		num: num,
    19  		err: err,
    20  	}
    21  }
    22  
    23  func (m *mockFuncWrapper) GetFunc() func() error {
    24  	return func() error {
    25  		m.cnt++
    26  		if m.num == m.cnt {
    27  			return nil
    28  		}
    29  		return m.err
    30  	}
    31  }
    32  
    33  func (m *mockFuncWrapper) Count() int {
    34  	return m.cnt
    35  }
    36  
    37  func TestBackOffRetry(t *testing.T) {
    38  	myError := errors.New("one error")
    39  	tests := []struct {
    40  		name      string
    41  		workWrap  *mockFuncWrapper
    42  		times     uint
    43  		delay     time.Duration
    44  		wantTimes int
    45  		wantErr   bool
    46  	}{
    47  		{"One success", newMockFuncWrapper(1, myError), 3, 10 * time.Millisecond, 1, false},
    48  		{"Two success", newMockFuncWrapper(2, myError), 3, 10 * time.Millisecond, 2, false},
    49  		{"Three success", newMockFuncWrapper(3, myError), 3, 10 * time.Millisecond, 3, false},
    50  		{"Not success", newMockFuncWrapper(4, myError), 3, 10 * time.Millisecond, 3, true},
    51  		{"Never success", newMockFuncWrapper(0, myError), 3, 10 * time.Millisecond, 3, true},
    52  	}
    53  	for _, tt := range tests {
    54  		t.Run(tt.name, func(t *testing.T) {
    55  			if err := BackOffRetry(tt.workWrap.GetFunc(), tt.times, tt.delay); (err != nil) != tt.wantErr {
    56  				t.Errorf("BackOffRetry() error = %v, wantErr %v", err, tt.wantErr)
    57  			}
    58  			if tt.workWrap.Count() != tt.wantTimes {
    59  				t.Errorf("BackOffRetry() run times = %v, wantTimes %v", tt.workWrap.Count(), tt.wantTimes)
    60  			}
    61  		})
    62  	}
    63  }
    64  
    65  func TestBackOffRetryIf(t *testing.T) {
    66  	myError := errors.New("one error")
    67  	tests := []struct {
    68  		name      string
    69  		workWrap  *mockFuncWrapper
    70  		retryIf   RetryIfFunc
    71  		times     uint
    72  		delay     time.Duration
    73  		wantTimes int
    74  		wantErr   bool
    75  	}{
    76  		{"One success", newMockFuncWrapper(1, myError), alwaysTrueFunc, 3, 10 * time.Millisecond, 1, false},
    77  		{"Two success", newMockFuncWrapper(2, myError), alwaysTrueFunc, 3, 10 * time.Millisecond, 2, false},
    78  		{"Three success", newMockFuncWrapper(3, myError), alwaysTrueFunc, 3, 10 * time.Millisecond, 3, false},
    79  		{"Not success", newMockFuncWrapper(4, myError), alwaysTrueFunc, 3, 10 * time.Millisecond, 3, true},
    80  		{"Never success", newMockFuncWrapper(0, myError), alwaysTrueFunc, 3, 10 * time.Millisecond, 3, true},
    81  		{"Just quit", newMockFuncWrapper(3, myError), alwaysFalseFunc, 1, 10 * time.Millisecond, 1, true},
    82  	}
    83  	for _, tt := range tests {
    84  		t.Run(tt.name, func(t *testing.T) {
    85  			if err := BackOffRetryIf(tt.workWrap.GetFunc(), tt.retryIf, tt.times, tt.delay); (err != nil) != tt.wantErr {
    86  				t.Errorf("BackOffRetryIf() error = %v, wantErr %v", err, tt.wantErr)
    87  			}
    88  			if tt.workWrap.Count() != tt.wantTimes {
    89  				t.Errorf("BackOffRetryIf() run times = %v, wantTimes %v", tt.workWrap.Count(), tt.wantTimes)
    90  			}
    91  		})
    92  	}
    93  }
    94  
    95  func TestFixedRetry(t *testing.T) {
    96  	myError := errors.New("one error")
    97  	tests := []struct {
    98  		name      string
    99  		workWrap  *mockFuncWrapper
   100  		times     uint
   101  		delay     time.Duration
   102  		wantTimes int
   103  		wantErr   bool
   104  	}{
   105  		{"One success", newMockFuncWrapper(1, myError), 3, 10 * time.Millisecond, 1, false},
   106  		{"Two success", newMockFuncWrapper(2, myError), 3, 10 * time.Millisecond, 2, false},
   107  		{"Three success", newMockFuncWrapper(3, myError), 3, 10 * time.Millisecond, 3, false},
   108  		{"Not success", newMockFuncWrapper(4, myError), 3, 10 * time.Millisecond, 3, true},
   109  		{"Never success", newMockFuncWrapper(0, myError), 3, 10 * time.Millisecond, 3, true},
   110  	}
   111  	for _, tt := range tests {
   112  		t.Run(tt.name, func(t *testing.T) {
   113  			if err := FixedRetry(tt.workWrap.GetFunc(), tt.times, tt.delay); (err != nil) != tt.wantErr {
   114  				t.Errorf("FixedRetry() error = %v, wantErr %v", err, tt.wantErr)
   115  			}
   116  			if tt.workWrap.Count() != tt.wantTimes {
   117  				t.Errorf("FixedRetry() run times = %v, wantTimes %v", tt.workWrap.Count(), tt.wantTimes)
   118  			}
   119  		})
   120  	}
   121  }
   122  
   123  func TestFixedRetryIf(t *testing.T) {
   124  	myError := errors.New("one error")
   125  	tests := []struct {
   126  		name      string
   127  		workWrap  *mockFuncWrapper
   128  		retryIf   RetryIfFunc
   129  		times     uint
   130  		delay     time.Duration
   131  		wantTimes int
   132  		wantErr   bool
   133  	}{
   134  		{"One success", newMockFuncWrapper(1, myError), alwaysTrueFunc, 3, 10 * time.Millisecond, 1, false},
   135  		{"Two success", newMockFuncWrapper(2, myError), alwaysTrueFunc, 3, 10 * time.Millisecond, 2, false},
   136  		{"Three success", newMockFuncWrapper(3, myError), alwaysTrueFunc, 3, 10 * time.Millisecond, 3, false},
   137  		{"Not success", newMockFuncWrapper(4, myError), alwaysTrueFunc, 3, 10 * time.Millisecond, 3, true},
   138  		{"Never success", newMockFuncWrapper(0, myError), alwaysTrueFunc, 3, 10 * time.Millisecond, 3, true},
   139  		{"Just quit", newMockFuncWrapper(3, myError), alwaysFalseFunc, 1, 10 * time.Millisecond, 1, true},
   140  	}
   141  	for _, tt := range tests {
   142  		t.Run(tt.name, func(t *testing.T) {
   143  			if err := FixedRetryIf(tt.workWrap.GetFunc(), tt.retryIf, tt.times, tt.delay); (err != nil) != tt.wantErr {
   144  				t.Errorf("FixedRetryIf() error = %v, wantErr %v", err, tt.wantErr)
   145  			}
   146  			if tt.workWrap.Count() != tt.wantTimes {
   147  				t.Errorf("FixedRetryIf() run times = %v, wantTimes %v", tt.workWrap.Count(), tt.wantTimes)
   148  			}
   149  		})
   150  	}
   151  }
   152  
   153  func TestSimpleRetry(t *testing.T) {
   154  	myError := errors.New("one error")
   155  	tests := []struct {
   156  		name      string
   157  		workWrap  *mockFuncWrapper
   158  		wantTimes int
   159  		wantErr   bool
   160  	}{
   161  		{"One success", newMockFuncWrapper(1, myError), 1, false},
   162  		{"Two success", newMockFuncWrapper(2, myError), 2, false},
   163  		{"Three success", newMockFuncWrapper(3, myError), 3, false},
   164  		{"Not success", newMockFuncWrapper(4, myError), 3, true},
   165  		{"Never success", newMockFuncWrapper(0, myError), 3, true},
   166  	}
   167  	for _, tt := range tests {
   168  		t.Run(tt.name, func(t *testing.T) {
   169  			if err := SimpleRetry(tt.workWrap.GetFunc()); (err != nil) != tt.wantErr {
   170  				t.Errorf("SimpleRetry() error = %v, wantErr %v", err, tt.wantErr)
   171  			}
   172  			if tt.workWrap.Count() != tt.wantTimes {
   173  				t.Errorf("SimpleRetry() run times = %v, wantTimes %v", tt.workWrap.Count(), tt.wantTimes)
   174  			}
   175  		})
   176  	}
   177  }