Index: runtime/observatory/tests/service/get_source_report_test.dart |
diff --git a/runtime/observatory/tests/service/get_source_report_test.dart b/runtime/observatory/tests/service/get_source_report_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e0e511ea19f4498b462e03fda942ce8fbd55fa5f |
--- /dev/null |
+++ b/runtime/observatory/tests/service/get_source_report_test.dart |
@@ -0,0 +1,138 @@ |
+// Copyright (c) 2016, 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=--error_on_bad_type --error_on_bad_override |
+ |
+import 'package:observatory/service_io.dart'; |
+import 'package:unittest/unittest.dart'; |
+import 'test_helper.dart'; |
+import 'dart:developer'; |
+ |
+int globalVar = 100; |
+ |
+class MyClass { |
+ static void myFunction(int value) { |
+ if (value < 0) { |
+ print("negative"); |
+ } else { |
+ print("positive"); |
+ } |
+ debugger(); |
+ } |
+ |
+ static void otherFunction(int value) { |
+ if (value < 0) { |
+ print("otherFunction <"); |
+ } else { |
+ print("otherFunction >="); |
+ } |
+ } |
+} |
+ |
+void testFunction() { |
+ MyClass.otherFunction(-100); |
+ MyClass.myFunction(10000); |
+} |
+ |
+var tests = [ |
+ |
+hasStoppedAtBreakpoint, |
+ |
+(Isolate isolate) async { |
+ var stack = await isolate.getStack(); |
+ |
+ // Make sure we are in the right place. |
+ expect(stack.type, equals('Stack')); |
+ expect(stack['frames'].length, greaterThanOrEqualTo(2)); |
+ expect(stack['frames'][0].function.name, equals('myFunction')); |
+ expect(stack['frames'][0].function.dartOwner.name, equals('MyClass')); |
+ |
+ var func = stack['frames'][0].function; |
+ expect(func.name, equals('myFunction')); |
+ await func.load(); |
+ |
+ var expectedRange = { |
+ 'scriptIndex': 0, |
+ 'startPos': 33, |
+ 'endPos': 82, |
+ 'compiled': true, |
+ 'coverage': {'hits': [48, 66, 76], 'misses': [54]} |
+ }; |
+ |
+ // Full script |
+ var params = { 'reports' : ['Coverage'], |
+ 'scriptId' : func.location.script.id }; |
+ var coverage = await isolate.invokeRpcNoUpgrade('_getSourceReport', params); |
+ expect(coverage['type'], equals('SourceReport')); |
+ expect(coverage['ranges'].length, 5); |
+ expect(coverage['ranges'][0], equals(expectedRange)); |
+ expect(coverage['scripts'].length, 1); |
+ expect(coverage['scripts'][0]['uri'], |
+ endsWith('get_source_report_test.dart')); |
+ |
+ // One function |
+ params = { 'reports' : ['Coverage'], |
+ 'scriptId' : func.location.script.id, |
+ 'tokenPos' : func.location.tokenPos, |
+ 'endTokenPos' : func.location.endTokenPos }; |
+ coverage = await isolate.invokeRpcNoUpgrade('_getSourceReport', params); |
+ expect(coverage['type'], equals('SourceReport')); |
+ expect(coverage['ranges'].length, 1); |
+ expect(coverage['ranges'][0], equals(expectedRange)); |
+ expect(coverage['scripts'].length, 1); |
+ expect(coverage['scripts'][0]['uri'], |
+ endsWith('get_source_report_test.dart')); |
+ |
+ // Full isolate |
+ params = { 'reports' : ['Coverage'] }; |
+ coverage = await isolate.invokeRpcNoUpgrade('_getSourceReport', params); |
+ expect(coverage['type'], equals('SourceReport')); |
+ expect(coverage['ranges'].length, greaterThan(1)); |
+ expect(coverage['scripts'].length, greaterThan(1)); |
+ |
+ // Multiple reports (make sure enum list parameter parsing works). |
+ params = { 'reports' : ['CallSites', 'Coverage'], |
+ 'scriptId' : func.location.script.id, |
+ 'tokenPos' : func.location.tokenPos, |
+ 'endTokenPos' : func.location.endTokenPos }; |
+ coverage = await isolate.invokeRpcNoUpgrade('_getSourceReport', params); |
+ expect(coverage['type'], equals('SourceReport')); |
+ expect(coverage['ranges'].length, 1); |
+ var range = coverage['ranges'][0]; |
+ expect(range.containsKey('callSites'), isTrue); |
+ expect(range.containsKey('coverage'), isTrue); |
+ |
+ // missing scriptId with tokenPos. |
+ bool caughtException = false; |
+ try { |
+ params = { 'reports' : ['Coverage'], |
+ 'tokenPos' : func.location.tokenPos }; |
+ coverage = await isolate.invokeRpcNoUpgrade('_getSourceReport', params); |
+ } on ServerRpcException catch(e) { |
+ caughtException = true; |
+ expect(e.code, equals(ServerRpcException.kInvalidParams)); |
+ expect(e.message, |
+ "_getSourceReport: the 'tokenPos' parameter requires the " |
+ "\'scriptId\' parameter"); |
+ } |
+ expect(caughtException, isTrue); |
+ |
+ // missing scriptId with endTokenPos. |
+ caughtException = false; |
+ try { |
+ params = { 'reports' : ['Coverage'], |
+ 'endTokenPos' : func.location.endTokenPos }; |
+ coverage = await isolate.invokeRpcNoUpgrade('_getSourceReport', params); |
+ } on ServerRpcException catch(e) { |
+ caughtException = true; |
+ expect(e.code, equals(ServerRpcException.kInvalidParams)); |
+ expect(e.message, |
+ "_getSourceReport: the 'endTokenPos' parameter requires the " |
+ "\'scriptId\' parameter"); |
+ } |
+ expect(caughtException, isTrue); |
+}, |
+ |
+]; |
+ |
+main(args) => runIsolateTests(args, tests, testeeConcurrent: testFunction); |