@@ -203,3 +203,55 @@ func TestPostJSONSetsContentTypeAndHonorsContext(t *testing.T) {
203203 t .Fatal ("request context was not propagated" )
204204 }
205205}
206+
207+ func TestCalculateExponentialBackoffWithoutJitter (t * testing.T ) {
208+ client := New (WithRetryOptions (RetryOptions {
209+ BaseDelay : 100 * time .Millisecond ,
210+ MaxDelay : 700 * time .Millisecond ,
211+ }))
212+
213+ tests := []struct {
214+ attempt int
215+ want time.Duration
216+ }{
217+ {attempt : 0 , want : 100 * time .Millisecond },
218+ {attempt : 1 , want : 200 * time .Millisecond },
219+ {attempt : 2 , want : 400 * time .Millisecond },
220+ {attempt : 3 , want : 700 * time .Millisecond },
221+ }
222+
223+ for _ , tt := range tests {
224+ if got := client .calculateExponentialBackoff (tt .attempt , false ); got != tt .want {
225+ t .Fatalf ("attempt %d: backoff = %v, want %v" , tt .attempt , got , tt .want )
226+ }
227+ }
228+ }
229+
230+ func TestCalculateExponentialBackoffWithJitterUsesRandomFactor (t * testing.T ) {
231+ client := New (WithRetryOptions (RetryOptions {
232+ BaseDelay : 200 * time .Millisecond ,
233+ MaxDelay : time .Second ,
234+ Jitter : true ,
235+ }))
236+ client .randomFloat64 = func () float64 { return 0.25 }
237+
238+ got := client .calculateExponentialBackoff (1 , true )
239+ want := 300 * time .Millisecond
240+ if got != want {
241+ t .Fatalf ("backoff with jitter = %v, want %v" , got , want )
242+ }
243+ }
244+
245+ func TestCalculateExponentialBackoffWithJitterStillHonorsMaxDelay (t * testing.T ) {
246+ client := New (WithRetryOptions (RetryOptions {
247+ BaseDelay : 500 * time .Millisecond ,
248+ MaxDelay : 800 * time .Millisecond ,
249+ Jitter : true ,
250+ }))
251+ client .randomFloat64 = func () float64 { return 0.99 }
252+
253+ got := client .calculateExponentialBackoff (3 , true )
254+ if got != 800 * time .Millisecond {
255+ t .Fatalf ("backoff with jitter cap = %v, want %v" , got , 800 * time .Millisecond )
256+ }
257+ }
0 commit comments