Index: tests/standalone/code_collection_test.dart |
=================================================================== |
--- tests/standalone/code_collection_test.dart (revision 0) |
+++ tests/standalone/code_collection_test.dart (revision 0) |
@@ -0,0 +1,68 @@ |
+// Copyright (c) 2013, 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. |
+ |
+// Dart test program testing code GC. |
+ |
+import "package:expect/expect.dart"; |
+import "dart:async"; |
+import "dart:io"; |
+ |
+ |
+int foo(int x) { |
+ x = x + 1; |
+ return x; |
+} |
+ |
+ |
+List<int> bar() { |
+ // A couple of big allocations trigger GC. |
+ var l = new List.filled(700000, 7); |
+ return l; |
+} |
+ |
+ |
+doTest() { |
+ var i = 0; |
+ foo(1); // Initial call to compile. |
+ // Time passes, GC runs, foo's code is dropped. |
+ var ms = const Duration(milliseconds: 100); |
+ var t = new Timer.periodic(ms, (timer) { |
+ i++; |
+ bar(); |
+ if (i > 1) { |
+ timer.cancel(); |
+ // foo is called again to make sure we can still run it even after |
+ // its code has been detached. |
+ foo(2); |
+ } |
+ }); |
+} |
+ |
+ |
+main() { |
+ var opts = new Options(); |
+ if (opts.arguments.contains("--run")) { |
+ doTest(); |
+ } else { |
+ // Run the test and capture stdout. |
+ var pr = Process.runSync(Platform.executable, |
+ ["--collect-code", |
+ "--code-collection-interval-in-us=100000", |
+ "--log-code-drop", |
+ "--optimization-counter-threshold=-1", |
+ "--package-root=${Platform.packageRoot}", |
+ Platform.script, |
+ "--run"]); |
+ |
+ // Code drops are logged with --log-code-drop. Look through stdout for the |
+ // message that foo's code was dropped. |
+ var found = false; |
+ pr.stdout.split("\n").forEach((line) { |
+ if (line.contains("Detaching code") && line.contains("foo")) { |
+ found = true; |
+ } |
+ }); |
+ Expect.isTrue(found); |
+ } |
+} |