| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:test/test.dart'; |
| import 'package:quiver/time.dart'; |
| import 'package:quiver/testing/async.dart'; |
| import 'package:quiver/testing/time.dart'; |
| |
| import 'package:flutter_driver/src/retry.dart'; |
| |
| void main() { |
| group('retry', () { |
| FakeAsync fakeAsync; |
| |
| setUp(() { |
| fakeAsync = new FakeAsync(); |
| Clock fakeClock = fakeAsync.getClock(new DateTime.now()); |
| stopwatchFactory = () { |
| return new FakeStopwatch( |
| () => fakeClock.now().millisecondsSinceEpoch, |
| 1000 |
| ); |
| }; |
| }); |
| |
| test('retries until succeeds', () { |
| fakeAsync.run((_) { |
| int retryCount = 0; |
| |
| expect( |
| retry( |
| () async { |
| retryCount++; |
| if (retryCount < 2) { |
| throw 'error'; |
| } else { |
| return retryCount; |
| } |
| }, |
| new Duration(milliseconds: 30), |
| new Duration(milliseconds: 10) |
| ), |
| completion(2) |
| ); |
| |
| fakeAsync.elapse(new Duration(milliseconds: 50)); |
| |
| // Check that we didn't retry more times than necessary |
| expect(retryCount, 2); |
| }); |
| }); |
| |
| test('obeys predicates', () { |
| fakeAsync.run((_) { |
| int retryCount = 0; |
| |
| expect( |
| // The predicate requires that the returned value is 2, so we expect |
| // that `retry` keeps trying until the counter reaches 2. |
| retry( |
| () async => retryCount++, |
| new Duration(milliseconds: 30), |
| new Duration(milliseconds: 10), |
| predicate: (value) => value == 2 |
| ), |
| completion(2) |
| ); |
| |
| fakeAsync.elapse(new Duration(milliseconds: 50)); |
| }); |
| }); |
| |
| test('times out returning last error', () async { |
| fakeAsync.run((_) { |
| bool timedOut = false; |
| int retryCount = 0; |
| dynamic lastError; |
| dynamic lastStackTrace; |
| |
| retry( |
| () { |
| retryCount++; |
| throw 'error'; |
| }, |
| new Duration(milliseconds: 7), |
| new Duration(milliseconds: 2) |
| ).catchError((error, stackTrace) { |
| timedOut = true; |
| lastError = error; |
| lastStackTrace = stackTrace; |
| }); |
| |
| fakeAsync.elapse(new Duration(milliseconds: 10)); |
| |
| expect(timedOut, isTrue); |
| expect(lastError, 'error'); |
| expect(lastStackTrace, isNotNull); |
| expect(retryCount, 4); |
| }); |
| }); |
| }); |
| } |