| // Copyright (c) 2012, 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 = 2.9 |
| |
| // Dart test program for testing that isolates can communicate to isolates |
| // other than the main isolate. |
| |
| library CrossIsolateMessageTest; |
| |
| import 'dart:isolate'; |
| import 'package:async_helper/async_helper.dart'; |
| import 'package:expect/expect.dart'; |
| |
| /* |
| * Everything starts in the main-isolate (in the main-method). |
| * The main isolate spawns two isolates: isolate1 (with entry point |
| * 'crossIsolate1') and isolate2 (with entry point 'crossIsolate2'). |
| * |
| * The main isolate creates two isolates, isolate1 and isolate2. |
| * The second isolate is created with a send-port being listened on by |
| * isolate1. A message is passed along this from isolate2 to isolate1. |
| * Isolate1 then sends the result back to the main isolate for final checking. |
| */ |
| |
| void crossIsolate1(SendPort mainIsolate) { |
| ReceivePort local = new ReceivePort(); |
| mainIsolate.send(["ready1", local.sendPort]); |
| local.first.then((msg) { |
| // Message from crossIsolate2 |
| Expect.equals(msg[0], "fromIsolate2"); |
| mainIsolate.send(["fromIsolate1", msg[1] + 58]); // 100. |
| }); |
| } |
| |
| void crossIsolate2(SendPort toIsolate1) { |
| toIsolate1.send(["fromIsolate2", 42]); |
| } |
| |
| void main([args, port]) { |
| ReceivePort fromIsolate1 = new ReceivePort(); |
| Isolate.spawn(crossIsolate1, fromIsolate1.sendPort); |
| |
| asyncStart(); |
| fromIsolate1.listen((msg) { |
| switch (msg[0]) { |
| case "ready1": |
| SendPort toIsolate1 = msg[1]; |
| Isolate.spawn(crossIsolate2, toIsolate1); |
| break; |
| case "fromIsolate1": |
| Expect.equals(msg[1], 100); |
| fromIsolate1.close(); |
| break; |
| default: |
| Expect.fail("unreachable! Tag: ${msg[0]}"); |
| } |
| }, onDone: asyncEnd); |
| } |