Index: runtime/observatory/tests/service/service_test_common.dart |
diff --git a/runtime/observatory/tests/service/service_test_common.dart b/runtime/observatory/tests/service/service_test_common.dart |
index 9cf11cdba44ebb9d4709beb83e4cab3e43944e66..935d42602d60ee92c86dbad35526792738ef18fa 100644 |
--- a/runtime/observatory/tests/service/service_test_common.dart |
+++ b/runtime/observatory/tests/service/service_test_common.dart |
@@ -228,7 +228,7 @@ IsolateTest stoppedAtLine(int line) { |
Script script = await top.location.script.load(); |
int actualLine = script.tokenToLine(top.location.tokenPos); |
if (actualLine != line) { |
- var sb = new StringBuffer(); |
+ StringBuffer sb = new StringBuffer(); |
sb.write("Expected to be at line $line but actually at line $actualLine"); |
sb.write("\nFull stack trace:\n"); |
for (Frame f in stack['frames']) { |
@@ -242,6 +242,41 @@ IsolateTest stoppedAtLine(int line) { |
} |
+IsolateTest stoppedInFunction(String functionName, {bool contains: false}) { |
+ return (Isolate isolate) async { |
+ print("Checking we are in function: $functionName"); |
+ |
+ ServiceMap stack = await isolate.getStack(); |
+ expect(stack.type, equals('Stack')); |
+ |
+ List<Frame> frames = stack['frames']; |
+ expect(frames.length, greaterThanOrEqualTo(1)); |
+ |
+ Frame topFrame = stack['frames'][0]; |
+ ServiceFunction function = await topFrame.function.load(); |
+ final bool matches = |
+ contains ? function.name.contains(functionName) : |
+ function.name == functionName; |
+ if (!matches) { |
+ StringBuffer sb = new StringBuffer(); |
+ sb.write("Expected to be in function $functionName but " |
+ "actually in function ${function.name}"); |
+ sb.write("\nFull stack trace:\n"); |
+ for (Frame f in stack['frames']) { |
+ await f.function.load(); |
+ await (f.function.dartOwner as ServiceObject).load(); |
+ String name = f.function.name; |
+ String ownerName = (f.function.dartOwner as ServiceObject).name; |
+ sb.write(" $f [$name] [$ownerName]\n"); |
+ } |
+ throw sb.toString(); |
+ } else { |
+ print('Program is stopped in function: $functionName'); |
+ } |
+ }; |
+} |
+ |
+ |
Future<Isolate> resumeIsolate(Isolate isolate) { |
Completer completer = new Completer(); |
isolate.vm.getEventStream(VM.kDebugStream).then((stream) { |
@@ -292,6 +327,12 @@ Future<Isolate> stepInto(Isolate isolate) async { |
return hasStoppedAtBreakpoint(isolate); |
} |
+Future<Isolate> stepOut(Isolate isolate) async { |
+ await isolate.stepOut(); |
+ return hasStoppedAtBreakpoint(isolate); |
+} |
+ |
+ |
Future<Class> getClassFromRootLib(Isolate isolate, String className) async { |
Library rootLib = await isolate.rootLibrary.load(); |
for (var i = 0; i < rootLib.classes.length; i++) { |