blob: ca41a91b18fa591be1ef1c089204aabf2fef74e8 [file] [log] [blame]
// Copyright (c) 2017, 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=--profiler_native_memory
import 'package:observatory/sample_profile.dart';
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
import 'package:test/test.dart';
import 'test_helper.dart';
void verifyHelper(var root, bool exclusive) {
if (root.children.length == 0) {
return;
}
if (!(root is FunctionCallTreeNode)) {
print('${root.profileCode.code.name}');
} else {
print('${root.profileFunction.function.name}');
}
int inclusiveAllocations = 0;
int exclusiveAllocations = 0;
for (int i = 0; i < root.children.length; i++) {
inclusiveAllocations += root.children[i].inclusiveNativeAllocations as int;
exclusiveAllocations += root.children[i].exclusiveNativeAllocations as int;
}
int rootMemory;
if (exclusive) {
rootMemory = root.inclusiveNativeAllocations + exclusiveAllocations;
} else {
rootMemory =
root.inclusiveNativeAllocations - root.exclusiveNativeAllocations;
}
expect(inclusiveAllocations == rootMemory, isTrue);
for (int i = 0; i < root.children.length; i++) {
verifyHelper(root.children[i], exclusive);
}
}
void verify(var tree, bool exclusive) {
var node = tree.root;
expect(node, isNotNull);
expect(node.children.length >= 0, isTrue);
for (int i = 0; i < node.children.length; i++) {
verifyHelper(node.children[i], exclusive);
}
}
var tests = <VMTest>[
// Verify inclusive tries.
(VM vm) async {
var response =
await vm.invokeRpc('_getNativeAllocationSamples', {'_code': true})
as ServiceMap;
SampleProfile cpuProfile = new SampleProfile();
await cpuProfile.load(vm, response);
var codeTree = cpuProfile.loadCodeTree(M.ProfileTreeDirection.inclusive);
var functionTree =
cpuProfile.loadFunctionTree(M.ProfileTreeDirection.inclusive);
verify(codeTree, false);
verify(functionTree, false);
},
// Verify exclusive tries.
(VM vm) async {
var response =
await vm.invokeRpc('_getNativeAllocationSamples', {'_code': true})
as ServiceMap;
SampleProfile cpuProfile = new SampleProfile();
await cpuProfile.load(vm, response);
var codeTreeExclusive =
cpuProfile.loadCodeTree(M.ProfileTreeDirection.exclusive);
var functionTreeExclusive =
cpuProfile.loadFunctionTree(M.ProfileTreeDirection.exclusive);
verify(codeTreeExclusive, true);
verify(functionTreeExclusive, true);
}
];
main(args) async => runVMTests(args, tests);