OLD | NEW |
(Empty) | |
| 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 |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 // VMOptions=--compile-all --error_on_bad_type --error_on_bad_override --checked |
| 5 |
| 6 library get_object_rpc_test; |
| 7 |
| 8 import 'dart:async'; |
| 9 |
| 10 import 'package:observatory/service_io.dart'; |
| 11 import 'package:unittest/unittest.dart'; |
| 12 |
| 13 import 'test_helper.dart'; |
| 14 |
| 15 class _DummyClass { |
| 16 static var dummyVar = 11; |
| 17 void dummyFunction() { |
| 18 } |
| 19 } |
| 20 |
| 21 class _DummySubClass extends _DummyClass { |
| 22 } |
| 23 |
| 24 void warmup() { |
| 25 new _DummyClass().dummyFunction(); |
| 26 } |
| 27 |
| 28 eval(Isolate isolate, String expression) async { |
| 29 Map params = { |
| 30 'targetId': isolate.rootLib.id, |
| 31 'expression': expression, |
| 32 }; |
| 33 return await isolate.invokeRpcNoUpgrade('eval', params); |
| 34 } |
| 35 |
| 36 var tests = [ |
| 37 // null object. |
| 38 (Isolate isolate) async { |
| 39 var params = { |
| 40 'objectId': 'objects/null', |
| 41 }; |
| 42 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 43 expect(result['type'], equals('null')); |
| 44 expect(result['id'], equals('objects/null')); |
| 45 expect(result['valueAsString'], equals('null')); |
| 46 expect(result['class']['type'], equals('@Class')); |
| 47 expect(result['class']['name'], equals('Null')); |
| 48 expect(result['size'], isPositive); |
| 49 }, |
| 50 |
| 51 // bool object. |
| 52 (Isolate isolate) async { |
| 53 var params = { |
| 54 'objectId': 'objects/bool-true', |
| 55 }; |
| 56 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 57 expect(result['type'], equals('bool')); |
| 58 expect(result['id'], equals('objects/bool-true')); |
| 59 expect(result['valueAsString'], equals('true')); |
| 60 expect(result['class']['type'], equals('@Class')); |
| 61 expect(result['class']['name'], equals('bool')); |
| 62 expect(result['size'], isPositive); |
| 63 expect(result['fields'], isEmpty); |
| 64 }, |
| 65 |
| 66 // int object. |
| 67 (Isolate isolate) async { |
| 68 var params = { |
| 69 'objectId': 'objects/int-123', |
| 70 }; |
| 71 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 72 expect(result['type'], equals('int')); |
| 73 expect(result['_vmType'], equals('Smi')); |
| 74 expect(result['id'], equals('objects/int-123')); |
| 75 expect(result['valueAsString'], equals('123')); |
| 76 expect(result['class']['type'], equals('@Class')); |
| 77 expect(result['class']['name'], equals('_Smi')); |
| 78 // TODO(turnidge): Should we return zero here instead? |
| 79 expect(result['size'], isNull); |
| 80 expect(result['fields'], isEmpty); |
| 81 }, |
| 82 |
| 83 // A general Dart object. |
| 84 (Isolate isolate) async { |
| 85 // Call eval to get a Dart list. |
| 86 var evalResult = await eval(isolate, '[3, 2, 1]'); |
| 87 var params = { |
| 88 'objectId': evalResult['id'], |
| 89 }; |
| 90 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 91 expect(result['type'], equals('List')); |
| 92 expect(result['_vmType'], equals('GrowableObjectArray')); |
| 93 expect(result['id'], startsWith('objects/')); |
| 94 expect(result['valueAsString'], isNull); |
| 95 expect(result['class']['type'], equals('@Class')); |
| 96 expect(result['class']['name'], equals('_GrowableList')); |
| 97 expect(result['size'], isPositive); |
| 98 expect(result['fields'], isEmpty); |
| 99 expect(result['elements'].length, equals(3)); |
| 100 expect(result['elements'][0]['index'], equals(0)); |
| 101 expect(result['elements'][0]['value']['type'], equals('@int')); |
| 102 expect(result['elements'][0]['value']['valueAsString'], equals('3')); |
| 103 }, |
| 104 |
| 105 // An expired object. |
| 106 (Isolate isolate) async { |
| 107 var params = { |
| 108 'objectId': 'objects/99999999', |
| 109 }; |
| 110 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 111 expect(result['type'], equals('Sentinel')); |
| 112 expect(result['id'], startsWith('objects/expired')); |
| 113 expect(result['valueAsString'], equals('<expired>')); |
| 114 expect(result['class'], isNull); |
| 115 expect(result['size'], isNull); |
| 116 }, |
| 117 |
| 118 // library. |
| 119 (Isolate isolate) async { |
| 120 var params = { |
| 121 'objectId': isolate.rootLib.id, |
| 122 }; |
| 123 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 124 expect(result['type'], equals('Library')); |
| 125 expect(result['id'], startsWith('libraries/')); |
| 126 expect(result['name'], equals('get_object_rpc_test')); |
| 127 expect(result['url'], startsWith('file:')); |
| 128 expect(result['url'], endsWith('get_object_rpc_test.dart')); |
| 129 expect(result['imports'].length, isPositive); |
| 130 expect(result['imports'][0]['type'], equals('@Library')); |
| 131 expect(result['scripts'].length, isPositive); |
| 132 expect(result['scripts'][0]['type'], equals('@Script')); |
| 133 expect(result['variables'].length, isPositive); |
| 134 expect(result['variables'][0]['type'], equals('@Field')); |
| 135 expect(result['functions'].length, isPositive); |
| 136 expect(result['functions'][0]['type'], equals('@Function')); |
| 137 expect(result['classes'].length, isPositive); |
| 138 expect(result['classes'][0]['type'], equals('@Class')); |
| 139 }, |
| 140 |
| 141 // invalid library. |
| 142 (Isolate isolate) async { |
| 143 var params = { |
| 144 'objectId': 'libraries/9999999', |
| 145 }; |
| 146 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 147 expect(result['type'], equals('Error')); |
| 148 expect(result['message'], startsWith('Unrecognized object id')); |
| 149 }, |
| 150 |
| 151 // script. |
| 152 (Isolate isolate) async { |
| 153 // Get the library first. |
| 154 var params = { |
| 155 'objectId': isolate.rootLib.id, |
| 156 }; |
| 157 var libResult = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 158 // Get the first script. |
| 159 params = { |
| 160 'objectId': libResult['scripts'][0]['id'], |
| 161 }; |
| 162 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 163 expect(result['type'], equals('Script')); |
| 164 expect(result['id'], startsWith('libraries/')); |
| 165 expect(result['name'], startsWith('file:')); |
| 166 expect(result['name'], endsWith('get_object_rpc_test.dart')); |
| 167 expect(result['kind'], equals('script')); |
| 168 expect(result['library']['type'], equals('@Library')); |
| 169 expect(result['source'], startsWith('// Copyright (c)')); |
| 170 expect(result['tokenPosTable'].length, isPositive); |
| 171 expect(result['tokenPosTable'][0], new isInstanceOf<List>()); |
| 172 expect(result['tokenPosTable'][0].length, isPositive); |
| 173 expect(result['tokenPosTable'][0][0], new isInstanceOf<int>()); |
| 174 }, |
| 175 |
| 176 // invalid script. |
| 177 (Isolate isolate) async { |
| 178 var params = { |
| 179 'objectId': 'scripts/9999999', |
| 180 }; |
| 181 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 182 expect(result['type'], equals('Error')); |
| 183 expect(result['message'], startsWith('Unrecognized object id')); |
| 184 }, |
| 185 |
| 186 // class |
| 187 (Isolate isolate) async { |
| 188 // Call eval to get a class id. |
| 189 var evalResult = await eval(isolate, 'new _DummyClass()'); |
| 190 var params = { |
| 191 'objectId': evalResult['class']['id'], |
| 192 }; |
| 193 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 194 expect(result['type'], equals('Class')); |
| 195 expect(result['id'], startsWith('classes/')); |
| 196 expect(result['name'], equals('_DummyClass')); |
| 197 expect(result['_vmName'], startsWith('_DummyClass@')); |
| 198 expect(result['abstract'], equals(false)); |
| 199 expect(result['const'], equals(false)); |
| 200 expect(result['finalized'], equals(true)); |
| 201 expect(result['implemented'], equals(false)); |
| 202 expect(result['patch'], equals(false)); |
| 203 expect(result['library']['type'], equals('@Library')); |
| 204 expect(result['script']['type'], equals('@Script')); |
| 205 expect(result['super']['type'], equals('@Class')); |
| 206 expect(result['interfaces'].length, isZero); |
| 207 expect(result['fields'].length, isPositive); |
| 208 expect(result['fields'][0]['type'], equals('@Field')); |
| 209 expect(result['functions'].length, isPositive); |
| 210 expect(result['functions'][0]['type'], equals('@Function')); |
| 211 expect(result['subclasses'].length, isPositive); |
| 212 expect(result['subclasses'][0]['type'], equals('@Class')); |
| 213 }, |
| 214 |
| 215 // invalid class. |
| 216 (Isolate isolate) async { |
| 217 var params = { |
| 218 'objectId': 'classes/9999999', |
| 219 }; |
| 220 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 221 expect(result['type'], equals('Error')); |
| 222 expect(result['message'], startsWith('Unrecognized object id')); |
| 223 }, |
| 224 |
| 225 // type. |
| 226 (Isolate isolate) async { |
| 227 // Call eval to get a class id. |
| 228 var evalResult = await eval(isolate, 'new _DummyClass()'); |
| 229 var id = "${evalResult['class']['id']}/types/0"; |
| 230 var params = { |
| 231 'objectId': id, |
| 232 }; |
| 233 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 234 expect(result['type'], equals('Type')); |
| 235 expect(result['id'], equals(id)); |
| 236 expect(result['class']['type'], equals('@Class')); |
| 237 expect(result['class']['name'], equals('_Type')); |
| 238 expect(result['size'], isPositive); |
| 239 expect(result['fields'], isEmpty); |
| 240 expect(result['typeClass']['type'], equals('@Class')); |
| 241 expect(result['typeClass']['name'], equals('_DummyClass')); |
| 242 }, |
| 243 |
| 244 // invalid type. |
| 245 (Isolate isolate) async { |
| 246 var evalResult = await eval(isolate, 'new _DummyClass()'); |
| 247 var id = "${evalResult['class']['id']}/types/9999999"; |
| 248 var params = { |
| 249 'objectId': id, |
| 250 }; |
| 251 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 252 expect(result['type'], equals('Error')); |
| 253 expect(result['message'], startsWith('Unrecognized object id')); |
| 254 }, |
| 255 |
| 256 // function. |
| 257 (Isolate isolate) async { |
| 258 // Call eval to get a class id. |
| 259 var evalResult = await eval(isolate, 'new _DummyClass()'); |
| 260 var id = "${evalResult['class']['id']}/functions/dummyFunction"; |
| 261 var params = { |
| 262 'objectId': id, |
| 263 }; |
| 264 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 265 expect(result['type'], equals('Function')); |
| 266 expect(result['id'], equals(id)); |
| 267 expect(result['name'], equals('dummyFunction')); |
| 268 expect(result['kind'], equals('RegularFunction')); |
| 269 expect(result['static'], equals(false)); |
| 270 expect(result['const'], equals(false)); |
| 271 expect(result['script']['type'], equals('@Script')); |
| 272 expect(result['tokenPos'], isPositive); |
| 273 expect(result['code']['type'], equals('@Code')); |
| 274 expect(result['_optimizable'], equals(true)); |
| 275 expect(result['_inlinable'], equals(true)); |
| 276 expect(result['_usageCounter'], isPositive); |
| 277 expect(result['_optimizedCallSiteCount'], isZero); |
| 278 expect(result['_deoptimizations'], isZero); |
| 279 }, |
| 280 |
| 281 // invalid function. |
| 282 (Isolate isolate) async { |
| 283 // Call eval to get a class id. |
| 284 var evalResult = await eval(isolate, 'new _DummyClass()'); |
| 285 var id = "${evalResult['class']['id']}/functions/invalid"; |
| 286 var params = { |
| 287 'objectId': id, |
| 288 }; |
| 289 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 290 expect(result['type'], equals('Error')); |
| 291 expect(result['message'], startsWith('Unrecognized object id')); |
| 292 }, |
| 293 |
| 294 // field |
| 295 (Isolate isolate) async { |
| 296 // Call eval to get a class id. |
| 297 var evalResult = await eval(isolate, 'new _DummyClass()'); |
| 298 var id = "${evalResult['class']['id']}/fields/0"; |
| 299 var params = { |
| 300 'objectId': id, |
| 301 }; |
| 302 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 303 expect(result['type'], equals('Field')); |
| 304 expect(result['id'], equals(id)); |
| 305 expect(result['name'], equals('dummyVar')); |
| 306 expect(result['value']['valueAsString'], equals('11')); |
| 307 expect(result['const'], equals(false)); |
| 308 expect(result['static'], equals(true)); |
| 309 expect(result['final'], equals(false)); |
| 310 expect(result['script']['type'], equals('@Script')); |
| 311 expect(result['tokenPos'], isPositive); |
| 312 expect(result['_guardNullable'], isNotNull); |
| 313 expect(result['_guardClass'], isNotNull); |
| 314 expect(result['_guardLength'], isNotNull); |
| 315 }, |
| 316 |
| 317 // invalid field. |
| 318 (Isolate isolate) async { |
| 319 // Call eval to get a class id. |
| 320 var evalResult = await eval(isolate, 'new _DummyClass()'); |
| 321 var id = "${evalResult['class']['id']}/fields/9999"; |
| 322 var params = { |
| 323 'objectId': id, |
| 324 }; |
| 325 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 326 expect(result['type'], equals('Error')); |
| 327 expect(result['message'], startsWith('Unrecognized object id')); |
| 328 }, |
| 329 |
| 330 // code. |
| 331 (Isolate isolate) async { |
| 332 // Call eval to get a class id. |
| 333 var evalResult = await eval(isolate, 'new _DummyClass()'); |
| 334 var funcId = "${evalResult['class']['id']}/functions/dummyFunction"; |
| 335 var params = { |
| 336 'objectId': funcId, |
| 337 }; |
| 338 var funcResult = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 339 params = { |
| 340 'objectId': funcResult['code']['id'], |
| 341 }; |
| 342 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 343 expect(result['type'], equals('Code')); |
| 344 expect(result['name'], equals('_DummyClass.dummyFunction')); |
| 345 expect(result['_vmName'], equals('dummyFunction')); |
| 346 expect(result['kind'], equals('Dart')); |
| 347 expect(result['_optimized'], new isInstanceOf<bool>()); |
| 348 expect(result['function']['type'], equals('@Function')); |
| 349 expect(result['_startAddress'], new isInstanceOf<String>()); |
| 350 expect(result['_endAddress'], new isInstanceOf<String>()); |
| 351 expect(result['_objectPool'], isNotNull); |
| 352 expect(result['_disassembly'], isNotNull); |
| 353 expect(result['_descriptors'], isNotNull); |
| 354 expect(result['_inlinedFunctions'], isNotNull); |
| 355 expect(result['_inlinedIntervals'], isNotNull); |
| 356 }, |
| 357 |
| 358 // invalid code. |
| 359 (Isolate isolate) async { |
| 360 // Call eval to get a class id. |
| 361 var params = { |
| 362 'objectId': 'code/0', |
| 363 }; |
| 364 var result = await isolate.invokeRpcNoUpgrade('getObject', params); |
| 365 expect(result['type'], equals('Error')); |
| 366 expect(result['message'], startsWith('Unrecognized object id')); |
| 367 }, |
| 368 ]; |
| 369 |
| 370 main(args) async => runIsolateTests(args, tests, testeeBefore:warmup); |
OLD | NEW |