blob: 7fa6e9b925991661a7ecfdba23e222d655e03395 [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=
// VMOptions=--use_compactor
import 'package:observatory/heap_snapshot.dart';
import 'package:observatory/models.dart' as M;
import 'package:observatory/service_io.dart';
import 'package:unittest/unittest.dart';
import 'test_helper.dart';
// small example from [Lenguaer & Tarjan 1979]
class R {
var x;
var y;
var z;
}
class A {
var x;
}
class B {
var x;
var y;
var z;
}
class C {
var x;
var y;
}
class D {
var x;
}
class E {
var x;
}
class F {
var x;
}
class G {
var x;
var y;
}
class H {
var x;
var y;
}
class I {
var x;
}
class J {
var x;
}
class K {
var x;
var y;
}
class L {
var x;
}
var r;
buildGraph() {
r = new R();
var a = new A();
var b = new B();
var c = new C();
var d = new D();
var e = new E();
var f = new F();
var g = new G();
var h = new H();
var i = new I();
var j = new J();
var k = new K();
var l = new L();
r.x = a;
r.y = b;
r.z = c;
a.x = d;
b.x = a;
b.y = d;
b.z = e;
c.x = f;
c.y = g;
d.x = l;
e.x = h;
f.x = i;
g.x = i;
g.y = j;
h.x = e;
h.y = k;
i.x = k;
j.x = i;
k.x = i;
k.y = r;
l.x = h;
}
var tests = <IsolateTest>[
(Isolate isolate) async {
final Library rootLib = await isolate.rootLibrary.load();
final raw =
await isolate.fetchHeapSnapshot(M.HeapSnapshotRoots.vm, false).last;
final snapshot = new HeapSnapshot();
await snapshot.loadProgress(isolate, raw).last;
node(String className) {
var cls = rootLib.classes.singleWhere((cls) => cls.name == className);
return snapshot.graph.vertices.singleWhere((v) => v.vmCid == cls.vmCid);
}
expect(node('I').dominator, equals(node('R')));
expect(node('K').dominator, equals(node('R')));
expect(node('C').dominator, equals(node('R')));
expect(node('H').dominator, equals(node('R')));
expect(node('E').dominator, equals(node('R')));
expect(node('A').dominator, equals(node('R')));
expect(node('D').dominator, equals(node('R')));
expect(node('B').dominator, equals(node('R')));
expect(node('F').dominator, equals(node('C')));
expect(node('G').dominator, equals(node('C')));
expect(node('J').dominator, equals(node('G')));
expect(node('L').dominator, equals(node('D')));
expect(node('R'), isNotNull); // The field.
},
];
main(args) => runIsolateTests(args, tests, testeeBefore: buildGraph);