| library async_test; |
| |
| import 'package:unittest/unittest.dart'; |
| import 'package:unittest/html_config.dart'; |
| |
| import 'dart:async'; |
| import 'dart:isolate'; |
| import 'dart:html'; |
| |
| oneshotTimerIsolate(message) { |
| var command = message[0]; |
| var replyTo = message[1]; |
| expect(command, 'START'); |
| new Timer(const Duration(milliseconds: 10), () { |
| replyTo.send('DONE'); |
| }); |
| } |
| |
| periodicTimerIsolate(message) { |
| var command = message[0]; |
| var replyTo = message[1]; |
| expect(command, 'START'); |
| int counter = 0; |
| new Timer.periodic(const Duration(milliseconds: 10), (timer) { |
| if (counter == 3) { |
| counter = 1024; |
| timer.cancel(); |
| // Wait some more time to be sure callback won't be invoked any |
| // more. |
| new Timer(const Duration(milliseconds: 30), () { |
| replyTo.send('DONE'); |
| }); |
| return; |
| } |
| assert(counter < 3); |
| counter++; |
| }); |
| } |
| |
| cancellingIsolate(message) { |
| var command = message[0]; |
| var replyTo = message[1]; |
| expect(command, 'START'); |
| bool shot = false; |
| var oneshot; |
| var periodic; |
| periodic = new Timer.periodic(const Duration(milliseconds: 10), (timer) { |
| expect(shot, isFalse); |
| shot = true; |
| expect(timer, same(periodic)); |
| periodic.cancel(); |
| oneshot.cancel(); |
| // Wait some more time to be sure callbacks won't be invoked any |
| // more. |
| new Timer(const Duration(milliseconds: 50), () { |
| replyTo.send('DONE'); |
| }); |
| }); |
| // We launch the oneshot timer after the periodic timer. Otherwise a |
| // (very long) context switch could make this test flaky: assume the |
| // oneshot timer is created first and then there is a 30ms context switch. |
| // when the periodic timer is scheduled it would execute after the oneshot. |
| oneshot = new Timer(const Duration(milliseconds: 30), () { |
| fail('Should never be invoked'); |
| }); |
| } |
| |
| main() { |
| useHtmlConfiguration(); |
| |
| test('one shot timer in pure isolate', () { |
| var response = new ReceivePort(); |
| var remote = Isolate.spawn(oneshotTimerIsolate, |
| ['START', response.sendPort]); |
| expect(remote.then((_) => response.first), completion('DONE')); |
| }); |
| test('periodic timer in pure isolate', () { |
| var response = new ReceivePort(); |
| var remote = Isolate.spawn(periodicTimerIsolate, |
| ['START', response.sendPort]); |
| expect(remote.then((_) => response.first), completion('DONE')); |
| }); |
| test('cancellation in pure isolate', () { |
| var response = new ReceivePort(); |
| var remote = Isolate.spawn(cancellingIsolate, |
| ['START', response.sendPort]); |
| expect(remote.then((_) => response.first), completion('DONE')); |
| }); |
| } |