Index: tests/isolate/isolate_current_test.dart |
diff --git a/tests/isolate/isolate_current_test.dart b/tests/isolate/isolate_current_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..671dca44fa6de2200a2e27a6fb3da4ca2f015e1e |
--- /dev/null |
+++ b/tests/isolate/isolate_current_test.dart |
@@ -0,0 +1,135 @@ |
+// Copyright (c) 2014, 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. |
+ |
+library isolate_current_test; |
+import "dart:isolate"; |
+import "dart:async"; |
+import "package:expect/expect.dart"; |
+import "package:async_helper/async_helper.dart"; |
+ |
+void main() { |
+ asyncStart(); |
+ |
+ Expect.isNotNull(Isolate.current); |
+ |
+ // Sending controlPort and capabilities as list. |
+ testSend(i2l, l2i); |
+ testSpawnReturnVsCurrent(true); |
+ testSpawnReturnVsCurrent2(true); |
+ |
+ // Sending Isolate itself. |
+ testSend(id, id); |
+ testSpawnReturnVsCurrent(false); |
+ testSpawnReturnVsCurrent2(false); |
+ |
+ asyncEnd(); |
+} |
+ |
+/** Test sending the isolate data or isolate through a [SendPort]. */ |
+void testSend(i2l, l2i) { |
+ asyncStart(); |
+ RawReceivePort p = new RawReceivePort(); |
+ Isolate isolate = Isolate.current; |
+ p.handler = (list) { |
+ var isolate2 = l2i(list); |
+ Expect.equals(isolate.controlPort, isolate2.controlPort); |
+ Expect.equals(isolate.pauseCapability, isolate2.pauseCapability); |
+ Expect.equals(isolate.terminateCapability, isolate2.terminateCapability); |
+ p.close(); |
+ asyncEnd(); |
+ }; |
+ p.sendPort.send(i2l(isolate)); |
+} |
+ |
+/** |
+ * Test that the isolate returned by [Isolate.spawn] is the same as |
+ * the one returned by [Isolate.current] in the spawned isolate. |
+ * Checked in the spawning isolate. |
+ */ |
+void testSpawnReturnVsCurrent(bool asList) { |
+ asyncStart(); |
+ Function transform = asList ? l2i : id; |
+ Completer response = new Completer(); |
+ var p = new RawReceivePort(); |
+ p.handler = (v) { |
+ response.complete(transform(v)); |
+ p.close(); |
+ }; |
+ |
+ Isolate.spawn(replyCurrent, [p.sendPort, asList]).then((Isolate isolate) { |
+ return response.future.then((Isolate isolate2) { |
+ expectIsolateEquals(isolate, isolate2); |
+ asyncEnd(); |
+ }); |
+ }); |
+} |
+ |
+void replyCurrent(args) { |
+ SendPort responsePort = args[0]; |
+ Function transform = args[1] ? i2l : id; |
+ responsePort.send(transform(Isolate.current)); |
+} |
+ |
+/** |
+ * Test that the isolate returned by [Isolate.spawn] is the same as |
+ * the one returned by [Isolate.current] in the spawned isolate. |
+ * Checked in the spawned isolate. |
+ */ |
+void testSpawnReturnVsCurrent2(bool asList) { |
+ asyncStart(); |
+ Function transform = asList ? i2l : id; |
+ |
+ Completer response = new Completer(); |
+ var p = new RawReceivePort(); |
+ int state = 0; |
+ p.handler = (v) { |
+ switch (state) { |
+ case 0: |
+ response.complete(v); |
+ state++; |
+ break; |
+ case 1: |
+ p.close(); |
+ Expect.isTrue(v); |
+ asyncEnd(); |
+ } |
+ }; |
+ |
+ Isolate.spawn(expectCurrent, [p.sendPort, asList]).then((Isolate isolate) { |
+ return response.future.then((SendPort port) { |
+ port.send(transform(isolate)); |
+ }); |
+ }); |
+} |
+ |
+void expectCurrent(args) { |
+ SendPort responsePort = args[0]; |
+ Function transform = args[1] ? l2i : id; |
+ RawReceivePort port = new RawReceivePort(); |
+ port.handler = (isoData) { |
+ Isolate isolate2 = transform(isoData); |
+ port.close(); |
+ Isolate isolate = Isolate.current; |
+ expectIsolateEquals(isolate, isolate2); |
+ responsePort.send(true); |
+ }; |
+ responsePort.send(port.sendPort); |
+} |
+ |
+/** Convert isolate to list (of control port and capabilities). */ |
+i2l(Isolate isolate) => [isolate.controlPort, |
+ isolate.pauseCapability, |
+ isolate.terminateCapability]; |
+/** Convert list to isolate. */ |
+l2i(List list) => new Isolate(list[0], pauseCapability: list[1], |
+ terminateCapability: list[2]); |
+ |
+/** Identity transformation. */ |
+id(Isolate isolate) => isolate; |
+ |
+void expectIsolateEquals(Isolate expect, Isolate actual) { |
+ Expect.equals(expect.controlPort, actual.controlPort); |
+ Expect.equals(expect.pauseCapability, actual.pauseCapability); |
+ Expect.equals(expect.terminateCapability, actual.terminateCapability); |
+} |