blob: f78dcc59b4e544bbb27d731c59b3ed7a763dabf0 [file] [log] [blame]
// Copyright (c) 2015, 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.
import 'package:observatory/service_io.dart';
import 'package:unittest/unittest.dart';
import 'test_helper.dart';
class _TestClass {
_TestClass();
var x;
var y;
}
var target1 = new _TestClass();
var target2 = new _TestClass();
var target3 = new _TestClass();
var target4 = new _TestClass();
var target5 = new _TestClass();
var globalObject = new _TestClass();
var globalList = new List(100);
var globalMap1 = new Map();
var globalMap2 = new Map();
void warmup() {
globalObject.x = target1;
globalObject.y = target2;
globalList[12] = target3;
globalMap1['key'] = target4;
globalMap2[target5] = 'value';
}
eval(Isolate isolate, String expression) async {
Map params = {
'targetId': isolate.rootLibrary.id,
'expression': expression,
};
return await isolate.invokeRpcNoUpgrade('evaluate', params);
}
var tests = <IsolateTest>[
// simple path
(Isolate isolate) async {
var obj = await eval(isolate, 'globalObject');
var params = {
'targetId': obj['id'],
'limit': 100,
};
var result = await isolate.invokeRpcNoUpgrade('_getRetainingPath', params);
expect(result['elements'].length, equals(2));
expect(result['elements'][1]['value']['name'], equals('globalObject'));
},
// missing limit.
(Isolate isolate) async {
var obj = await eval(isolate, 'globalObject');
var params = {
'targetId': obj['id'],
};
bool caughtException;
try {
await isolate.invokeRpcNoUpgrade('_getRetainingPath', params);
expect(false, isTrue, reason: 'Unreachable');
} on ServerRpcException catch (e) {
caughtException = true;
expect(e.code, equals(ServerRpcException.kInvalidParams));
expect(e.data['details'],
"_getRetainingPath expects the \'limit\' parameter");
}
expect(caughtException, isTrue);
},
(Isolate isolate) async {
var target1 = await eval(
isolate, '() { var tmp = target1; target1 = null; return tmp;} ()');
var params = {
'targetId': target1['id'],
'limit': 100,
};
var result = await isolate.invokeRpcNoUpgrade('_getRetainingPath', params);
expect(result['type'], equals('RetainingPath'));
expect(result['elements'].length, equals(3));
expect(result['elements'][1]['parentField']['name'], equals('x'));
expect(result['elements'][2]['value']['name'], equals('globalObject'));
},
(Isolate isolate) async {
var target2 = await eval(
isolate, '() { var tmp = target2; target2 = null; return tmp;} ()');
var params = {
'targetId': target2['id'],
'limit': 100,
};
var result = await isolate.invokeRpcNoUpgrade('_getRetainingPath', params);
expect(result['type'], equals('RetainingPath'));
expect(result['elements'].length, equals(3));
expect(result['elements'][1]['parentField']['name'], equals('y'));
expect(result['elements'][2]['value']['name'], equals('globalObject'));
},
(Isolate isolate) async {
var target3 = await eval(
isolate, '() { var tmp = target3; target3 = null; return tmp;} ()');
var params = {
'targetId': target3['id'],
'limit': 100,
};
var result = await isolate.invokeRpcNoUpgrade('_getRetainingPath', params);
expect(result['type'], equals('RetainingPath'));
expect(result['elements'].length, equals(3));
expect(result['elements'][1]['parentListIndex'], equals(12));
expect(result['elements'][2]['value']['name'], equals('globalList'));
},
(Isolate isolate) async {
var target4 = await eval(
isolate, '() { var tmp = target4; target4 = null; return tmp;} ()');
var params = {
'targetId': target4['id'],
'limit': 100,
};
var result = await isolate.invokeRpcNoUpgrade('_getRetainingPath', params);
expect(result['type'], equals('RetainingPath'));
expect(result['elements'].length, equals(3));
expect(
result['elements'][1]['parentMapKey']['valueAsString'], equals('key'));
expect(result['elements'][2]['value']['name'], equals('globalMap1'));
},
(Isolate isolate) async {
var target5 = await eval(
isolate, '() { var tmp = target5; target5 = null; return tmp;} ()');
var params = {
'targetId': target5['id'],
'limit': 100,
};
var result = await isolate.invokeRpcNoUpgrade('_getRetainingPath', params);
expect(result['type'], equals('RetainingPath'));
expect(result['elements'].length, equals(3));
expect(result['elements'][1]['parentMapKey']['class']['name'],
equals('_TestClass'));
expect(result['elements'][2]['value']['name'], equals('globalMap2'));
}
];
main(args) async => runIsolateTests(args, tests, testeeBefore: warmup);