| Index: test/codegen/lib/html/async_cancellingisolate.dart
 | 
| diff --git a/test/codegen/lib/html/async_cancellingisolate.dart b/test/codegen/lib/html/async_cancellingisolate.dart
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..6278ebc2585f783dc510b43fc7e00bc600f5fe03
 | 
| --- /dev/null
 | 
| +++ b/test/codegen/lib/html/async_cancellingisolate.dart
 | 
| @@ -0,0 +1,31 @@
 | 
| +library async_cancellingisolate;
 | 
| +
 | 
| +import 'dart:async';
 | 
| +import 'package:unittest/unittest.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');
 | 
| +  });
 | 
| +}
 | 
| 
 |