Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1077)

Unified Diff: tests/isolate/isolate_current_test.dart

Issue 771993003: Add Isolate.current getter, returning the current isolate as an Isolate object. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Add test Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sdk/lib/isolate/isolate.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
+}
« no previous file with comments | « sdk/lib/isolate/isolate.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698