Index: runtime/observatory/tests/service/step_over_await_test.dart |
diff --git a/runtime/observatory/tests/service/step_over_await_test.dart b/runtime/observatory/tests/service/step_over_await_test.dart |
index 5b5f4edf1fbf09d7d3e86b951fa995ee8d058571..1bbb3b791b7729ee340eca141fd378a6f0dc418c 100644 |
--- a/runtime/observatory/tests/service/step_over_await_test.dart |
+++ b/runtime/observatory/tests/service/step_over_await_test.dart |
@@ -13,164 +13,33 @@ import 'package:observatory/models.dart' as M; |
import 'package:observatory/service_io.dart'; |
import 'package:unittest/unittest.dart'; |
-const int LINE_A = 25; |
-const int LINE_B = 27; |
-const int LINE_C = 29; |
-const int LINE_D = 30; |
+const int LINE_A = 22; |
+const int LINE_B = 24; |
-// This tests the low level synthetic breakpoint added / paused / removed |
-// machinery triggered by the step OverAwait command. |
-asyncWithoutAwait() async { |
+// This tests the asyncStepOver command. |
+asyncFunction() async { |
debugger(); |
print('a'); // LINE_A |
await new Future.delayed(new Duration(seconds: 2)); |
print('b'); // LINE_B |
- debugger(); // LINE_C |
- debugger(); // LINE_D |
} |
testMain() { |
- asyncWithoutAwait(); |
+ asyncFunction(); |
} |
-Breakpoint syntheticBreakpoint; |
- |
-Future<Isolate> testLowLevelAwaitOver( |
- Isolate isolate) { |
- assert(M.isAtAsyncSuspension(isolate.pauseEvent)); |
- |
- int state = 0; |
- bool firstResume = true; |
- handleBreakpointAdded(ServiceEvent event) { |
- expect(syntheticBreakpoint, isNull); |
- expect(state, 0); |
- if (!event.breakpoint.isSyntheticAsyncContinuation) { |
- // Not a synthetic async breakpoint. |
- return; |
- } |
- if (event.owner != isolate) { |
- // Wrong isolate. |
- return; |
- } |
- syntheticBreakpoint = event.breakpoint; |
- print('!!!! Synthetic async breakpoint added ${syntheticBreakpoint}'); |
- state = 1; |
- } |
- |
- handleResume(ServiceEvent event) { |
- if (firstResume) { |
- expect(state, 1); |
- if (event.owner != isolate) { |
- // Wrong isolate. |
- return; |
- } |
- print('!!!! Got first resume.'); |
- state = 2; |
- firstResume = false; |
- } else { |
- expect(state, 3); |
- if (event.owner != isolate) { |
- // Wrong isolate. |
- return; |
- } |
- print('!!!! Got second resume.'); |
- state = 4; |
- } |
- |
- } |
- |
- handlePauseBreakpoint(ServiceEvent event) { |
- expect(syntheticBreakpoint, isNotNull); |
- expect(state, 2); |
- if (!event.breakpoint.isSyntheticAsyncContinuation) { |
- // Not a synthetic async breakpoint. |
- return; |
- } |
- if (event.owner != isolate) { |
- // Wrong isolate. |
- return; |
- } |
- expect(event.breakpoint, equals(syntheticBreakpoint)); |
- print('!!!! Paused at synthetic async breakpoint ${syntheticBreakpoint}'); |
- state = 3; |
- } |
- |
- handleBreakpointRemoved(ServiceEvent event) { |
- expect(syntheticBreakpoint, isNotNull); |
- expect(state, 4); |
- if (!event.breakpoint.isSyntheticAsyncContinuation) { |
- // Not a synthetic async breakpoint. |
- return; |
- } |
- if (event.owner != isolate) { |
- // Wrong isolate. |
- return; |
- } |
- expect(event.breakpoint, equals(syntheticBreakpoint)); |
- print('!!!! Synthetic async breakpoint removed ${syntheticBreakpoint}'); |
- state = 5; |
- syntheticBreakpoint = null; |
- } |
- |
- // Set up a listener to wait for debugger events. |
- Completer completer = new Completer(); |
- isolate.vm.getEventStream(VM.kDebugStream).then((stream) { |
- var subscription; |
- subscription = stream.listen((ServiceEvent event) async { |
- if (event.kind == ServiceEvent.kBreakpointAdded) { |
- handleBreakpointAdded(event); |
- expect(state, 1); |
- } else if (event.kind == ServiceEvent.kResume) { |
- if (firstResume) { |
- handleResume(event); |
- expect(state, 2); |
- } else { |
- handleResume(event); |
- expect(state, 4); |
- } |
- } else if (event.kind == ServiceEvent.kPauseBreakpoint) { |
- handlePauseBreakpoint(event); |
- expect(state, 3); |
- // Check that we are paused after the await statement. |
- await (stoppedAtLine(LINE_B)(isolate)); |
- // Resume the isolate so that we trigger the breakpoint removal. |
- print('!!!! Triggering synthetic breakpoint removal.'); |
- isolate.resume(); |
- } else if (event.kind == ServiceEvent.kBreakpointRemoved) { |
- handleBreakpointRemoved(event); |
- expect(state, 5); |
- subscription.cancel(); |
- if (completer != null) { |
- // Reload to update isolate.pauseEvent. |
- completer.complete(isolate.reload()); |
- completer = null; |
- } |
- } |
- }); |
- }); |
- |
- isolate.stepOverAsyncSuspension(); |
- |
- return completer.future; // Will complete when breakpoint added. |
-} |
- |
- |
var tests = [ |
hasStoppedAtBreakpoint, |
stoppedAtLine(LINE_A), |
- stepOver, |
- stepOver, |
- stepOver, |
+ stepOver, // At new Duration(). |
+ stepOver, // At new Future.delayed(). |
+ stepOver, // At async. |
+ // Check that we are at the async statement |
(Isolate isolate) async { |
expect(M.isAtAsyncSuspension(isolate.pauseEvent), isTrue); |
- expect(syntheticBreakpoint, isNull); |
}, |
- testLowLevelAwaitOver, |
- hasStoppedAtBreakpoint, |
- stoppedAtLine(LINE_C), |
- resumeIsolate, |
- hasStoppedAtBreakpoint, |
- stoppedAtLine(LINE_D), |
+ asyncStepOver, |
+ stoppedAtLine(LINE_B), |
resumeIsolate, |
]; |