@@ -430,6 +430,7 @@ void main() {
430
430
431
431
void checkRetry (String description, void Function () prepareError, {
432
432
String ? errorMessage,
433
+ int failureCountNofityThreshold = 0 ,
433
434
}) {
434
435
test (description, () {
435
436
awaitFakeAsync ((async ) async {
@@ -438,18 +439,24 @@ void main() {
438
439
updateMachine.poll ();
439
440
check (async .pendingTimers).length.equals (0 );
440
441
441
- // Make the request, inducing an error in it.
442
- prepareError ();
443
- updateMachine.debugAdvanceLoop ();
444
- check (debugLastReportedError).isNull ();
445
- async .elapse (Duration .zero);
446
- if (errorMessage == null ) {
447
- check (takeLastReportedError ()).isNull ();
448
- } else {
449
- check (takeLastReportedError ()).isNotNull ().contains (errorMessage);
442
+ for (int i = 0 ; i < failureCountNofityThreshold + 1 ; i++ ) {
443
+ // Make the request, inducing an error in it.
444
+ prepareError ();
445
+ if (i > 0 ) {
446
+ // End polling backoff from the previous iteration.
447
+ async .flushTimers ();
448
+ }
449
+ updateMachine.debugAdvanceLoop ();
450
+ check (debugLastReportedError).isNull ();
451
+ async .elapse (Duration .zero);
452
+ if (i < failureCountNofityThreshold || errorMessage == null ) {
453
+ check (takeLastReportedError ()).isNull ();
454
+ } else {
455
+ check (takeLastReportedError ()).isNotNull ().contains (errorMessage);
456
+ }
457
+ checkLastRequest (lastEventId: 1 );
458
+ check (store).isLoading.isTrue ();
450
459
}
451
- checkLastRequest (lastEventId: 1 );
452
- check (store).isLoading.isTrue ();
453
460
454
461
// Polling doesn't resume immediately; there's a timer.
455
462
check (async .pendingTimers).length.equals (1 );
@@ -471,11 +478,15 @@ void main() {
471
478
}
472
479
473
480
group ('retries' , () {
474
- checkRetry ('retries on Server5xxException' ,
475
- () => connection.prepare (httpStatus: 500 , body: 'splat' ));
476
-
477
- checkRetry ('retries on NetworkException' ,
478
- () => connection.prepare (exception: Exception ("failed" )));
481
+ checkRetry ('too many retries on Server5xxException' ,
482
+ () => connection.prepare (httpStatus: 500 , body: 'splat' ),
483
+ errorMessage: 'Failed to reach server. Will retry' ,
484
+ failureCountNofityThreshold: 5 );
485
+
486
+ checkRetry ('too many retries on NetworkException' ,
487
+ () => connection.prepare (exception: Exception ("failed" )),
488
+ errorMessage: 'Failed to reach server. Will retry' ,
489
+ failureCountNofityThreshold: 5 );
479
490
480
491
checkRetry ('retries on ZulipApiException' ,
481
492
() => connection.prepare (httpStatus: 400 , json: {
0 commit comments