| // Copyright (c) 2020, 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 async_cancellingisolate; |
| |
| import 'dart:async'; |
| import 'package:expect/minitest.dart'; |
| |
| main(message, replyTo) { |
| var command = message.first; |
| expect(command, 'START'); |
| var 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'); |
| }); |
| } |