@@ -48,23 +48,20 @@ public void interruptedBackoffOnlyAddsActualElapsedTimeToCumulative() {
4848 // start backoff of 2s
4949 assertThat (r1 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (2 )));
5050 // higher level failures happens only 300ms into our 2s
51- backoff .backoffInterrupted (Duration .ofMillis (300 ));
52-
53- // record higher level failure
5451 BackoffResult r2 = backoff .nextBackoff (Duration .ofMillis (300 ));
5552 // backoff 4s (previous was 2s w/ 2.0 multiplier = 4s)
5653 // even though the previous backoff duration wasn't fully consumed, still use it as the basis
5754 // for the next backoff
5855 assertThat (r2 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (4 )));
5956 // another failure 3s after the 4s backoff finished
60- BackoffResult r3 = backoff .nextBackoff (Duration .ofSeconds (3 ));
57+ BackoffResult r3 = backoff .nextBackoff (Duration .ofSeconds (7 ));
6158 assertThat (r3 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (8 )));
6259 // another failure 5s after the 8s backoff finished
63- BackoffResult r4 = backoff .nextBackoff (Duration .ofSeconds (5 ));
60+ BackoffResult r4 = backoff .nextBackoff (Duration .ofSeconds (13 ));
6461 // 11s backoff because 11s is maxBackoff
6562 assertThat (r4 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (11 )));
6663 // another failure 7s after the 11s backoff finished
67- BackoffResult r5 = backoff .nextBackoff (Duration .ofSeconds (7 ));
64+ BackoffResult r5 = backoff .nextBackoff (Duration .ofSeconds (18 ));
6865 // at this point it has been ~39s, which is more than our timeout of 34s
6966 assertThat (r5 ).isEqualTo (BackoffResults .EXHAUSTED );
7067 }
@@ -73,19 +70,32 @@ public void interruptedBackoffOnlyAddsActualElapsedTimeToCumulative() {
7370 public void simple () {
7471 Backoff backoff = defaultBackoff ();
7572
76- assertThat (backoff .nextBackoff (ZERO )).isEqualTo (BackoffDuration .of (Duration .ofSeconds (2 )));
77- assertThat (backoff .nextBackoff (ZERO )).isEqualTo (BackoffDuration .of (Duration .ofSeconds (4 )));
78- assertThat (backoff .nextBackoff (ZERO )).isEqualTo (BackoffDuration .of (Duration .ofSeconds (8 )));
79- assertThat (backoff .nextBackoff (ZERO )).isEqualTo (BackoffDuration .of (Duration .ofSeconds (16 )));
80- assertThat (backoff .nextBackoff (ZERO )).isEqualTo (BackoffDuration .of (Duration .ofSeconds (32 )));
81- assertThat (backoff .nextBackoff (ZERO )).isEqualTo (BackoffDuration .of (Duration .ofSeconds (57 )));
82- assertThat (backoff .nextBackoff (ZERO )).isEqualTo (BackoffDuration .of (Duration .ofSeconds (57 )));
83- assertThat (backoff .nextBackoff (ZERO )).isEqualTo (BackoffDuration .of (Duration .ofSeconds (57 )));
84- assertThat (backoff .nextBackoff (ZERO )).isEqualTo (BackoffDuration .of (Duration .ofSeconds (57 )));
85- assertThat (backoff .nextBackoff (ZERO )).isEqualTo (BackoffDuration .of (Duration .ofSeconds (57 )));
86- assertThat (backoff .nextBackoff (ZERO )).isEqualTo (BackoffDuration .of (Duration .ofSeconds (57 )));
87- assertThat (backoff .nextBackoff (ZERO )).isEqualTo (BackoffDuration .of (Duration .ofSeconds (57 )));
88- assertThat (backoff .nextBackoff (ZERO )).isEqualTo (BackoffResults .EXHAUSTED );
73+ final BackoffResult r01 = backoff .nextBackoff (Duration .ofSeconds (2 ));
74+ assertThat (r01 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (2 )));
75+ BackoffResult r02 = backoff .nextBackoff (((BackoffDuration ) r01 ).getDuration ());
76+ assertThat (r02 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (4 )));
77+ BackoffResult r03 = backoff .nextBackoff (((BackoffDuration ) r02 ).getDuration ());
78+ assertThat (r03 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (8 )));
79+ BackoffResult r04 = backoff .nextBackoff (((BackoffDuration ) r03 ).getDuration ());
80+ assertThat (r04 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (16 )));
81+ BackoffResult r05 = backoff .nextBackoff (((BackoffDuration ) r04 ).getDuration ());
82+ assertThat (r05 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (32 )));
83+ BackoffResult r06 = backoff .nextBackoff (((BackoffDuration ) r05 ).getDuration ());
84+ assertThat (r06 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (57 )));
85+ BackoffResult r07 = backoff .nextBackoff (((BackoffDuration ) r06 ).getDuration ());
86+ assertThat (r07 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (57 )));
87+ BackoffResult r08 = backoff .nextBackoff (((BackoffDuration ) r07 ).getDuration ());
88+ assertThat (r08 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (57 )));
89+ BackoffResult r09 = backoff .nextBackoff (((BackoffDuration ) r08 ).getDuration ());
90+ assertThat (r09 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (57 )));
91+ BackoffResult r10 = backoff .nextBackoff (((BackoffDuration ) r09 ).getDuration ());
92+ assertThat (r10 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (57 )));
93+ BackoffResult r11 = backoff .nextBackoff (((BackoffDuration ) r10 ).getDuration ());
94+ assertThat (r11 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (57 )));
95+ BackoffResult r12 = backoff .nextBackoff (((BackoffDuration ) r11 ).getDuration ());
96+ assertThat (r12 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (14 )));
97+ BackoffResult r13 = backoff .nextBackoff (((BackoffDuration ) r12 ).getDuration ());
98+ assertThat (r13 ).isEqualTo (BackoffResults .EXHAUSTED );
8999 }
90100
91101 @ Test
@@ -94,7 +104,7 @@ public void backoffDuration_min_of_backoff_maxBackoff_remainingFromTimeout() {
94104
95105 Duration elapsed = Duration .ofMinutes (6 ).plusSeconds (58 );
96106 assertThat (backoff .nextBackoff (elapsed )).isEqualTo (BackoffDuration .of (Duration .ofSeconds (2 )));
97- assertThat (backoff .nextBackoff (ZERO )).isEqualTo (BackoffResults .EXHAUSTED );
107+ assertThat (backoff .nextBackoff (Duration . ofSeconds ( 2 ) )).isEqualTo (BackoffResults .EXHAUSTED );
98108 }
99109
100110 @ Test
@@ -121,7 +131,7 @@ public void resetWorks() {
121131
122132 assertThat (backoff .nextBackoff (Duration .ofSeconds (4 )))
123133 .isEqualTo (BackoffDuration .of (Duration .ofSeconds (2 )));
124- assertThat (backoff .nextBackoff (ZERO )).isEqualTo (BackoffResults .EXHAUSTED );
134+ assertThat (backoff .nextBackoff (Duration . ofSeconds ( 2 ) )).isEqualTo (BackoffResults .EXHAUSTED );
125135 backoff .reset ();
126136 assertThat (backoff .nextBackoff (Duration .ofSeconds (10 ))).isEqualTo (BackoffResults .EXHAUSTED );
127137 }
@@ -150,7 +160,7 @@ public void onceExhaustedStaysExhaustedUntilReset() {
150160 * <p>This is primarily here to preserve behavior of {@link com.google.cloud.RetryHelper}.
151161 */
152162 @ Test
153- public void ifANextBackoffWouldExceedTheTimeoutTheBackoffDurationShouldBeTruncated () {
163+ public void ifANextBackoffWouldExceedTheTimeoutTheBackoffDurationShouldBeTruncated_single () {
154164 Backoff backoff =
155165 Backoff .newBuilder ()
156166 .setInitialBackoff (Duration .ofSeconds (2 ))
@@ -162,7 +172,37 @@ public void ifANextBackoffWouldExceedTheTimeoutTheBackoffDurationShouldBeTruncat
162172
163173 assertThat (backoff .nextBackoff (Duration .ofSeconds (22 )))
164174 .isEqualTo (BackoffDuration .of (ofSeconds (2 )));
165- assertThat (backoff .nextBackoff (ZERO )).isEqualTo (BackoffResults .EXHAUSTED );
175+ assertThat (backoff .nextBackoff (Duration .ofSeconds (2 ))).isEqualTo (BackoffResults .EXHAUSTED );
176+ }
177+
178+ /**
179+ * If a next computed backoff would exceed the timeout, truncate the backoff to the amount of time
180+ * remaining until timeout.
181+ *
182+ * <p>This is primarily here to preserve behavior of {@link com.google.cloud.RetryHelper}.
183+ */
184+ @ Test
185+ public void ifANextBackoffWouldExceedTheTimeoutTheBackoffDurationShouldBeTruncated_multiple () {
186+ Duration timeout = ofSeconds (24 );
187+ Backoff backoff =
188+ Backoff .newBuilder ()
189+ .setInitialBackoff (Duration .ofSeconds (2 ))
190+ .setMaxBackoff (Duration .ofSeconds (6 ))
191+ .setTimeout (timeout )
192+ .setJitterer (Jitterer .noJitter ())
193+ .setRetryDelayMultiplier (2.0 )
194+ .build ();
195+
196+ assertThat (backoff .getCumulativeBackoff ()).isEqualTo (Duration .ZERO );
197+ BackoffResult r1 = backoff .nextBackoff (Duration .ofSeconds (21 ));
198+ assertThat (backoff .getCumulativeBackoff ()).isEqualTo (Duration .ofSeconds (21 ));
199+ assertThat (r1 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (2 )));
200+ BackoffResult r2 = backoff .nextBackoff (((BackoffDuration ) r1 ).getDuration ());
201+ assertThat (backoff .getCumulativeBackoff ()).isEqualTo (Duration .ofSeconds (23 ));
202+ assertThat (r2 ).isEqualTo (BackoffDuration .of (Duration .ofSeconds (1 )));
203+ BackoffResult r3 = backoff .nextBackoff (((BackoffDuration ) r2 ).getDuration ());
204+ assertThat (backoff .getCumulativeBackoff ()).isEqualTo (Duration .ofSeconds (24 ));
205+ assertThat (r3 ).isEqualTo (BackoffResults .EXHAUSTED );
166206 }
167207
168208 @ Test
0 commit comments