blob: 6d7b8fd45e520143156770a3b7efa4f7f7d8bdff [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.
// VMOptions=--error_on_bad_type --error_on_bad_override
import 'dart:async';
import 'package:observatory/service_io.dart';
import 'package:unittest/unittest.dart';
import 'test_helper.dart';
Future sleep(int milliseconds) {
Completer completer = new Completer();
Duration duration = new Duration(milliseconds: milliseconds);
new Timer(duration, () => completer.complete() );
return completer.future;
}
var tests = [
(Isolate isolate) async {
var params = {
};
var result = await isolate.invokeRpcNoUpgrade(
'_getAllocationProfile', params);
expect(result['type'], equals('AllocationProfile'));
expect(result.containsKey('dateLastAccumulatorReset'), isFalse);
expect(result.containsKey('dateLastServiceGC'), isFalse);
expect(result['heaps'].length, isPositive);
expect(result['heaps']['new']['type'], equals('HeapSpace'));
expect(result['heaps']['old']['type'], equals('HeapSpace'));
expect(result['members'].length, isPositive);
expect(result['members'][0]['type'], equals('ClassHeapStats'));
// reset.
params = {
'reset' : 'true',
};
result = await isolate.invokeRpcNoUpgrade('_getAllocationProfile', params);
expect(result['type'], equals('AllocationProfile'));
var firstReset = result['dateLastAccumulatorReset'];
expect(firstReset, new isInstanceOf<String>());
expect(result.containsKey('dateLastServiceGC'), isFalse);
expect(result['heaps'].length, isPositive);
expect(result['heaps']['new']['type'], equals('HeapSpace'));
expect(result['heaps']['old']['type'], equals('HeapSpace'));
expect(result['members'].length, isPositive);
expect(result['members'][0]['type'], equals('ClassHeapStats'));
await sleep(1000);
result = await isolate.invokeRpcNoUpgrade('_getAllocationProfile', params);
var secondReset = result['dateLastAccumulatorReset'];
expect(secondReset, isNot(equals(firstReset)));
// gc.
params = {
'gc' : 'full',
};
result = await isolate.invokeRpcNoUpgrade('_getAllocationProfile', params);
expect(result['type'], equals('AllocationProfile'));
expect(result['dateLastAccumulatorReset'], equals(secondReset));
var firstGC = result['dateLastServiceGC'];
expect(firstGC, new isInstanceOf<String>());
expect(result['heaps'].length, isPositive);
expect(result['heaps']['new']['type'], equals('HeapSpace'));
expect(result['heaps']['old']['type'], equals('HeapSpace'));
expect(result['members'].length, isPositive);
expect(result['members'][0]['type'], equals('ClassHeapStats'));
await sleep(1000);
result = await isolate.invokeRpcNoUpgrade('_getAllocationProfile', params);
var secondGC = result['dateLastAccumulatorReset'];
expect(secondGC, isNot(equals(firstGC)));
},
(Isolate isolate) async {
var params = {
'reset' : 'banana',
};
bool caughtException;
try {
await isolate.invokeRpcNoUpgrade('_getAllocationProfile', params);
expect(false, isTrue, reason:'Unreachable');
} on ServerRpcException catch (e) {
caughtException = true;
expect(e.code, equals(ServerRpcException.kInvalidParams));
expect(e.data['details'],
"_getAllocationProfile: invalid \'reset\' parameter: banana");
}
expect(caughtException, isTrue);
},
(Isolate isolate) async {
var params = {
'gc' : 'banana',
};
bool caughtException;
try {
await isolate.invokeRpcNoUpgrade(
'_getAllocationProfile', params);
expect(false, isTrue, reason:'Unreachable');
} on ServerRpcException catch (e) {
caughtException = true;
expect(e.code, equals(ServerRpcException.kInvalidParams));
expect(e.data['details'],
"_getAllocationProfile: invalid \'gc\' parameter: banana");
}
expect(caughtException, isTrue);
},
];
main(args) async => runIsolateTests(args, tests);