// 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.
// VMOptions=--error_on_bad_type --error_on_bad_override

library get_object_rpc_test;

import 'dart:typed_data';
import 'dart:convert' show base64Decode;
import 'package:observatory/service_io.dart';
import 'package:unittest/unittest.dart';
import 'service_test_common.dart';
import 'test_helper.dart';

class _DummyClass {
  static var dummyVar = 11;
  void dummyFunction() {}
}

class _DummySubClass extends _DummyClass {}

void warmup() {
  // Silence analyzer.
  new _DummySubClass();
  new _DummyClass().dummyFunction();
}

eval(Isolate isolate, String expression) async {
  Map params = {
    'targetId': isolate.rootLibrary.id,
    'expression': expression,
  };
  return await isolate.invokeRpcNoUpgrade('evaluate', params);
}

var uint8List = new Uint8List.fromList([3, 2, 1]);
var uint64List = new Uint64List.fromList([3, 2, 1]);

var tests = <IsolateTest>[
  // null object.
  (Isolate isolate) async {
    var params = {
      'objectId': 'objects/null',
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('Null'));
    expect(result['id'], equals('objects/null'));
    expect(result['valueAsString'], equals('null'));
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('Null'));
    expect(result['size'], isPositive);
  },

  // bool object.
  (Isolate isolate) async {
    var params = {
      'objectId': 'objects/bool-true',
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('Bool'));
    expect(result['id'], equals('objects/bool-true'));
    expect(result['valueAsString'], equals('true'));
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('bool'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
  },

  // int object.
  (Isolate isolate) async {
    var params = {
      'objectId': 'objects/int-123',
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('Int'));
    expect(result['_vmType'], equals('Smi'));
    expect(result['id'], equals('objects/int-123'));
    expect(result['valueAsString'], equals('123'));
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_Smi'));
    expect(result['size'], isZero);
    expect(result['fields'], isEmpty);
  },

  // A string
  (Isolate isolate) async {
    // Call eval to get a Dart list.
    var evalResult = await eval(isolate, '"Chattanooga"');
    var params = {
      'objectId': evalResult['id'],
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('String'));
    expect(result['_vmType'], equals('String'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], equals('Chattanooga'));
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_OneByteString'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(11));
    expect(result['offset'], isNull);
    expect(result['count'], isNull);
  },

  // String prefix.
  (Isolate isolate) async {
    // Call eval to get a Dart list.
    var evalResult = await eval(isolate, '"Chattanooga"');
    var params = {
      'objectId': evalResult['id'],
      'count': 4,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('String'));
    expect(result['_vmType'], equals('String'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], equals('Chat'));
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_OneByteString'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(11));
    expect(result['offset'], isNull);
    expect(result['count'], equals(4));
  },

  // String subrange.
  (Isolate isolate) async {
    // Call eval to get a Dart list.
    var evalResult = await eval(isolate, '"Chattanooga"');
    var params = {
      'objectId': evalResult['id'],
      'offset': 4,
      'count': 6,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('String'));
    expect(result['_vmType'], equals('String'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], equals('tanoog'));
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_OneByteString'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(11));
    expect(result['offset'], equals(4));
    expect(result['count'], equals(6));
  },

  // String with wacky offset.
  (Isolate isolate) async {
    // Call eval to get a Dart list.
    var evalResult = await eval(isolate, '"Chattanooga"');
    var params = {
      'objectId': evalResult['id'],
      'offset': 100,
      'count': 2,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('String'));
    expect(result['_vmType'], equals('String'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], equals(''));
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_OneByteString'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(11));
    expect(result['offset'], equals(11));
    expect(result['count'], equals(0));
  },

  // A built-in List.
  (Isolate isolate) async {
    // Call eval to get a Dart list.
    var evalResult = await eval(isolate, '[3, 2, 1]');
    var params = {
      'objectId': evalResult['id'],
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('List'));
    expect(result['_vmType'], equals('GrowableObjectArray'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], isNull);
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_GrowableList'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(3));
    expect(result['offset'], isNull);
    expect(result['count'], isNull);
    expect(result['elements'].length, equals(3));
    expect(result['elements'][0]['type'], equals('@Instance'));
    expect(result['elements'][0]['kind'], equals('Int'));
    expect(result['elements'][0]['valueAsString'], equals('3'));
    expect(result['elements'][1]['type'], equals('@Instance'));
    expect(result['elements'][1]['kind'], equals('Int'));
    expect(result['elements'][1]['valueAsString'], equals('2'));
    expect(result['elements'][2]['type'], equals('@Instance'));
    expect(result['elements'][2]['kind'], equals('Int'));
    expect(result['elements'][2]['valueAsString'], equals('1'));
  },

  // List prefix.
  (Isolate isolate) async {
    // Call eval to get a Dart list.
    var evalResult = await eval(isolate, '[3, 2, 1]');
    var params = {
      'objectId': evalResult['id'],
      'count': 2,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('List'));
    expect(result['_vmType'], equals('GrowableObjectArray'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], isNull);
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_GrowableList'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(3));
    expect(result['offset'], isNull);
    expect(result['count'], equals(2));
    expect(result['elements'].length, equals(2));
    expect(result['elements'][0]['type'], equals('@Instance'));
    expect(result['elements'][0]['kind'], equals('Int'));
    expect(result['elements'][0]['valueAsString'], equals('3'));
    expect(result['elements'][1]['type'], equals('@Instance'));
    expect(result['elements'][1]['kind'], equals('Int'));
    expect(result['elements'][1]['valueAsString'], equals('2'));
  },

  // List suffix.
  (Isolate isolate) async {
    // Call eval to get a Dart list.
    var evalResult = await eval(isolate, '[3, 2, 1]');
    var params = {
      'objectId': evalResult['id'],
      'offset': 2,
      'count': 2,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('List'));
    expect(result['_vmType'], equals('GrowableObjectArray'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], isNull);
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_GrowableList'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(3));
    expect(result['offset'], equals(2));
    expect(result['count'], equals(1));
    expect(result['elements'].length, equals(1));
    expect(result['elements'][0]['type'], equals('@Instance'));
    expect(result['elements'][0]['kind'], equals('Int'));
    expect(result['elements'][0]['valueAsString'], equals('1'));
  },

  // List with wacky offset.
  (Isolate isolate) async {
    // Call eval to get a Dart list.
    var evalResult = await eval(isolate, '[3, 2, 1]');
    var params = {
      'objectId': evalResult['id'],
      'offset': 100,
      'count': 2,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('List'));
    expect(result['_vmType'], equals('GrowableObjectArray'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], isNull);
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_GrowableList'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(3));
    expect(result['offset'], equals(3));
    expect(result['count'], equals(0));
    expect(result['elements'], isEmpty);
  },

  // A built-in Map.
  (Isolate isolate) async {
    // Call eval to get a Dart map.
    var evalResult = await eval(isolate, '{"x": 3, "y": 4, "z": 5}');
    var params = {
      'objectId': evalResult['id'],
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('Map'));
    expect(result['_vmType'], equals('LinkedHashMap'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], isNull);
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_InternalLinkedHashMap'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(3));
    expect(result['offset'], isNull);
    expect(result['count'], isNull);
    expect(result['associations'].length, equals(3));
    expect(result['associations'][0]['key']['type'], equals('@Instance'));
    expect(result['associations'][0]['key']['kind'], equals('String'));
    expect(result['associations'][0]['key']['valueAsString'], equals('x'));
    expect(result['associations'][0]['value']['type'], equals('@Instance'));
    expect(result['associations'][0]['value']['kind'], equals('Int'));
    expect(result['associations'][0]['value']['valueAsString'], equals('3'));
    expect(result['associations'][1]['key']['type'], equals('@Instance'));
    expect(result['associations'][1]['key']['kind'], equals('String'));
    expect(result['associations'][1]['key']['valueAsString'], equals('y'));
    expect(result['associations'][1]['value']['type'], equals('@Instance'));
    expect(result['associations'][1]['value']['kind'], equals('Int'));
    expect(result['associations'][1]['value']['valueAsString'], equals('4'));
    expect(result['associations'][2]['key']['type'], equals('@Instance'));
    expect(result['associations'][2]['key']['kind'], equals('String'));
    expect(result['associations'][2]['key']['valueAsString'], equals('z'));
    expect(result['associations'][2]['value']['type'], equals('@Instance'));
    expect(result['associations'][2]['value']['kind'], equals('Int'));
    expect(result['associations'][2]['value']['valueAsString'], equals('5'));
  },

  // Map prefix.
  (Isolate isolate) async {
    // Call eval to get a Dart map.
    var evalResult = await eval(isolate, '{"x": 3, "y": 4, "z": 5}');
    var params = {
      'objectId': evalResult['id'],
      'count': 2,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('Map'));
    expect(result['_vmType'], equals('LinkedHashMap'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], isNull);
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_InternalLinkedHashMap'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(3));
    expect(result['offset'], isNull);
    expect(result['count'], equals(2));
    expect(result['associations'].length, equals(2));
    expect(result['associations'][0]['key']['type'], equals('@Instance'));
    expect(result['associations'][0]['key']['kind'], equals('String'));
    expect(result['associations'][0]['key']['valueAsString'], equals('x'));
    expect(result['associations'][0]['value']['type'], equals('@Instance'));
    expect(result['associations'][0]['value']['kind'], equals('Int'));
    expect(result['associations'][0]['value']['valueAsString'], equals('3'));
    expect(result['associations'][1]['key']['type'], equals('@Instance'));
    expect(result['associations'][1]['key']['kind'], equals('String'));
    expect(result['associations'][1]['key']['valueAsString'], equals('y'));
    expect(result['associations'][1]['value']['type'], equals('@Instance'));
    expect(result['associations'][1]['value']['kind'], equals('Int'));
    expect(result['associations'][1]['value']['valueAsString'], equals('4'));
  },

  // Map suffix.
  (Isolate isolate) async {
    // Call eval to get a Dart map.
    var evalResult = await eval(isolate, '{"x": 3, "y": 4, "z": 5}');
    var params = {
      'objectId': evalResult['id'],
      'offset': 2,
      'count': 2,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('Map'));
    expect(result['_vmType'], equals('LinkedHashMap'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], isNull);
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_InternalLinkedHashMap'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(3));
    expect(result['offset'], equals(2));
    expect(result['count'], equals(1));
    expect(result['associations'].length, equals(1));
    expect(result['associations'][0]['key']['type'], equals('@Instance'));
    expect(result['associations'][0]['key']['kind'], equals('String'));
    expect(result['associations'][0]['key']['valueAsString'], equals('z'));
    expect(result['associations'][0]['value']['type'], equals('@Instance'));
    expect(result['associations'][0]['value']['kind'], equals('Int'));
    expect(result['associations'][0]['value']['valueAsString'], equals('5'));
  },

  // Map with wacky offset
  (Isolate isolate) async {
    // Call eval to get a Dart map.
    var evalResult = await eval(isolate, '{"x": 3, "y": 4, "z": 5}');
    var params = {
      'objectId': evalResult['id'],
      'offset': 100,
      'count': 2,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('Map'));
    expect(result['_vmType'], equals('LinkedHashMap'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], isNull);
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_InternalLinkedHashMap'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(3));
    expect(result['offset'], equals(3));
    expect(result['count'], equals(0));
    expect(result['associations'], isEmpty);
  },

  // Uint8List.
  (Isolate isolate) async {
    // Call eval to get a Dart list.
    var evalResult = await eval(isolate, 'uint8List');
    var params = {
      'objectId': evalResult['id'],
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('Uint8List'));
    expect(result['_vmType'], equals('TypedData'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], isNull);
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_Uint8List'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(3));
    expect(result['offset'], isNull);
    expect(result['count'], isNull);
    expect(result['bytes'], equals('AwIB'));
    Uint8List bytes = base64Decode(result['bytes']);
    expect(bytes.buffer.asUint8List().toString(), equals('[3, 2, 1]'));
  },

  // Uint8List prefix.
  (Isolate isolate) async {
    // Call eval to get a Dart list.
    var evalResult = await eval(isolate, 'uint8List');
    var params = {
      'objectId': evalResult['id'],
      'count': 2,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('Uint8List'));
    expect(result['_vmType'], equals('TypedData'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], isNull);
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_Uint8List'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(3));
    expect(result['offset'], isNull);
    expect(result['count'], equals(2));
    expect(result['bytes'], equals('AwI='));
    Uint8List bytes = base64Decode(result['bytes']);
    expect(bytes.buffer.asUint8List().toString(), equals('[3, 2]'));
  },

  // Uint8List suffix.
  (Isolate isolate) async {
    // Call eval to get a Dart list.
    var evalResult = await eval(isolate, 'uint8List');
    var params = {
      'objectId': evalResult['id'],
      'offset': 2,
      'count': 2,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('Uint8List'));
    expect(result['_vmType'], equals('TypedData'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], isNull);
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_Uint8List'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(3));
    expect(result['offset'], equals(2));
    expect(result['count'], equals(1));
    expect(result['bytes'], equals('AQ=='));
    Uint8List bytes = base64Decode(result['bytes']);
    expect(bytes.buffer.asUint8List().toString(), equals('[1]'));
  },

  // Uint8List with wacky offset.
  (Isolate isolate) async {
    // Call eval to get a Dart list.
    var evalResult = await eval(isolate, 'uint8List');
    var params = {
      'objectId': evalResult['id'],
      'offset': 100,
      'count': 2,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('Uint8List'));
    expect(result['_vmType'], equals('TypedData'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], isNull);
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_Uint8List'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(3));
    expect(result['offset'], equals(3));
    expect(result['count'], equals(0));
    expect(result['bytes'], equals(''));
  },

  // Uint64List.
  (Isolate isolate) async {
    // Call eval to get a Dart list.
    var evalResult = await eval(isolate, 'uint64List');
    var params = {
      'objectId': evalResult['id'],
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('Uint64List'));
    expect(result['_vmType'], equals('TypedData'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], isNull);
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_Uint64List'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(3));
    expect(result['offset'], isNull);
    expect(result['count'], isNull);
    expect(result['bytes'], equals('AwAAAAAAAAACAAAAAAAAAAEAAAAAAAAA'));
    Uint8List bytes = base64Decode(result['bytes']);
    expect(bytes.buffer.asUint64List().toString(), equals('[3, 2, 1]'));
  },

  // Uint64List prefix.
  (Isolate isolate) async {
    // Call eval to get a Dart list.
    var evalResult = await eval(isolate, 'uint64List');
    var params = {
      'objectId': evalResult['id'],
      'count': 2,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('Uint64List'));
    expect(result['_vmType'], equals('TypedData'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], isNull);
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_Uint64List'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(3));
    expect(result['offset'], isNull);
    expect(result['count'], equals(2));
    expect(result['bytes'], equals('AwAAAAAAAAACAAAAAAAAAA=='));
    Uint8List bytes = base64Decode(result['bytes']);
    expect(bytes.buffer.asUint64List().toString(), equals('[3, 2]'));
  },

  // Uint64List suffix.
  (Isolate isolate) async {
    // Call eval to get a Dart list.
    var evalResult = await eval(isolate, 'uint64List');
    var params = {
      'objectId': evalResult['id'],
      'offset': 2,
      'count': 2,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('Uint64List'));
    expect(result['_vmType'], equals('TypedData'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], isNull);
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_Uint64List'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(3));
    expect(result['offset'], equals(2));
    expect(result['count'], equals(1));
    expect(result['bytes'], equals('AQAAAAAAAAA='));
    Uint8List bytes = base64Decode(result['bytes']);
    expect(bytes.buffer.asUint64List().toString(), equals('[1]'));
  },

  // Uint64List with wacky offset.
  (Isolate isolate) async {
    // Call eval to get a Dart list.
    var evalResult = await eval(isolate, 'uint64List');
    var params = {
      'objectId': evalResult['id'],
      'offset': 100,
      'count': 2,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('Uint64List'));
    expect(result['_vmType'], equals('TypedData'));
    expect(result['id'], startsWith('objects/'));
    expect(result['valueAsString'], isNull);
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_Uint64List'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['length'], equals(3));
    expect(result['offset'], equals(3));
    expect(result['count'], equals(0));
    expect(result['bytes'], equals(''));
  },

  // An expired object.
  (Isolate isolate) async {
    var params = {
      'objectId': 'objects/99999999',
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Sentinel'));
    expect(result['kind'], startsWith('Expired'));
    expect(result['valueAsString'], equals('<expired>'));
    expect(result['class'], isNull);
    expect(result['size'], isNull);
  },

  // library.
  (Isolate isolate) async {
    var params = {
      'objectId': isolate.rootLibrary.id,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Library'));
    expect(result['id'], startsWith('libraries/'));
    expect(result['name'], equals('get_object_rpc_test'));
    expect(result['uri'], startsWith('file:'));
    expect(result['uri'], endsWith('get_object_rpc_test.dart'));
    expect(result['debuggable'], equals(true));
    expect(result['dependencies'].length, isPositive);
    expect(result['dependencies'][0]['target']['type'], equals('@Library'));
    expect(result['scripts'].length, isPositive);
    expect(result['scripts'][0]['type'], equals('@Script'));
    expect(result['variables'].length, isPositive);
    expect(result['variables'][0]['type'], equals('@Field'));
    expect(result['functions'].length, isPositive);
    expect(result['functions'][0]['type'], equals('@Function'));
    expect(result['classes'].length, isPositive);
    expect(result['classes'][0]['type'], equals('@Class'));
  },

  // invalid library.
  (Isolate isolate) async {
    var params = {
      'objectId': 'libraries/9999999',
    };
    bool caughtException;
    try {
      await isolate.invokeRpcNoUpgrade('getObject', params);
      expect(false, isTrue, reason: 'Unreachable');
    } on ServerRpcException catch (e) {
      caughtException = true;
      expect(e.code, equals(ServerRpcException.kInvalidParams));
      expect(e.message,
          "getObject: invalid 'objectId' parameter: libraries/9999999");
    }
    expect(caughtException, isTrue);
  },

  // script.
  (Isolate isolate) async {
    // Get the library first.
    var params = {
      'objectId': isolate.rootLibrary.id,
    };
    var libResult = await isolate.invokeRpcNoUpgrade('getObject', params);
    // Get the first script.
    params = {
      'objectId': libResult['scripts'][0]['id'],
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Script'));
    expect(result['id'], startsWith('libraries/'));
    expect(result['uri'], startsWith('file:'));
    expect(result['uri'], endsWith('get_object_rpc_test.dart'));
    expect(result['_kind'], equals(ifKernel('kernel', 'script')));
    expect(result['library']['type'], equals('@Library'));
    expect(result['source'], startsWith('// Copyright (c)'));
    expect(result['tokenPosTable'].length, isPositive);
    expect(result['tokenPosTable'][0], new isInstanceOf<List>());
    expect(result['tokenPosTable'][0].length, isPositive);
    expect(result['tokenPosTable'][0][0], new isInstanceOf<int>());
  },

  // invalid script.
  (Isolate isolate) async {
    var params = {
      'objectId': 'scripts/9999999',
    };
    bool caughtException;
    try {
      await isolate.invokeRpcNoUpgrade('getObject', params);
      expect(false, isTrue, reason: 'Unreachable');
    } on ServerRpcException catch (e) {
      caughtException = true;
      expect(e.code, equals(ServerRpcException.kInvalidParams));
      expect(e.message,
          "getObject: invalid 'objectId' parameter: scripts/9999999");
    }
    expect(caughtException, isTrue);
  },

  // class
  (Isolate isolate) async {
    // Call eval to get a class id.
    var evalResult = await eval(isolate, 'new _DummyClass()');
    var params = {
      'objectId': evalResult['class']['id'],
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Class'));
    expect(result['id'], startsWith('classes/'));
    expect(result['name'], equals('_DummyClass'));
    expect(result['_vmName'], startsWith('_DummyClass@'));
    expect(result['abstract'], equals(false));
    expect(result['const'], equals(false));
    expect(result['_finalized'], equals(true));
    expect(result['_implemented'], equals(false));
    expect(result['_patch'], equals(false));
    expect(result['library']['type'], equals('@Library'));
    expect(result['location']['type'], equals('SourceLocation'));
    expect(result['super']['type'], equals('@Class'));
    expect(result['interfaces'].length, isZero);
    expect(result['fields'].length, isPositive);
    expect(result['fields'][0]['type'], equals('@Field'));
    expect(result['functions'].length, isPositive);
    expect(result['functions'][0]['type'], equals('@Function'));
    expect(result['subclasses'].length, isPositive);
    expect(result['subclasses'][0]['type'], equals('@Class'));
  },

  // invalid class.
  (Isolate isolate) async {
    var params = {
      'objectId': 'classes/9999999',
    };
    bool caughtException;
    try {
      await isolate.invokeRpcNoUpgrade('getObject', params);
      expect(false, isTrue, reason: 'Unreachable');
    } on ServerRpcException catch (e) {
      caughtException = true;
      expect(e.code, equals(ServerRpcException.kInvalidParams));
      expect(e.message,
          "getObject: invalid 'objectId' parameter: classes/9999999");
    }
    expect(caughtException, isTrue);
  },

  // type.
  (Isolate isolate) async {
    // Call eval to get a class id.
    var evalResult = await eval(isolate, 'new _DummyClass()');
    var id = "${evalResult['class']['id']}/types/0";
    var params = {
      'objectId': id,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Instance'));
    expect(result['kind'], equals('Type'));
    expect(result['id'], equals(id));
    expect(result['class']['type'], equals('@Class'));
    expect(result['class']['name'], equals('_Type'));
    expect(result['size'], isPositive);
    expect(result['fields'], isEmpty);
    expect(result['typeClass']['type'], equals('@Class'));
    expect(result['typeClass']['name'], equals('_DummyClass'));
  },

  // invalid type.
  (Isolate isolate) async {
    var evalResult = await eval(isolate, 'new _DummyClass()');
    var id = "${evalResult['class']['id']}/types/9999999";
    var params = {
      'objectId': id,
    };
    bool caughtException;
    try {
      await isolate.invokeRpcNoUpgrade('getObject', params);
      expect(false, isTrue, reason: 'Unreachable');
    } on ServerRpcException catch (e) {
      caughtException = true;
      expect(e.code, equals(ServerRpcException.kInvalidParams));
      expect(
          e.message, startsWith("getObject: invalid 'objectId' parameter: "));
    }
    expect(caughtException, isTrue);
  },

  // function.
  (Isolate isolate) async {
    // Call eval to get a class id.
    var evalResult = await eval(isolate, 'new _DummyClass()');
    var id = "${evalResult['class']['id']}/functions/dummyFunction";
    var params = {
      'objectId': id,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Function'));
    expect(result['id'], equals(id));
    expect(result['name'], equals('dummyFunction'));
    expect(result['_kind'], equals('RegularFunction'));
    expect(result['static'], equals(false));
    expect(result['const'], equals(false));
    expect(result['location']['type'], equals('SourceLocation'));
    expect(result['code']['type'], equals('@Code'));
    expect(result['_optimizable'], equals(true));
    expect(result['_inlinable'], equals(true));
    expect(result['_usageCounter'], isPositive);
    expect(result['_optimizedCallSiteCount'], isZero);
    expect(result['_deoptimizations'], isZero);
  },

  // invalid function.
  (Isolate isolate) async {
    // Call eval to get a class id.
    var evalResult = await eval(isolate, 'new _DummyClass()');
    var id = "${evalResult['class']['id']}/functions/invalid";
    var params = {
      'objectId': id,
    };
    bool caughtException;
    try {
      await isolate.invokeRpcNoUpgrade('getObject', params);
      expect(false, isTrue, reason: 'Unreachable');
    } on ServerRpcException catch (e) {
      caughtException = true;
      expect(e.code, equals(ServerRpcException.kInvalidParams));
      expect(
          e.message, startsWith("getObject: invalid 'objectId' parameter: "));
    }
    expect(caughtException, isTrue);
  },

  // field
  (Isolate isolate) async {
    // Call eval to get a class id.
    var evalResult = await eval(isolate, 'new _DummyClass()');
    var id = "${evalResult['class']['id']}/fields/dummyVar";
    var params = {
      'objectId': id,
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Field'));
    expect(result['id'], equals(id));
    expect(result['name'], equals('dummyVar'));
    expect(result['const'], equals(false));
    expect(result['static'], equals(true));
    expect(result['final'], equals(false));
    expect(result['location']['type'], equals('SourceLocation'));
    expect(result['staticValue']['valueAsString'], equals('11'));
    expect(result['_guardNullable'], isNotNull);
    expect(result['_guardClass'], isNotNull);
    expect(result['_guardLength'], isNotNull);
  },

  // invalid field.
  (Isolate isolate) async {
    // Call eval to get a class id.
    var evalResult = await eval(isolate, 'new _DummyClass()');
    var id = "${evalResult['class']['id']}/fields/mythicalField";
    var params = {
      'objectId': id,
    };
    bool caughtException;
    try {
      await isolate.invokeRpcNoUpgrade('getObject', params);
      expect(false, isTrue, reason: 'Unreachable');
    } on ServerRpcException catch (e) {
      caughtException = true;
      expect(e.code, equals(ServerRpcException.kInvalidParams));
      expect(
          e.message, startsWith("getObject: invalid 'objectId' parameter: "));
    }
    expect(caughtException, isTrue);
  },

  // code.
  (Isolate isolate) async {
    // Call eval to get a class id.
    var evalResult = await eval(isolate, 'new _DummyClass()');
    var funcId = "${evalResult['class']['id']}/functions/dummyFunction";
    var params = {
      'objectId': funcId,
    };
    var funcResult = await isolate.invokeRpcNoUpgrade('getObject', params);
    params = {
      'objectId': funcResult['code']['id'],
    };
    var result = await isolate.invokeRpcNoUpgrade('getObject', params);
    expect(result['type'], equals('Code'));
    expect(result['name'], equals('_DummyClass.dummyFunction'));
    expect(result['_vmName'], equals('dummyFunction'));
    expect(result['kind'], equals('Dart'));
    expect(result['_optimized'], new isInstanceOf<bool>());
    expect(result['function']['type'], equals('@Function'));
    expect(result['_startAddress'], new isInstanceOf<String>());
    expect(result['_endAddress'], new isInstanceOf<String>());
    expect(result['_objectPool'], isNotNull);
    expect(result['_disassembly'], isNotNull);
    expect(result['_descriptors'], isNotNull);
    expect(
        result['_inlinedFunctions'], anyOf([isNull, new isInstanceOf<List>()]));
    expect(
        result['_inlinedIntervals'], anyOf([isNull, new isInstanceOf<List>()]));
  },

  // invalid code.
  (Isolate isolate) async {
    var params = {
      'objectId': 'code/0',
    };
    bool caughtException;
    try {
      await isolate.invokeRpcNoUpgrade('getObject', params);
      expect(false, isTrue, reason: 'Unreachable');
    } on ServerRpcException catch (e) {
      caughtException = true;
      expect(e.code, equals(ServerRpcException.kInvalidParams));
      expect(e.message, "getObject: invalid 'objectId' parameter: code/0");
    }
    expect(caughtException, isTrue);
  },
];

main(args) async => runIsolateTests(args, tests, testeeBefore: warmup);
