| // 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. |
| |
| import 'dart:async'; |
| import 'package:observatory_2/service_io.dart'; |
| import 'package:test/test.dart'; |
| import 'test_helper.dart'; |
| import 'service_test_common.dart'; |
| |
| class Pair { |
| // Make sure these fields are not removed by the tree shaker. |
| @pragma("vm:entry-point") // Prevent obfuscation |
| var x; |
| @pragma("vm:entry-point") // Prevent obfuscation |
| var y; |
| } |
| |
| @pragma("vm:entry-point") // Prevent obfuscation |
| var p1; |
| @pragma("vm:entry-point") // Prevent obfuscation |
| var p2; |
| |
| buildGraph() { |
| p1 = new Pair(); |
| p2 = new Pair(); |
| |
| // Adds to both reachable and retained size. |
| p1.x = new List(); |
| p2.x = new List(); |
| |
| // Adds to reachable size only. |
| p1.y = p2.y = new List(); |
| } |
| |
| Future<int> getReachableSize(ServiceObject obj) async { |
| Instance size = await obj.isolate.getReachableSize(obj); |
| return int.parse(size.valueAsString); |
| } |
| |
| Future<int> getRetainedSize(ServiceObject obj) async { |
| Instance size = await obj.isolate.getRetainedSize(obj); |
| return int.parse(size.valueAsString); |
| } |
| |
| var tests = <IsolateTest>[ |
| (Isolate isolate) async { |
| Instance p1 = await rootLibraryFieldValue(isolate, "p1"); |
| Instance p2 = await rootLibraryFieldValue(isolate, "p2"); |
| |
| // In general, shallow <= retained <= reachable. In this program, |
| // 0 < shallow < retained < reachable. |
| |
| int p1_shallow = p1.size; |
| int p1_retained = await getRetainedSize(p1); |
| int p1_reachable = await getReachableSize(p1); |
| |
| expect(0, lessThan(p1_shallow)); |
| expect(p1_shallow, lessThan(p1_retained)); |
| expect(p1_retained, lessThan(p1_reachable)); |
| |
| int p2_shallow = p2.size; |
| int p2_retained = await getRetainedSize(p2); |
| int p2_reachable = await getReachableSize(p2); |
| |
| expect(0, lessThan(p2_shallow)); |
| expect(p2_shallow, lessThan(p2_retained)); |
| expect(p2_retained, lessThan(p2_reachable)); |
| |
| expect(p1_shallow, equals(p2_shallow)); |
| expect(p1_retained, equals(p2_retained)); |
| expect(p1_reachable, equals(p2_reachable)); |
| }, |
| ]; |
| |
| main(args) => runIsolateTests(args, tests, testeeBefore: buildGraph); |