Index: runtime/observatory/tests/service/async_step_test.dart |
diff --git a/runtime/observatory/tests/service/async_step_test.dart b/runtime/observatory/tests/service/async_step_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..43a44e75b3296a5b18561c7163f720cd933418b7 |
--- /dev/null |
+++ b/runtime/observatory/tests/service/async_step_test.dart |
@@ -0,0 +1,79 @@ |
+// Copyright (c) 2015, 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. |
+// VMOptions=--compile_all --error_on_bad_type --error_on_bad_override --verbose_debug |
+ |
+import 'package:observatory/service_io.dart'; |
+import 'package:unittest/unittest.dart'; |
+import 'test_helper.dart'; |
+import 'dart:developer'; |
+ |
+foo() async { } |
+ |
+doAsync(stop) async { |
+ if (stop) debugger(); |
+ await foo(); // Line 15. |
+ await foo(); // Line 16. |
+ await foo(); // Line 17. |
+ return null; |
+} |
+ |
+testMain() { |
+ // With two runs of doAsync floating around, async step should only cause |
+ // us to stop in the run we started in. |
+ doAsync(false); |
+ doAsync(true); |
+} |
+ |
+ |
+asyncStep(Isolate isolate) async { |
+ var event = isolate.pauseEvent; |
+ expect(event, isNotNull); |
+ |
+ // 1. Set breakpoint for the continuation and resume the isolate. |
+ Instance continuation = event.asyncContinuation; |
+ print("Async continuation is $continuation"); |
+ expect(continuation.isClosure, isTrue); |
+ |
+ var bpt = await isolate.addBreakOnActivation(continuation); |
+ expect(bpt is Breakpoint, isTrue); |
+ print("Async step to $bpt"); |
+ |
+ print("A"); |
+ await isolate.resume(); |
+ print("AA"); |
+ await hasStoppedAtBreakpoint(isolate); |
+ |
+ // 2. Step past the state-machine dispatch. |
+ print("AAA"); |
+ await isolate.stepOver(); |
+ print("AAAA"); |
+ await hasStoppedAtBreakpoint(isolate); |
+} |
+ |
+// Currying is your friend. |
+atLine(int line) { |
Cutch
2015/07/15 17:04:23
Add a return type 'IsolateTest':
IsolateTest atLi
rmacnak
2015/07/16 19:42:17
Done.
|
+ return (Isolate isolate) async { |
+ ServiceMap stack = await isolate.getStack(); |
+ expect(stack.type, equals('Stack')); |
+ expect(stack['frames'].length, greaterThanOrEqualTo(1)); |
+ |
+ Script script = stack['frames'][0].location.script; |
+ await script.load(); |
+ expect(script.tokenToLine(stack['frames'][0].location.tokenPos), |
+ equals(line)); |
+ }; |
+} |
+ |
+ |
+var tests = [ |
+ hasStoppedAtBreakpoint, |
+ atLine(15), |
+ asyncStep, |
+ atLine(16), |
+ asyncStep, |
+ atLine(17), |
+ resumeIsolate, |
+]; |
+ |
+main(args) => runIsolateTests(args, tests, testeeConcurrent: testMain); |