| // Copyright 2024 The Flutter Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd. | |
| import 'package:devtools_shared/devtools_shared.dart'; | |
| import 'package:test/test.dart'; | |
| void main() { | |
| late int counter; | |
| setUp(() { | |
| counter = 0; | |
| }); | |
| void callback({required int succeedOnAttempt}) { | |
| counter++; | |
| if (counter < succeedOnAttempt) { | |
| throw Exception(); | |
| } | |
| } | |
| group('runWithRetry', () { | |
| test('succeeds after a single attempt', () async { | |
| expect(counter, 0); | |
| await runWithRetry( | |
| callback: () => callback(succeedOnAttempt: 1), | |
| maxRetries: 10, | |
| ); | |
| expect(counter, 1); | |
| }); | |
| test('succeeds after multiple attempts', () async { | |
| expect(counter, 0); | |
| await runWithRetry( | |
| callback: () => callback(succeedOnAttempt: 5), | |
| maxRetries: 10, | |
| ); | |
| expect(counter, 5); | |
| }); | |
| test('calls onRetry callback for each retry attempt', () async { | |
| var str = ''; | |
| expect(counter, 0); | |
| await runWithRetry( | |
| callback: () => callback(succeedOnAttempt: 5), | |
| maxRetries: 10, | |
| onRetry: (attempt) => str = '$str$attempt', | |
| ); | |
| expect(counter, 5); | |
| expect(str, '1234'); | |
| }); | |
| test('throws after max retries reached', () async { | |
| expect(counter, 0); | |
| await expectLater(() async { | |
| await runWithRetry( | |
| callback: () => callback(succeedOnAttempt: 11), | |
| maxRetries: 10, | |
| ); | |
| }, throwsException); | |
| expect(counter, 10); | |
| }); | |
| test('stops early without exception if stopCondition is met', () async { | |
| expect(counter, 0); | |
| await runWithRetry( | |
| callback: () => callback(succeedOnAttempt: 5), | |
| maxRetries: 10, | |
| stopCondition: () => counter > 3, | |
| ); | |
| expect(counter, 4); | |
| }); | |
| }); | |
| } |