| OLD | NEW | 
|---|
|  | (Empty) | 
| 1 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file |  | 
| 2 // for details. All rights reserved. Use of this source code is governed by a |  | 
| 3 // BSD-style license that can be found in the LICENSE file. |  | 
| 4 // VMOptions=--compile-all --error_on_bad_type --error_on_bad_override --checked |  | 
| 5 |  | 
| 6 import 'dart:async'; |  | 
| 7 import 'package:observatory/object_graph.dart'; |  | 
| 8 import 'package:observatory/service_io.dart'; |  | 
| 9 import 'package:unittest/unittest.dart'; |  | 
| 10 import 'test_helper.dart'; |  | 
| 11 |  | 
| 12 class Foo { |  | 
| 13   Object left; |  | 
| 14   Object right; |  | 
| 15 } |  | 
| 16 Foo r; |  | 
| 17 |  | 
| 18 List lst; |  | 
| 19 |  | 
| 20 void script() { |  | 
| 21   // Create 3 instances of Foo, with out-degrees |  | 
| 22   // 0 (for b), 1 (for a), and 2 (for staticFoo). |  | 
| 23   r = new Foo(); |  | 
| 24   var a = new Foo(); |  | 
| 25   var b = new Foo(); |  | 
| 26   r.left = a; |  | 
| 27   r.right = b; |  | 
| 28   a.left = b; |  | 
| 29 |  | 
| 30   lst = new List(2); |  | 
| 31   lst[0] = lst;  // Self-loop. |  | 
| 32   // Larger than any other fixed-size list in a fresh heap. |  | 
| 33   lst[1] = new List(123456); |  | 
| 34 } |  | 
| 35 |  | 
| 36 int fooId; |  | 
| 37 |  | 
| 38 var tests = [ |  | 
| 39 |  | 
| 40 (Isolate isolate) { |  | 
| 41   Completer completer = new Completer(); |  | 
| 42   isolate.vm.events.stream.listen((ServiceEvent event) { |  | 
| 43     if (event.eventType == ServiceEvent.kGraph) { |  | 
| 44       ReadStream reader = new ReadStream(event.data); |  | 
| 45       ObjectGraph graph = new ObjectGraph(reader); |  | 
| 46       expect(fooId, isNotNull); |  | 
| 47       Iterable<ObjectVertex> foos = graph.vertices.where( |  | 
| 48           (ObjectVertex obj) => obj.classId == fooId); |  | 
| 49       expect(foos.length, equals(3)); |  | 
| 50       expect(foos.where( |  | 
| 51           (ObjectVertex obj) => obj.succ.length == 0).length, equals(1)); |  | 
| 52       expect(foos.where( |  | 
| 53           (ObjectVertex obj) => obj.succ.length == 1).length, equals(1)); |  | 
| 54       expect(foos.where( |  | 
| 55           (ObjectVertex obj) => obj.succ.length == 2).length, equals(1)); |  | 
| 56 |  | 
| 57       ObjectVertex bVertex = foos.where( |  | 
| 58           (ObjectVertex obj) => obj.succ.length == 0).first; |  | 
| 59       ObjectVertex aVertex = foos.where( |  | 
| 60           (ObjectVertex obj) => obj.succ.length == 1).first; |  | 
| 61       ObjectVertex rVertex = foos.where( |  | 
| 62           (ObjectVertex obj) => obj.succ.length == 2).first; |  | 
| 63 |  | 
| 64       // TODO(koda): Check actual byte sizes. |  | 
| 65 |  | 
| 66       expect(aVertex.retainedSize, equals(aVertex.shallowSize)); |  | 
| 67       expect(bVertex.retainedSize, equals(bVertex.shallowSize)); |  | 
| 68       expect(rVertex.retainedSize, equals(aVertex.shallowSize + |  | 
| 69                                           bVertex.shallowSize + |  | 
| 70                                           rVertex.shallowSize)); |  | 
| 71 |  | 
| 72       const int fixedSizeListCid = 61; |  | 
| 73       List<ObjectVertex> lists = new List.from(graph.vertices.where( |  | 
| 74           (ObjectVertex obj) => obj.classId == fixedSizeListCid)); |  | 
| 75       expect(lists.length >= 2, isTrue); |  | 
| 76       // Order by decreasing retained size. |  | 
| 77       lists.sort((u, v) => v.retainedSize - u.retainedSize); |  | 
| 78       ObjectVertex first = lists[0]; |  | 
| 79       ObjectVertex second = lists[1]; |  | 
| 80       // Check that the short list retains more than the long list inside. |  | 
| 81       expect(first.succ.length, equals(2 + second.succ.length)); |  | 
| 82       // ... and specifically, that it retains exactly itself + the long one. |  | 
| 83       expect(first.retainedSize, |  | 
| 84           equals(first.shallowSize + second.shallowSize)); |  | 
| 85       completer.complete(); |  | 
| 86     } |  | 
| 87   }); |  | 
| 88   return isolate.rootLib.load().then((Library lib) { |  | 
| 89     expect(lib.classes.length, equals(1)); |  | 
| 90     Class fooClass = lib.classes.first; |  | 
| 91     fooId = fooClass.vmCid; |  | 
| 92     isolate.invokeRpcNoUpgrade('requestHeapSnapshot', {}); |  | 
| 93     return completer.future; |  | 
| 94   }); |  | 
| 95 }, |  | 
| 96 |  | 
| 97 ]; |  | 
| 98 |  | 
| 99 main(args) => runIsolateTests(args, tests, testeeBefore: script); |  | 
| OLD | NEW | 
|---|