19
19
import static java .lang .Long .MAX_VALUE ;
20
20
import static java .util .concurrent .CompletableFuture .completedFuture ;
21
21
import static java .util .concurrent .CompletableFuture .failedFuture ;
22
+ import static java .util .concurrent .TimeUnit .SECONDS ;
22
23
import static org .hamcrest .MatcherAssert .assertThat ;
23
24
import static org .hamcrest .Matchers .allOf ;
24
25
import static org .hamcrest .Matchers .closeTo ;
@@ -97,29 +98,40 @@ void throwsForIllegalInitialRetryDelay() {
97
98
@ Test
98
99
void throwsForIllegalMultiplier () {
99
100
var error = assertThrows (
100
- IllegalArgumentException .class , () -> newRetryLogic (1 , 1 , 0.42 , 1 , Clock .systemUTC (), (ignored ) -> {}));
101
+ IllegalArgumentException .class , () -> newRetryLogic (1 , 1 , 1.99 , 1 , Clock .systemUTC (), (ignored ) -> {}));
101
102
assertThat (error .getMessage (), containsString ("Multiplier" ));
102
103
}
103
104
104
105
@ Test
105
106
void throwsForIllegalJitterFactor () {
106
107
var error1 = assertThrows (
107
108
IllegalArgumentException .class ,
108
- () -> newRetryLogic (1 , 1 , 1 , -0.42 , Clock .systemUTC (), (ignored ) -> {}));
109
+ () -> newRetryLogic (1 , 1 , 2 , -0.42 , Clock .systemUTC (), (ignored ) -> {}));
109
110
assertThat (error1 .getMessage (), containsString ("Jitter" ));
110
111
111
112
var error2 = assertThrows (
112
- IllegalArgumentException .class , () -> newRetryLogic (1 , 1 , 1 , 1.42 , Clock .systemUTC (), (ignored ) -> {}));
113
+ IllegalArgumentException .class , () -> newRetryLogic (1 , 1 , 2 , 1.42 , Clock .systemUTC (), (ignored ) -> {}));
113
114
assertThat (error2 .getMessage (), containsString ("Jitter" ));
114
115
}
115
116
116
117
@ Test
117
118
void throwsForIllegalClock () {
118
119
var error =
119
- assertThrows (IllegalArgumentException .class , () -> newRetryLogic (1 , 1 , 1 , 1 , null , (ignored ) -> {}));
120
+ assertThrows (IllegalArgumentException .class , () -> newRetryLogic (1 , 1 , 2 , 1 , null , (ignored ) -> {}));
120
121
assertThat (error .getMessage (), containsString ("Clock" ));
121
122
}
122
123
124
+ @ Test
125
+ void shouldInitialiseWithExpectedDefaultValues () {
126
+ var clock = mock (Clock .class );
127
+ var sleepTask = mock (ExponentialBackoffRetryLogic .SleepTask .class );
128
+ var logic = new ExponentialBackoffRetryLogic (MAX_VALUE , eventExecutor , clock , DEV_NULL_LOGGING , sleepTask );
129
+
130
+ assertEquals (SECONDS .toMillis (1 ), logic .initialRetryDelayMs );
131
+ assertEquals (2.0 , logic .multiplier );
132
+ assertEquals (0.2 , logic .jitterFactor );
133
+ }
134
+
123
135
@ Test
124
136
void nextDelayCalculatedAccordingToMultiplier () throws Exception {
125
137
var retries = 27 ;
@@ -318,7 +330,7 @@ void doesNotRetryWhenMaxRetryTimeExceededRx() {
318
330
void sleepsOnServiceUnavailableException () throws Exception {
319
331
var clock = mock (Clock .class );
320
332
var sleepTask = mock (ExponentialBackoffRetryLogic .SleepTask .class );
321
- var logic = newRetryLogic (1 , 42 , 1 , 0 , clock , sleepTask );
333
+ var logic = newRetryLogic (1 , 42 , 2 , 0 , clock , sleepTask );
322
334
323
335
Supplier <Void > workMock = newWorkMock ();
324
336
var error = serviceUnavailable ();
@@ -335,7 +347,7 @@ void schedulesRetryOnServiceUnavailableExceptionAsync() {
335
347
var result = "The Result" ;
336
348
var clock = mock (Clock .class );
337
349
338
- var retryLogic = newRetryLogic (1 , 42 , 1 , 0 , clock , (ignored ) -> {});
350
+ var retryLogic = newRetryLogic (1 , 42 , 2 , 0 , clock , (ignored ) -> {});
339
351
340
352
Supplier <CompletionStage <Object >> workMock = newWorkMock ();
341
353
var error = serviceUnavailable ();
@@ -353,7 +365,7 @@ void schedulesRetryOnServiceUnavailableExceptionAsync() {
353
365
void sleepsOnSessionExpiredException () throws Exception {
354
366
var clock = mock (Clock .class );
355
367
var sleepTask = mock (ExponentialBackoffRetryLogic .SleepTask .class );
356
- var logic = newRetryLogic (1 , 4242 , 1 , 0 , clock , sleepTask );
368
+ var logic = newRetryLogic (1 , 4242 , 2 , 0 , clock , sleepTask );
357
369
358
370
Supplier <Void > workMock = newWorkMock ();
359
371
var error = sessionExpired ();
@@ -370,7 +382,7 @@ void schedulesRetryOnSessionExpiredExceptionAsync() {
370
382
var result = "The Result" ;
371
383
var clock = mock (Clock .class );
372
384
373
- var retryLogic = newRetryLogic (1 , 4242 , 1 , 0 , clock , (ignored ) -> {});
385
+ var retryLogic = newRetryLogic (1 , 4242 , 2 , 0 , clock , (ignored ) -> {});
374
386
375
387
Supplier <CompletionStage <Object >> workMock = newWorkMock ();
376
388
var error = sessionExpired ();
@@ -388,7 +400,7 @@ void schedulesRetryOnSessionExpiredExceptionAsync() {
388
400
void sleepsOnTransientException () throws Exception {
389
401
var clock = mock (Clock .class );
390
402
var sleepTask = mock (ExponentialBackoffRetryLogic .SleepTask .class );
391
- var logic = newRetryLogic (1 , 23 , 1 , 0 , clock , sleepTask );
403
+ var logic = newRetryLogic (1 , 23 , 2 , 0 , clock , sleepTask );
392
404
393
405
Supplier <Void > workMock = newWorkMock ();
394
406
var error = transientException ();
@@ -405,7 +417,7 @@ void schedulesRetryOnTransientExceptionAsync() {
405
417
var result = "The Result" ;
406
418
var clock = mock (Clock .class );
407
419
408
- var retryLogic = newRetryLogic (1 , 23 , 1 , 0 , clock , (ignored ) -> {});
420
+ var retryLogic = newRetryLogic (1 , 23 , 2 , 0 , clock , (ignored ) -> {});
409
421
410
422
Supplier <CompletionStage <Object >> workMock = newWorkMock ();
411
423
var error = transientException ();
@@ -423,7 +435,7 @@ void schedulesRetryOnTransientExceptionAsync() {
423
435
void throwsWhenUnknownError () throws Exception {
424
436
var clock = mock (Clock .class );
425
437
var sleepTask = mock (ExponentialBackoffRetryLogic .SleepTask .class );
426
- var logic = newRetryLogic (1 , 1 , 1 , 1 , clock , sleepTask );
438
+ var logic = newRetryLogic (1 , 1 , 2 , 1 , clock , sleepTask );
427
439
428
440
Supplier <Void > workMock = newWorkMock ();
429
441
var error = new IllegalStateException ();
@@ -439,7 +451,7 @@ void throwsWhenUnknownError() throws Exception {
439
451
@ Test
440
452
void doesNotRetryOnUnknownErrorAsync () {
441
453
var clock = mock (Clock .class );
442
- var retryLogic = newRetryLogic (1 , 1 , 1 , 1 , clock , (ignored ) -> {});
454
+ var retryLogic = newRetryLogic (1 , 1 , 2 , 1 , clock , (ignored ) -> {});
443
455
444
456
Supplier <CompletionStage <Object >> workMock = newWorkMock ();
445
457
var error = new IllegalStateException ();
@@ -456,7 +468,7 @@ void doesNotRetryOnUnknownErrorAsync() {
456
468
void throwsWhenTransactionTerminatedError () throws Exception {
457
469
var clock = mock (Clock .class );
458
470
var sleepTask = mock (ExponentialBackoffRetryLogic .SleepTask .class );
459
- var logic = newRetryLogic (1 , 13 , 1 , 0 , clock , sleepTask );
471
+ var logic = newRetryLogic (1 , 13 , 2 , 0 , clock , sleepTask );
460
472
461
473
Supplier <Void > workMock = newWorkMock ();
462
474
var error = new ClientException ("Neo.ClientError.Transaction.Terminated" , "" );
@@ -472,7 +484,7 @@ void throwsWhenTransactionTerminatedError() throws Exception {
472
484
@ Test
473
485
void doesNotRetryOnTransactionTerminatedErrorAsync () {
474
486
var clock = mock (Clock .class );
475
- var retryLogic = newRetryLogic (1 , 13 , 1 , 0 , clock , (ignored ) -> {});
487
+ var retryLogic = newRetryLogic (1 , 13 , 2 , 0 , clock , (ignored ) -> {});
476
488
477
489
Supplier <CompletionStage <Object >> workMock = newWorkMock ();
478
490
var error = new ClientException ("Neo.ClientError.Transaction.Terminated" , "" );
@@ -489,7 +501,7 @@ void doesNotRetryOnTransactionTerminatedErrorAsync() {
489
501
void throwsWhenTransactionLockClientStoppedError () throws Exception {
490
502
var clock = mock (Clock .class );
491
503
var sleepTask = mock (ExponentialBackoffRetryLogic .SleepTask .class );
492
- var logic = newRetryLogic (1 , 13 , 1 , 0 , clock , sleepTask );
504
+ var logic = newRetryLogic (1 , 13 , 2 , 0 , clock , sleepTask );
493
505
494
506
Supplier <Void > workMock = newWorkMock ();
495
507
var error = new ClientException ("Neo.ClientError.Transaction.LockClientStopped" , "" );
@@ -505,7 +517,7 @@ void throwsWhenTransactionLockClientStoppedError() throws Exception {
505
517
@ Test
506
518
void doesNotRetryOnTransactionLockClientStoppedErrorAsync () {
507
519
var clock = mock (Clock .class );
508
- var retryLogic = newRetryLogic (1 , 15 , 1 , 0 , clock , (ignored ) -> {});
520
+ var retryLogic = newRetryLogic (1 , 15 , 2 , 0 , clock , (ignored ) -> {});
509
521
510
522
Supplier <CompletionStage <Object >> workMock = newWorkMock ();
511
523
var error = new ClientException ("Neo.ClientError.Transaction.LockClientStopped" , "" );
@@ -523,7 +535,7 @@ void doesNotRetryOnTransactionLockClientStoppedErrorAsync() {
523
535
void schedulesRetryOnErrorRx (Exception error ) {
524
536
var result = "The Result" ;
525
537
var clock = mock (Clock .class );
526
- var retryLogic = newRetryLogic (1 , 4242 , 1 , 0 , clock , (ignored ) -> {});
538
+ var retryLogic = newRetryLogic (1 , 4242 , 2 , 0 , clock , (ignored ) -> {});
527
539
528
540
Publisher <String > publisher = createMono (result , error );
529
541
var single = Flux .from (retryLogic .retryRx (publisher )).single ();
@@ -539,7 +551,7 @@ void schedulesRetryOnErrorRx(Exception error) {
539
551
@ MethodSource ("cannotBeRetriedErrors" )
540
552
void scheduleNoRetryOnErrorRx (Exception error ) {
541
553
var clock = mock (Clock .class );
542
- var retryLogic = newRetryLogic (1 , 10 , 1 , 1 , clock , (ignored ) -> {});
554
+ var retryLogic = newRetryLogic (1 , 10 , 2 , 1 , clock , (ignored ) -> {});
543
555
544
556
var single = Flux .from (retryLogic .retryRx (Mono .error (error ))).single ();
545
557
@@ -555,7 +567,7 @@ void throwsWhenSleepInterrupted() throws Exception {
555
567
var clock = mock (Clock .class );
556
568
var sleepTask = mock (ExponentialBackoffRetryLogic .SleepTask .class );
557
569
doThrow (new InterruptedException ()).when (sleepTask ).sleep (1 );
558
- var logic = newRetryLogic (1 , 1 , 1 , 0 , clock , sleepTask );
570
+ var logic = newRetryLogic (1 , 1 , 2 , 0 , clock , sleepTask );
559
571
560
572
Supplier <Void > workMock = newWorkMock ();
561
573
when (workMock .get ()).thenThrow (serviceUnavailable ());
0 commit comments