| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 // VMOptions=--optimization_filter=doesNotExist | 4 // VMOptions=--optimization_filter=doesNotExist |
| 5 // ^Force code to be unoptimized so the invocation counts are accurate. | 5 // ^Force code to be unoptimized so the invocation counts are accurate. |
| 6 | 6 |
| 7 library call_site_data_test; | 7 library call_site_data_test; |
| 8 | 8 |
| 9 import 'package:observatory/service_io.dart'; | 9 import 'package:observatory/service_io.dart'; |
| 10 import 'package:unittest/unittest.dart'; | 10 import 'package:unittest/unittest.dart'; |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 | 79 |
| 80 | 80 |
| 81 Set<String> stringifyCacheEntries(Map callSite) { | 81 Set<String> stringifyCacheEntries(Map callSite) { |
| 82 return callSite['cacheEntries'].map((entry) { | 82 return callSite['cacheEntries'].map((entry) { |
| 83 return "${entry['receiverContainer']['name']}:${entry['count']}"; | 83 return "${entry['receiverContainer']['name']}:${entry['count']}"; |
| 84 }).toSet(); | 84 }).toSet(); |
| 85 } | 85 } |
| 86 | 86 |
| 87 | 87 |
| 88 testMonomorphic(Isolate isolate) async { | 88 testMonomorphic(Isolate isolate) async { |
| 89 Library lib = await isolate.rootLib.load(); | 89 Library lib = await isolate.rootLibrary.load(); |
| 90 ServiceFunction func = | 90 ServiceFunction func = |
| 91 lib.functions.singleWhere((f) => f.name == 'monomorphic'); | 91 lib.functions.singleWhere((f) => f.name == 'monomorphic'); |
| 92 Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData', | 92 Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData', |
| 93 { 'targetId': func.id }); | 93 { 'targetId': func.id }); |
| 94 expect(response['type'], equals('CodeCoverage')); | 94 expect(response['type'], equals('CodeCoverage')); |
| 95 Map callSite = response['coverage'].single['callSites'].single; | 95 Map callSite = response['coverage'].single['callSites'].single; |
| 96 expect(callSite['name'], equals('foo')); | 96 expect(callSite['name'], equals('foo')); |
| 97 expect(stringifyCacheEntries(callSite), | 97 expect(stringifyCacheEntries(callSite), |
| 98 equals(['A:10'].toSet())); | 98 equals(['A:10'].toSet())); |
| 99 } | 99 } |
| 100 | 100 |
| 101 testPolymorphic(Isolate isolate) async { | 101 testPolymorphic(Isolate isolate) async { |
| 102 Library lib = await isolate.rootLib.load(); | 102 Library lib = await isolate.rootLibrary.load(); |
| 103 ServiceFunction func = | 103 ServiceFunction func = |
| 104 lib.functions.singleWhere((f) => f.name == 'polymorphic'); | 104 lib.functions.singleWhere((f) => f.name == 'polymorphic'); |
| 105 Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData', | 105 Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData', |
| 106 { 'targetId': func.id }); | 106 { 'targetId': func.id }); |
| 107 expect(response['type'], equals('CodeCoverage')); | 107 expect(response['type'], equals('CodeCoverage')); |
| 108 Map callSite = response['coverage'].single['callSites'].single; | 108 Map callSite = response['coverage'].single['callSites'].single; |
| 109 expect(callSite['name'], equals('foo')); | 109 expect(callSite['name'], equals('foo')); |
| 110 expect(stringifyCacheEntries(callSite), | 110 expect(stringifyCacheEntries(callSite), |
| 111 equals(['A:10', 'B:20', 'C:30'].toSet())); | 111 equals(['A:10', 'B:20', 'C:30'].toSet())); |
| 112 } | 112 } |
| 113 | 113 |
| 114 testMegamorphic(Isolate isolate) async { | 114 testMegamorphic(Isolate isolate) async { |
| 115 Library lib = await isolate.rootLib.load(); | 115 Library lib = await isolate.rootLibrary.load(); |
| 116 ServiceFunction func = | 116 ServiceFunction func = |
| 117 lib.functions.singleWhere((f) => f.name == 'megamorphic'); | 117 lib.functions.singleWhere((f) => f.name == 'megamorphic'); |
| 118 Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData', | 118 Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData', |
| 119 { 'targetId': func.id }); | 119 { 'targetId': func.id }); |
| 120 expect(response['type'], equals('CodeCoverage')); | 120 expect(response['type'], equals('CodeCoverage')); |
| 121 Map callSite = response['coverage'].single['callSites'].single; | 121 Map callSite = response['coverage'].single['callSites'].single; |
| 122 expect(callSite['name'], equals('foo')); | 122 expect(callSite['name'], equals('foo')); |
| 123 expect(stringifyCacheEntries(callSite), | 123 expect(stringifyCacheEntries(callSite), |
| 124 equals(['A:10', 'B:20', 'C:30', 'D:40', | 124 equals(['A:10', 'B:20', 'C:30', 'D:40', |
| 125 'E:50', 'F:60', 'G:70', 'H:80'].toSet())); | 125 'E:50', 'F:60', 'G:70', 'H:80'].toSet())); |
| 126 } | 126 } |
| 127 | 127 |
| 128 testStaticCall(Isolate isolate) async { | 128 testStaticCall(Isolate isolate) async { |
| 129 Library lib = await isolate.rootLib.load(); | 129 Library lib = await isolate.rootLibrary.load(); |
| 130 ServiceFunction func = | 130 ServiceFunction func = |
| 131 lib.functions.singleWhere((f) => f.name == 'staticCall'); | 131 lib.functions.singleWhere((f) => f.name == 'staticCall'); |
| 132 Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData', | 132 Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData', |
| 133 { 'targetId': func.id }); | 133 { 'targetId': func.id }); |
| 134 expect(response['type'], equals('CodeCoverage')); | 134 expect(response['type'], equals('CodeCoverage')); |
| 135 Map callSite = response['coverage'].single['callSites'].single; | 135 Map callSite = response['coverage'].single['callSites'].single; |
| 136 expect(callSite['name'], equals('staticMethod')); | 136 expect(callSite['name'], equals('staticMethod')); |
| 137 expect(stringifyCacheEntries(callSite), | 137 expect(stringifyCacheEntries(callSite), |
| 138 equals(['Static:10'].toSet())); | 138 equals(['Static:10'].toSet())); |
| 139 } | 139 } |
| 140 | 140 |
| 141 testConstructorCall(Isolate isolate) async { | 141 testConstructorCall(Isolate isolate) async { |
| 142 Library lib = await isolate.rootLib.load(); | 142 Library lib = await isolate.rootLibrary.load(); |
| 143 ServiceFunction func = | 143 ServiceFunction func = |
| 144 lib.functions.singleWhere((f) => f.name == 'constructorCall'); | 144 lib.functions.singleWhere((f) => f.name == 'constructorCall'); |
| 145 Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData', | 145 Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData', |
| 146 { 'targetId': func.id }); | 146 { 'targetId': func.id }); |
| 147 expect(response['type'], equals('CodeCoverage')); | 147 expect(response['type'], equals('CodeCoverage')); |
| 148 Map callSite = response['coverage'].single['callSites'].single; | 148 Map callSite = response['coverage'].single['callSites'].single; |
| 149 expect(callSite['name'], equals('Static.')); | 149 expect(callSite['name'], equals('Static.')); |
| 150 expect(stringifyCacheEntries(callSite), | 150 expect(stringifyCacheEntries(callSite), |
| 151 equals(['Static:10'].toSet())); | 151 equals(['Static:10'].toSet())); |
| 152 } | 152 } |
| 153 | 153 |
| 154 testTopLevelCall(Isolate isolate) async { | 154 testTopLevelCall(Isolate isolate) async { |
| 155 Library lib = await isolate.rootLib.load(); | 155 Library lib = await isolate.rootLibrary.load(); |
| 156 ServiceFunction func = | 156 ServiceFunction func = |
| 157 lib.functions.singleWhere((f) => f.name == 'topLevelCall'); | 157 lib.functions.singleWhere((f) => f.name == 'topLevelCall'); |
| 158 Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData', | 158 Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData', |
| 159 { 'targetId': func.id }); | 159 { 'targetId': func.id }); |
| 160 expect(response['type'], equals('CodeCoverage')); | 160 expect(response['type'], equals('CodeCoverage')); |
| 161 Map callSite = response['coverage'].single['callSites'].single; | 161 Map callSite = response['coverage'].single['callSites'].single; |
| 162 expect(callSite['name'], equals('topLevelMethod')); | 162 expect(callSite['name'], equals('topLevelMethod')); |
| 163 expect(stringifyCacheEntries(callSite), | 163 expect(stringifyCacheEntries(callSite), |
| 164 equals(['call_site_data_test:10'].toSet())); | 164 equals(['call_site_data_test:10'].toSet())); |
| 165 } | 165 } |
| 166 | 166 |
| 167 testSuperCall(Isolate isolate) async { | 167 testSuperCall(Isolate isolate) async { |
| 168 Library lib = await isolate.rootLib.load(); | 168 Library lib = await isolate.rootLibrary.load(); |
| 169 Class cls = await lib.classes.singleWhere((f) => f.name == 'Sub').load(); | 169 Class cls = await lib.classes.singleWhere((f) => f.name == 'Sub').load(); |
| 170 ServiceFunction func = cls.functions.singleWhere((f) => f.name == 'bar'); | 170 ServiceFunction func = cls.functions.singleWhere((f) => f.name == 'bar'); |
| 171 Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData', | 171 Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData', |
| 172 { 'targetId': func.id }); | 172 { 'targetId': func.id }); |
| 173 expect(response['type'], equals('CodeCoverage')); | 173 expect(response['type'], equals('CodeCoverage')); |
| 174 Map callSite = response['coverage'].single['callSites'].single; | 174 Map callSite = response['coverage'].single['callSites'].single; |
| 175 expect(callSite['name'], equals('bar')); | 175 expect(callSite['name'], equals('bar')); |
| 176 expect(stringifyCacheEntries(callSite), | 176 expect(stringifyCacheEntries(callSite), |
| 177 equals(['Super:15'].toSet())); | 177 equals(['Super:15'].toSet())); |
| 178 } | 178 } |
| 179 | 179 |
| 180 var tests = [ | 180 var tests = [ |
| 181 testMonomorphic, | 181 testMonomorphic, |
| 182 testPolymorphic, | 182 testPolymorphic, |
| 183 testMegamorphic, | 183 testMegamorphic, |
| 184 testStaticCall, | 184 testStaticCall, |
| 185 testConstructorCall, | 185 testConstructorCall, |
| 186 testTopLevelCall, | 186 testTopLevelCall, |
| 187 testSuperCall ]; | 187 testSuperCall ]; |
| 188 | 188 |
| 189 main(args) => runIsolateTests(args, tests, testeeBefore: script); | 189 main(args) => runIsolateTests(args, tests, testeeBefore: script); |
| OLD | NEW |