Index: pkg/scheduled_test/test/scheduled_test_test.dart |
diff --git a/pkg/scheduled_test/test/scheduled_test_test.dart b/pkg/scheduled_test/test/scheduled_test_test.dart |
deleted file mode 100644 |
index 914332f50fb9f5440bd0f65aa8d4163dcf156278..0000000000000000000000000000000000000000 |
--- a/pkg/scheduled_test/test/scheduled_test_test.dart |
+++ /dev/null |
@@ -1,1450 +0,0 @@ |
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-library scheduled_test_test; |
- |
-import 'dart:async'; |
-import 'dart:io'; |
- |
-import 'package:scheduled_test/scheduled_test.dart'; |
-import 'package:scheduled_test/src/mock_clock.dart' as mock_clock; |
- |
-import 'metatest.dart'; |
-import 'utils.dart'; |
- |
-void main() { |
- metaSetUp(() { |
- // TODO(nweiz): We used to only increase the timeout to 10s for the Windows |
- // bots, but the Linux and Mac bots have started taking upwards of 5s when |
- // running pumpEventQueue, so we're increasing the timeout across the board |
- // (see issue 9248). |
- currentSchedule.timeout = new Duration(seconds: 10); |
- }); |
- |
- expectTestsPass('a scheduled test with a correct synchronous expectation ' |
- 'should pass', () { |
- test('test', () { |
- expect('foo', equals('foo')); |
- }); |
- }); |
- |
- expectTestsFail('a scheduled test with an incorrect synchronous expectation ' |
- 'should fail', () { |
- test('test', () { |
- expect('foo', equals('bar')); |
- }); |
- }); |
- |
- expectTestsPass('a scheduled test with a correct asynchronous expectation ' |
- 'should pass', () { |
- test('test', () { |
- expect(new Future.immediate('foo'), completion(equals('foo'))); |
- }); |
- }); |
- |
- expectTestsFail('a scheduled test with an incorrect asynchronous expectation ' |
- 'should fail', () { |
- test('test', () { |
- expect(new Future.immediate('foo'), completion(equals('bar'))); |
- }); |
- }); |
- |
- expectTestsPass('a passing scheduled synchronous expect should register', () { |
- test('test', () { |
- schedule(() => expect('foo', equals('foo'))); |
- }); |
- }); |
- |
- expectTestsFail('a failing scheduled synchronous expect should register', () { |
- test('test', () { |
- schedule(() => expect('foo', equals('bar'))); |
- }); |
- }); |
- |
- expectTestsPass('a passing scheduled asynchronous expect should ' |
- 'register', () { |
- test('test', () { |
- schedule(() => |
- expect(new Future.immediate('foo'), completion(equals('foo')))); |
- }); |
- }); |
- |
- expectTestsFail('a failing scheduled synchronous expect should ' |
- 'register', () { |
- test('test', () { |
- schedule(() => |
- expect(new Future.immediate('foo'), completion(equals('bar')))); |
- }); |
- }); |
- |
- expectTestsPass('scheduled blocks should be run in order after the ' |
- 'synchronous setup', () { |
- test('test', () { |
- var list = [1]; |
- schedule(() => list.add(2)); |
- list.add(3); |
- schedule(() => expect(list, equals([1, 3, 4, 2]))); |
- list.add(4); |
- }); |
- }); |
- |
- expectTestsPass('scheduled blocks should forward their return values as ' |
- 'Futures', () { |
- test('synchronous value', () { |
- var future = schedule(() => 'value'); |
- expect(future, completion(equals('value'))); |
- }); |
- |
- test('asynchronous value', () { |
- var future = schedule(() => new Future.immediate('value')); |
- expect(future, completion(equals('value'))); |
- }); |
- }); |
- |
- expectTestsPass('scheduled blocks should wait for their Future return values ' |
- 'to complete before proceeding', () { |
- test('test', () { |
- var value = 'unset'; |
- schedule(() => pumpEventQueue().then((_) { |
- value = 'set'; |
- })); |
- schedule(() => expect(value, equals('set'))); |
- }); |
- }); |
- |
- expectTestsFail('a test failure in a chained future in a scheduled block ' |
- 'should be registered', () { |
- test('test', () { |
- schedule(() => new Future.immediate('foo') |
- .then((v) => expect(v, equals('bar')))); |
- }); |
- }); |
- |
- expectTestsFail('an error in a chained future in a scheduled block should be ' |
- 'registered', () { |
- test('test', () { |
- schedule(() => new Future.immediate(null).then((_) { |
- throw 'error'; |
- })); |
- }); |
- }); |
- |
- expectTestsFail('an out-of-band failure in wrapAsync is handled', () { |
- mock_clock.mock().run(); |
- test('test', () { |
- schedule(() { |
- sleep(1).then(wrapAsync((_) => expect('foo', equals('bar')))); |
- }); |
- schedule(() => sleep(2)); |
- }); |
- }); |
- |
- expectTestsFail('an out-of-band failure in wrapAsync that finishes after the ' |
- 'schedule is handled', () { |
- mock_clock.mock().run(); |
- test('test', () { |
- schedule(() { |
- sleep(2).then(wrapAsync((_) => expect('foo', equals('bar')))); |
- }); |
- schedule(() => sleep(1)); |
- }); |
- }); |
- |
- expectTestsFail('an out-of-band failure in wrapFuture is handled', () { |
- mock_clock.mock().run(); |
- test('test', () { |
- schedule(() { |
- wrapFuture(sleep(1).then((_) => expect('foo', equals('bar')))); |
- }); |
- schedule(() => sleep(2)); |
- }); |
- }); |
- |
- expectTestsFail('an out-of-band failure in wrapFuture that finishes after ' |
- 'the schedule is handled', () { |
- mock_clock.mock().run(); |
- test('test', () { |
- schedule(() { |
- wrapFuture(sleep(2).then((_) => expect('foo', equals('bar')))); |
- }); |
- schedule(() => sleep(1)); |
- }); |
- }); |
- |
- expectTestsPass("wrapFuture should return the value of the wrapped future", |
- () { |
- test('test', () { |
- schedule(() { |
- expect(wrapFuture(pumpEventQueue().then((_) => 'foo')), |
- completion(equals('foo'))); |
- }); |
- }); |
- }); |
- |
- expectTestsPass("wrapFuture should pass through the error of the wrapped " |
- "future", () { |
- var error; |
- test('test 1', () { |
- schedule(() { |
- wrapFuture(pumpEventQueue().then((_) { |
- throw 'error'; |
- })).catchError(wrapAsync((e) { |
- error = e.error; |
- })); |
- }); |
- }); |
- |
- test('test 2', () { |
- expect(error, equals('error')); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass("scheduled blocks whose return values are passed to " |
- "wrapFuture should report exceptions once", () { |
- var errors; |
- test('test 1', () { |
- currentSchedule.onException.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- wrapFuture(schedule(() { |
- throw 'error'; |
- })); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals(['error'])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsFail('an out-of-band error reported via signalError is ' |
- 'handled', () { |
- mock_clock.mock().run(); |
- test('test', () { |
- schedule(() { |
- sleep(1).then((_) => currentSchedule.signalError('bad')); |
- }); |
- schedule(() => sleep(2)); |
- }); |
- }); |
- |
- expectTestsFail('an out-of-band error reported via signalError that finished ' |
- 'after the schedule is handled', () { |
- mock_clock.mock().run(); |
- test('test', () { |
- schedule(() { |
- var done = wrapAsync((_) {}); |
- sleep(2).then((_) { |
- currentSchedule.signalError('bad'); |
- done(null); |
- }); |
- }); |
- schedule(() => sleep(1)); |
- }); |
- }); |
- |
- expectTestsFail('a synchronous error reported via signalError is handled', () { |
- test('test', () { |
- currentSchedule.signalError('bad'); |
- }); |
- }); |
- |
- expectTestsPass('the onComplete queue is run if a test is successful', () { |
- var onCompleteRun = false; |
- test('test 1', () { |
- currentSchedule.onComplete.schedule(() { |
- onCompleteRun = true; |
- }); |
- |
- schedule(() => expect('foo', equals('foo'))); |
- }); |
- |
- test('test 2', () { |
- expect(onCompleteRun, isTrue); |
- }); |
- }); |
- |
- expectTestsPass('the onComplete queue is run after an out-of-band callback', |
- () { |
- var outOfBandRun = false; |
- test('test1', () { |
- currentSchedule.onComplete.schedule(() { |
- expect(outOfBandRun, isTrue); |
- }); |
- |
- pumpEventQueue().then(wrapAsync((_) { |
- outOfBandRun = true; |
- })); |
- }); |
- }); |
- |
- expectTestsPass('the onComplete queue is run after an out-of-band callback ' |
- 'and waits for another out-of-band callback', () { |
- var outOfBand1Run = false; |
- var outOfBand2Run = false; |
- test('test1', () { |
- currentSchedule.onComplete.schedule(() { |
- expect(outOfBand1Run, isTrue); |
- |
- pumpEventQueue().then(wrapAsync((_) { |
- outOfBand2Run = true; |
- })); |
- }); |
- |
- pumpEventQueue().then(wrapAsync((_) { |
- outOfBand1Run = true; |
- })); |
- }); |
- |
- test('test2', () => expect(outOfBand2Run, isTrue)); |
- }); |
- |
- expectTestsFail('an out-of-band callback in the onComplete queue blocks the ' |
- 'test', () { |
- test('test', () { |
- currentSchedule.onComplete.schedule(() { |
- pumpEventQueue().then(wrapAsync((_) => expect('foo', equals('bar')))); |
- }); |
- }); |
- }); |
- |
- expectTestsPass('an out-of-band callback blocks onComplete even with an ' |
- 'unrelated error', () { |
- var outOfBandRun = false; |
- var outOfBandSetInOnComplete = false; |
- test('test 1', () { |
- currentSchedule.onComplete.schedule(() { |
- outOfBandSetInOnComplete = outOfBandRun; |
- }); |
- |
- pumpEventQueue().then(wrapAsync((_) { |
- outOfBandRun = true; |
- })); |
- |
- schedule(() => expect('foo', equals('bar'))); |
- }); |
- |
- test('test 2', () => expect(outOfBandSetInOnComplete, isTrue)); |
- }, passing: ['test 2']); |
- |
- expectTestsPass('the onComplete queue is run after an asynchronous error', |
- () { |
- var onCompleteRun = false; |
- test('test 1', () { |
- currentSchedule.onComplete.schedule(() { |
- onCompleteRun = true; |
- }); |
- |
- schedule(() => expect('foo', equals('bar'))); |
- }); |
- |
- test('test 2', () { |
- expect(onCompleteRun, isTrue); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass('the onComplete queue is run after a synchronous error', () { |
- var onCompleteRun = false; |
- test('test 1', () { |
- currentSchedule.onComplete.schedule(() { |
- onCompleteRun = true; |
- }); |
- |
- throw 'error'; |
- }); |
- |
- test('test 2', () { |
- expect(onCompleteRun, isTrue); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass('the onComplete queue is run after an out-of-band error', () { |
- var onCompleteRun = false; |
- test('test 1', () { |
- currentSchedule.onComplete.schedule(() { |
- onCompleteRun = true; |
- }); |
- |
- pumpEventQueue().then(wrapAsync((_) => expect('foo', equals('bar')))); |
- }); |
- |
- test('test 2', () { |
- expect(onCompleteRun, isTrue); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass('currentSchedule.errors contains the error in the onComplete ' |
- 'queue', () { |
- var errors; |
- test('test 1', () { |
- currentSchedule.onComplete.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- throw 'error'; |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals(['error'])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass('onComplete tasks can be scheduled during normal tasks', () { |
- var onCompleteRun = false; |
- test('test 1', () { |
- schedule(() { |
- currentSchedule.onComplete.schedule(() { |
- onCompleteRun = true; |
- }); |
- }); |
- }); |
- |
- test('test 2', () { |
- expect(onCompleteRun, isTrue); |
- }); |
- }); |
- |
- expectTestsFail('failures in onComplete cause test failures', () { |
- test('test', () { |
- currentSchedule.onComplete.schedule(() { |
- expect('foo', equals('bar')); |
- }); |
- }); |
- }); |
- |
- expectTestsPass('the onException queue is not run if a test is successful', |
- () { |
- var onExceptionRun = false; |
- test('test 1', () { |
- currentSchedule.onException.schedule(() { |
- onExceptionRun = true; |
- }); |
- |
- schedule(() => expect('foo', equals('foo'))); |
- }); |
- |
- test('test 2', () { |
- expect(onExceptionRun, isFalse); |
- }); |
- }); |
- |
- expectTestsPass('the onException queue is run after an asynchronous error', |
- () { |
- var onExceptionRun = false; |
- test('test 1', () { |
- currentSchedule.onException.schedule(() { |
- onExceptionRun = true; |
- }); |
- |
- schedule(() => expect('foo', equals('bar'))); |
- }); |
- |
- test('test 2', () { |
- expect(onExceptionRun, isTrue); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass('the onException queue is run after a synchronous error', () { |
- var onExceptionRun = false; |
- test('test 1', () { |
- currentSchedule.onException.schedule(() { |
- onExceptionRun = true; |
- }); |
- |
- throw 'error'; |
- }); |
- |
- test('test 2', () { |
- expect(onExceptionRun, isTrue); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass('the onException queue is run after an out-of-band error', () { |
- var onExceptionRun = false; |
- test('test 1', () { |
- currentSchedule.onException.schedule(() { |
- onExceptionRun = true; |
- }); |
- |
- pumpEventQueue().then(wrapAsync((_) => expect('foo', equals('bar')))); |
- }); |
- |
- test('test 2', () { |
- expect(onExceptionRun, isTrue); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass('currentSchedule.errors contains the error in the ' |
- 'onException queue', () { |
- var errors; |
- test('test 1', () { |
- currentSchedule.onException.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- throw 'error'; |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals(['error'])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass('currentSchedule.errors contains an error passed into ' |
- 'signalError synchronously', () { |
- var errors; |
- test('test 1', () { |
- currentSchedule.onException.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- currentSchedule.signalError('error'); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals(['error'])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass('currentSchedule.errors contains an error passed into ' |
- 'signalError asynchronously', () { |
- var errors; |
- test('test 1', () { |
- currentSchedule.onException.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- schedule(() => currentSchedule.signalError('error')); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals(['error'])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass('currentSchedule.errors contains an error passed into ' |
- 'signalError out-of-band', () { |
- var errors; |
- test('test 1', () { |
- currentSchedule.onException.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- pumpEventQueue().then(wrapAsync((_) { |
- return currentSchedule.signalError('error'); |
- })); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals(['error'])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass('currentSchedule.errors contains errors from both the task ' |
- 'queue and the onException queue in onComplete', () { |
- var errors; |
- test('test 1', () { |
- currentSchedule.onComplete.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- currentSchedule.onException.schedule(() { |
- throw 'error2'; |
- }); |
- |
- throw 'error1'; |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals(['error1', 'error2'])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass('currentSchedule.errors contains multiple out-of-band errors ' |
- 'from both the main task queue and onException in onComplete', () { |
- mock_clock.mock().run(); |
- var errors; |
- test('test 1', () { |
- currentSchedule.onComplete.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- currentSchedule.onException.schedule(() { |
- sleep(1).then(wrapAsync((_) { |
- throw 'error3'; |
- })); |
- sleep(2).then(wrapAsync((_) { |
- throw 'error4'; |
- })); |
- }); |
- |
- sleep(1).then(wrapAsync((_) { |
- throw 'error1'; |
- })); |
- sleep(2).then(wrapAsync((_) { |
- throw 'error2'; |
- })); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), |
- orderedEquals(['error1', 'error2', 'error3', 'error4'])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass('currentSchedule.errors contains multiple out-of-band errors ' |
- 'from both the main task queue and onException in onComplete reported ' |
- 'via wrapFuture', () { |
- mock_clock.mock().run(); |
- var errors; |
- test('test 1', () { |
- currentSchedule.onComplete.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- currentSchedule.onException.schedule(() { |
- wrapFuture(sleep(1).then((_) { |
- throw 'error3'; |
- })); |
- wrapFuture(sleep(2).then((_) { |
- throw 'error4'; |
- })); |
- }); |
- |
- wrapFuture(sleep(1).then((_) { |
- throw 'error1'; |
- })); |
- wrapFuture(sleep(2).then((_) { |
- throw 'error2'; |
- })); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), |
- orderedEquals(['error1', 'error2', 'error3', 'error4'])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass('currentSchedule.errors contains both an out-of-band error ' |
- 'and an error raised afterwards in a task', () { |
- mock_clock.mock().run(); |
- var errors; |
- test('test 1', () { |
- currentSchedule.onComplete.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- sleep(1).then(wrapAsync((_) { |
- throw 'out-of-band'; |
- })); |
- |
- schedule(() => sleep(2).then((_) { |
- throw 'in-band'; |
- })); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals(['out-of-band', 'in-band'])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass('currentSchedule.errors contains both an error raised in a ' |
- 'task and an error raised afterwards out-of-band', () { |
- mock_clock.mock().run(); |
- var errors; |
- test('test 1', () { |
- currentSchedule.onComplete.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- sleep(2).then(wrapAsync((_) { |
- throw 'out-of-band'; |
- })); |
- |
- schedule(() => sleep(1).then((_) { |
- throw 'in-band'; |
- })); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals(['in-band', 'out-of-band'])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass('currentSchedule.currentTask returns the current task while ' |
- 'executing a task', () { |
- test('test', () { |
- schedule(() => expect('foo', equals('foo')), 'task 1'); |
- |
- schedule(() { |
- expect(currentSchedule.currentTask.description, equals('task 2')); |
- }, 'task 2'); |
- |
- schedule(() => expect('bar', equals('bar')), 'task 3'); |
- }); |
- }); |
- |
- expectTestsPass('currentSchedule.currentTask is null before the schedule has ' |
- 'started', () { |
- test('test', () { |
- schedule(() => expect('foo', equals('foo'))); |
- |
- expect(currentSchedule.currentTask, isNull); |
- }); |
- }); |
- |
- expectTestsPass('currentSchedule.currentTask is null after the schedule has ' |
- 'completed', () { |
- test('test', () { |
- schedule(() { |
- expect(pumpEventQueue().then((_) { |
- expect(currentSchedule.currentTask, isNull); |
- }), completes); |
- }); |
- |
- schedule(() => expect('foo', equals('foo'))); |
- }); |
- }); |
- |
- expectTestsPass('currentSchedule.currentQueue returns the current queue while ' |
- 'executing a task', () { |
- test('test', () { |
- schedule(() { |
- expect(currentSchedule.currentQueue.name, equals('tasks')); |
- }); |
- }); |
- }); |
- |
- expectTestsPass('currentSchedule.currentQueue is tasks before the schedule ' |
- 'has started', () { |
- test('test', () { |
- schedule(() => expect('foo', equals('foo'))); |
- |
- expect(currentSchedule.currentQueue.name, equals('tasks')); |
- }); |
- }); |
- |
- expectTestsPass('currentSchedule.state starts out as SET_UP', () { |
- test('test', () { |
- expect(currentSchedule.state, equals(ScheduleState.SET_UP)); |
- }); |
- }); |
- |
- expectTestsPass('currentSchedule.state is RUNNING in tasks', () { |
- test('test', () { |
- schedule(() { |
- expect(currentSchedule.state, equals(ScheduleState.RUNNING)); |
- }); |
- |
- currentSchedule.onComplete.schedule(() { |
- expect(currentSchedule.state, equals(ScheduleState.RUNNING)); |
- }); |
- }); |
- }); |
- |
- expectTestsPass('currentSchedule.state is DONE after the test', () { |
- var oldSchedule; |
- test('test 1', () { |
- oldSchedule = currentSchedule; |
- }); |
- |
- test('test 2', () { |
- expect(oldSchedule.state, equals(ScheduleState.DONE)); |
- }); |
- }); |
- |
- expectTestsPass('setUp is run before each test', () { |
- var setUpRun = false; |
- setUp(() { |
- setUpRun = true; |
- }); |
- |
- test('test 1', () { |
- expect(setUpRun, isTrue); |
- setUpRun = false; |
- }); |
- |
- test('test 2', () { |
- expect(setUpRun, isTrue); |
- setUpRun = false; |
- }); |
- }); |
- |
- expectTestsPass('setUp can schedule events', () { |
- var setUpRun = false; |
- setUp(() { |
- schedule(() { |
- setUpRun = true; |
- }); |
- currentSchedule.onComplete.schedule(() { |
- setUpRun = false; |
- }); |
- }); |
- |
- test('test 1', () { |
- expect(setUpRun, isFalse); |
- schedule(() => expect(setUpRun, isTrue)); |
- }); |
- |
- test('test 2', () { |
- expect(setUpRun, isFalse); |
- schedule(() => expect(setUpRun, isTrue)); |
- }); |
- }); |
- |
- expectTestsFail('synchronous errors in setUp will cause tests to fail', () { |
- setUp(() => expect('foo', equals('bar'))); |
- test('test 1', () => expect('foo', equals('foo'))); |
- test('test 2', () => expect('foo', equals('foo'))); |
- }); |
- |
- expectTestsFail('scheduled errors in setUp will cause tests to fail', () { |
- setUp(() => schedule(() => expect('foo', equals('bar')))); |
- test('test 1', () => expect('foo', equals('foo'))); |
- test('test 2', () => expect('foo', equals('foo'))); |
- }); |
- |
- expectTestsPass('synchronous errors in setUp will cause onException to run', |
- () { |
- var onExceptionRun = false; |
- setUp(() { |
- currentSchedule.onException.schedule(() { |
- onExceptionRun = true; |
- }); |
- |
- if (!onExceptionRun) expect('foo', equals('bar')); |
- }); |
- |
- test('test 1', () => expect('foo', equals('foo'))); |
- test('test 2', () => expect(onExceptionRun, isTrue)); |
- }, passing: ['test 2']); |
- |
- expectTestsPass("setUp doesn't apply to child groups", () { |
- var setUpRun = false; |
- setUp(() { |
- setUpRun = true; |
- currentSchedule.onComplete.schedule(() { |
- setUpRun = false; |
- }); |
- }); |
- |
- test('outer', () { |
- expect(setUpRun, isTrue); |
- }); |
- |
- group('group', () { |
- test('inner', () { |
- expect(setUpRun, isFalse); |
- }); |
- }); |
- }); |
- |
- expectTestsPass("setUp doesn't apply to parent groups", () { |
- var setUpRun = false; |
- group('group', () { |
- setUp(() { |
- setUpRun = true; |
- currentSchedule.onComplete.schedule(() { |
- setUpRun = false; |
- }); |
- }); |
- |
- test('inner', () { |
- expect(setUpRun, isTrue); |
- }); |
- }); |
- |
- test('outer', () { |
- expect(setUpRun, isFalse); |
- }); |
- }); |
- |
- expectTestsPass("setUp doesn't apply to sibling groups", () { |
- var setUpRun = false; |
- group('group 1', () { |
- setUp(() { |
- setUpRun = true; |
- currentSchedule.onComplete.schedule(() { |
- setUpRun = false; |
- }); |
- }); |
- |
- test('test 1', () { |
- expect(setUpRun, isTrue); |
- }); |
- }); |
- |
- group('group 2', () { |
- test('test 2', () { |
- expect(setUpRun, isFalse); |
- }); |
- }); |
- }); |
- |
- expectTestsPass("a single task that takes too long will cause a timeout " |
- "error", () { |
- mock_clock.mock().run(); |
- var errors; |
- test('test 1', () { |
- currentSchedule.timeout = new Duration(milliseconds: 1); |
- |
- currentSchedule.onException.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- schedule(() => sleep(2)); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals(["The schedule timed out after " |
- "0:00:00.001000 of inactivity."])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass("an out-of-band callback that takes too long will cause a " |
- "timeout error", () { |
- mock_clock.mock().run(); |
- var errors; |
- test('test 1', () { |
- currentSchedule.timeout = new Duration(milliseconds: 1); |
- |
- currentSchedule.onException.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- sleep(2).then(wrapAsync((_) => expect('foo', equals('foo')))); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals(["The schedule timed out after " |
- "0:00:00.001000 of inactivity."])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass("each task resets the timeout timer", () { |
- mock_clock.mock().run(); |
- test('test', () { |
- currentSchedule.timeout = new Duration(milliseconds: 2); |
- |
- schedule(() => sleep(1)); |
- schedule(() => sleep(1)); |
- schedule(() => sleep(1)); |
- }); |
- }); |
- |
- expectTestsPass("setting up the test doesn't trigger a timeout", () { |
- var clock = mock_clock.mock(); |
- test('test', () { |
- currentSchedule.timeout = new Duration(milliseconds: 1); |
- |
- clock.tick(2); |
- schedule(() => expect('foo', equals('foo'))); |
- }); |
- }); |
- |
- expectTestsPass("an out-of-band error that's signaled after a timeout but " |
- "before the test completes is registered", () { |
- mock_clock.mock().run(); |
- var errors; |
- test('test 1', () { |
- currentSchedule.timeout = new Duration(milliseconds: 3); |
- |
- currentSchedule.onException.schedule(() => sleep(2)); |
- currentSchedule.onException.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- sleep(4).then(wrapAsync((_) { |
- throw 'out-of-band'; |
- })); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals([ |
- "The schedule timed out after 0:00:00.003000 of inactivity.", |
- "out-of-band" |
- ])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass("an out-of-band error that's signaled after a timeout but " |
- "before the test completes plays nicely with other out-of-band callbacks", |
- () { |
- mock_clock.mock().run(); |
- var errors; |
- var onExceptionCallbackRun = false; |
- var onCompleteRunAfterOnExceptionCallback = false; |
- test('test 1', () { |
- currentSchedule.timeout = new Duration(milliseconds: 2); |
- |
- currentSchedule.onException.schedule(() { |
- sleep(1).then(wrapAsync((_) { |
- onExceptionCallbackRun = true; |
- })); |
- }); |
- |
- currentSchedule.onComplete.schedule(() { |
- onCompleteRunAfterOnExceptionCallback = onExceptionCallbackRun; |
- }); |
- |
- sleep(3).then(wrapAsync((_) { |
- throw 'out-of-band'; |
- })); |
- }); |
- |
- test('test 2', () { |
- expect(onCompleteRunAfterOnExceptionCallback, isTrue); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass("a task that times out while waiting to handle an " |
- "out-of-band error records both", () { |
- mock_clock.mock().run(); |
- var errors; |
- test('test 1', () { |
- currentSchedule.timeout = new Duration(milliseconds: 2); |
- |
- currentSchedule.onException.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- schedule(() => sleep(4)); |
- sleep(1).then((_) => currentSchedule.signalError('out-of-band')); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals([ |
- "out-of-band", |
- "The schedule timed out after 0:00:00.002000 of inactivity." |
- ])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass("a task that has an error then times out waiting for an " |
- "out-of-band callback records both", () { |
- mock_clock.mock().run(); |
- var errors; |
- test('test 1', () { |
- currentSchedule.timeout = new Duration(milliseconds: 2); |
- |
- currentSchedule.onException.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- schedule(() { |
- throw 'error'; |
- }); |
- wrapFuture(sleep(3)); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals([ |
- "error", |
- "The schedule timed out after 0:00:00.002000 of inactivity." |
- ])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass("currentSchedule.heartbeat resets the timeout timer", () { |
- mock_clock.mock().run(); |
- test('test', () { |
- currentSchedule.timeout = new Duration(milliseconds: 3); |
- |
- schedule(() { |
- return sleep(2).then((_) { |
- currentSchedule.heartbeat(); |
- return sleep(2); |
- }); |
- }); |
- }); |
- }); |
- |
- // TODO(nweiz): test out-of-band post-timeout errors that are detected after |
- // the test finishes once we can detect top-level errors (issue 8417). |
- |
- expectTestsPass("nested schedule() runs its function immediately (but " |
- "asynchronously)", () { |
- test('test', () { |
- schedule(() { |
- var nestedScheduleRun = false; |
- schedule(() { |
- nestedScheduleRun = true; |
- }); |
- |
- expect(nestedScheduleRun, isFalse); |
- expect(pumpEventQueue().then((_) => nestedScheduleRun), |
- completion(isTrue)); |
- }); |
- }); |
- }); |
- |
- expectTestsPass("out-of-band schedule() runs its function immediately (but " |
- "asynchronously)", () { |
- mock_clock.mock().run(); |
- test('test', () { |
- schedule(() { |
- wrapFuture(sleep(1).then((_) { |
- var nestedScheduleRun = false; |
- schedule(() { |
- nestedScheduleRun = true; |
- }); |
- |
- expect(nestedScheduleRun, isFalse); |
- expect(pumpEventQueue().then((_) => nestedScheduleRun), |
- completion(isTrue)); |
- })); |
- }); |
- }); |
- }); |
- |
- expectTestsPass("nested schedule() calls don't wait for one another", () { |
- mock_clock.mock().run(); |
- test('test', () { |
- var sleepFinished = false; |
- schedule(() { |
- schedule(() => sleep(1).then((_) { |
- sleepFinished = true; |
- })); |
- schedule(() => expect(sleepFinished, isFalse)); |
- }); |
- }); |
- }); |
- |
- expectTestsPass("nested schedule() calls block their parent task", () { |
- mock_clock.mock().run(); |
- test('test', () { |
- var sleepFinished = false; |
- schedule(() { |
- schedule(() => sleep(1).then((_) { |
- sleepFinished = true; |
- })); |
- }); |
- |
- schedule(() => expect(sleepFinished, isTrue)); |
- }); |
- }); |
- |
- expectTestsPass("out-of-band schedule() calls block their parent queue", () { |
- mock_clock.mock().run(); |
- test('test', () { |
- var scheduleRun = false; |
- wrapFuture(sleep(1).then((_) { |
- schedule(() => sleep(1).then((_) { |
- scheduleRun = true; |
- })); |
- })); |
- |
- currentSchedule.onComplete.schedule(() => expect(scheduleRun, isTrue)); |
- }); |
- }); |
- |
- expectTestsPass("nested schedule() calls forward their Future values", () { |
- mock_clock.mock().run(); |
- test('test', () { |
- schedule(() { |
- expect(schedule(() => 'foo'), completion(equals('foo'))); |
- }); |
- }); |
- }); |
- |
- expectTestsPass("errors in nested schedule() calls are properly registered", |
- () { |
- var errors; |
- test('test 1', () { |
- currentSchedule.onException.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- schedule(() { |
- schedule(() { |
- throw 'error'; |
- }); |
- }); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals(['error'])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass("nested scheduled blocks whose return values are passed to " |
- "wrapFuture should report exceptions once", () { |
- var errors; |
- test('test 1', () { |
- currentSchedule.onException.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- schedule(() { |
- wrapFuture(schedule(() { |
- throw 'error'; |
- })); |
- |
- return pumpEventQueue(); |
- }); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals(['error'])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass("a nested task failing shouldn't short-circuit the parent " |
- "task", () { |
- var parentTaskFinishedBeforeOnComplete = false; |
- test('test 1', () { |
- var parentTaskFinished = false; |
- currentSchedule.onComplete.schedule(() { |
- parentTaskFinishedBeforeOnComplete = parentTaskFinished; |
- }); |
- |
- schedule(() { |
- schedule(() { |
- throw 'error'; |
- }); |
- |
- return sleep(1).then((_) { |
- parentTaskFinished = true; |
- }); |
- }); |
- }); |
- |
- test('test 2', () { |
- expect(parentTaskFinishedBeforeOnComplete, isTrue); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass("an error thrown in a scheduled task should be piped to that " |
- "task's return value", () { |
- var error; |
- test('test 1', () { |
- schedule(() { |
- throw 'error'; |
- }).catchError((e) { |
- error = e; |
- }); |
- }); |
- |
- test('test 2', () { |
- expect(error, new isInstanceOf<ScheduleError>()); |
- expect(error.error, equals('error')); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass("an error thrown in a scheduled task should be piped to " |
- "future tasks' return values", () { |
- var error; |
- test('test 1', () { |
- schedule(() { |
- throw 'error'; |
- }); |
- |
- schedule(() => null).catchError((e) { |
- error = e; |
- }); |
- }); |
- |
- test('test 2', () { |
- expect(error, new isInstanceOf<ScheduleError>()); |
- expect(error.error, equals('error')); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass("an out-of-band error should be piped to future tasks' " |
- "return values, but not the current task's", () { |
- mock_clock.mock().run(); |
- var error; |
- var firstTaskError = false; |
- var secondTaskRun = false; |
- test('test 1', () { |
- schedule(() => sleep(2)).catchError((_) { |
- firstTaskError = true; |
- }); |
- |
- sleep(1).then(wrapAsync((_) { |
- throw 'error'; |
- })); |
- |
- schedule(() { |
- secondTaskRun = true; |
- }).catchError((e) { |
- error = e; |
- }); |
- }); |
- |
- test('test 2', () { |
- expect(firstTaskError, isFalse); |
- expect(secondTaskRun, isFalse); |
- expect(error, new isInstanceOf<ScheduleError>()); |
- expect(error.error, equals('error')); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass("expect(..., completes) with a completing future should pass", |
- () { |
- test('test', () { |
- expect(pumpEventQueue(), completes); |
- }); |
- }); |
- |
- expectTestsPass("expect(..., completes) with a failing future should signal " |
- "an out-of-band error", () { |
- var errors; |
- test('test 1', () { |
- currentSchedule.onException.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- expect(pumpEventQueue().then((_) { |
- throw 'error'; |
- }), completes); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals(['error'])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass("expect(..., completion(...)) with a matching future should " |
- "pass", () { |
- test('test', () { |
- expect(pumpEventQueue().then((_) => 'foo'), completion(equals('foo'))); |
- }); |
- }); |
- |
- expectTestsPass("expect(..., completion(...)) with a non-matching future " |
- "should signal an out-of-band error", () { |
- var errors; |
- test('test 1', () { |
- currentSchedule.onException.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- expect(pumpEventQueue().then((_) => 'foo'), completion(equals('bar'))); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.length, equals(1)); |
- expect(errors.first.error, new isInstanceOf<TestFailure>()); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass("expect(..., completion(...)) with a failing future should " |
- "signal an out-of-band error", () { |
- var errors; |
- test('test 1', () { |
- currentSchedule.onException.schedule(() { |
- errors = currentSchedule.errors; |
- }); |
- |
- expect(pumpEventQueue().then((_) { |
- throw 'error'; |
- }), completion(equals('bar'))); |
- }); |
- |
- test('test 2', () { |
- expect(errors, everyElement(new isInstanceOf<ScheduleError>())); |
- expect(errors.map((e) => e.error), equals(['error'])); |
- }); |
- }, passing: ['test 2']); |
- |
- expectTestsPass("aborting the schedule before it's started running should " |
- "cause no tasks to be run", () { |
- test('test', () { |
- schedule(() { |
- throw 'error'; |
- }); |
- |
- currentSchedule.abort(); |
- }); |
- }); |
- |
- expectTestsPass("aborting the schedule while it's running should stop future " |
- "tasks from running", () { |
- test('test', () { |
- schedule(currentSchedule.abort); |
- |
- schedule(() { |
- throw 'error'; |
- }); |
- }); |
- }); |
- |
- expectTestsPass("aborting the schedule while it's running shouldn't stop " |
- "tasks in other queues from running", () { |
- var onCompleteRun = false; |
- test('test 1', () { |
- schedule(currentSchedule.abort); |
- |
- currentSchedule.onComplete.schedule(() { |
- onCompleteRun = true; |
- }); |
- }); |
- |
- test('test 2', () { |
- expect(onCompleteRun, isTrue); |
- }); |
- }); |
- |
- expectTestsPass("aborting the schedule while it's running shouldn't stop " |
- "out-of-band callbacks", () { |
- test('test', () { |
- var outOfBandFinished = false; |
- schedule(() { |
- wrapFuture(pumpEventQueue().then((_) { |
- outOfBandFinished = true; |
- })); |
- |
- currentSchedule.abort(); |
- }); |
- |
- currentSchedule.onComplete.schedule(() { |
- expect(outOfBandFinished, isTrue); |
- }); |
- }); |
- }); |
- |
- expectTestsPass("aborting the schedule in a non-tasks queue should stop " |
- "future tasks from running", () { |
- test('test', () { |
- currentSchedule.onComplete.schedule(() { |
- currentSchedule.abort(); |
- }); |
- |
- currentSchedule.onComplete.schedule(() { |
- throw 'error'; |
- }); |
- }); |
- }); |
- |
- expectTestsFail("aborting the schedule after an out-of-band error should " |
- "still surface the error", () { |
- test('test', () { |
- schedule(() { |
- currentSchedule.signalError('error'); |
- currentSchedule.abort(); |
- }); |
- }); |
- }); |
-} |