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 }