|  | // 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. | 
|  |  | 
|  | // VMOptions=--enable-isolate-groups | 
|  | // VMOptions=--no-enable-isolate-groups | 
|  |  | 
|  | import 'dart:isolate'; | 
|  | import "package:expect/expect.dart"; | 
|  | import 'package:async_helper/async_helper.dart'; | 
|  |  | 
|  | class FromMainIsolate { | 
|  | String toString() => 'from main isolate'; | 
|  | int get fld => 10; | 
|  | } | 
|  |  | 
|  | func1Child(args) { | 
|  | var receivePort = new ReceivePort(); | 
|  | var sendPort = args[0]; | 
|  | sendPort.send(receivePort.sendPort); | 
|  | receivePort.listen((msg) { | 
|  | Expect.isTrue(msg is FromMainIsolate); | 
|  | Expect.equals(10, msg.fld); | 
|  | receivePort.close(); | 
|  | sendPort.send("done"); | 
|  | }, onError: (e) => print('$e')); | 
|  | } | 
|  |  | 
|  | func2Child(args) { | 
|  | var receivePort = new ReceivePort(); | 
|  | var sendPort = args[0]; | 
|  | sendPort.send(receivePort.sendPort); | 
|  | receivePort.listen((msg) { | 
|  | Expect.isTrue(msg is SendPort); | 
|  | msg.send(new FromMainIsolate()); | 
|  | receivePort.close(); | 
|  | }, onError: (e) => print('$e')); | 
|  | } | 
|  |  | 
|  | spawnFuncTest() { | 
|  | var receive1 = new ReceivePort(); | 
|  | var receive2 = new ReceivePort(); | 
|  |  | 
|  | var spawnFunctionIsolate1SendPort; | 
|  | var spawnFunctionIsolate2SendPort; | 
|  |  | 
|  | // First spawn the first isolate using spawnFunction, this isolate will | 
|  | // create a receivePort and send it's sendPort back and then it will just | 
|  | // sit there listening for a message from the second isolate spawned | 
|  | // using spawnFunction. | 
|  | asyncStart(); | 
|  | return Isolate.spawn(func1Child, [receive1.sendPort]).then((isolate) { | 
|  | receive1.listen((msg) { | 
|  | if (msg is SendPort) { | 
|  | spawnFunctionIsolate1SendPort = msg; | 
|  |  | 
|  | // Now spawn the second isolate using spawnFunction, this isolate | 
|  | // will create a receivePort and send it's sendPort back and then | 
|  | // wait for the third isolate spawned using spawnUri to send it | 
|  | // a sendPort to which it will try and send a non "literal-like" | 
|  | // object. | 
|  | Isolate.spawn(func2Child, [receive2.sendPort]).then((isolate) { | 
|  | receive2.listen((msg) { | 
|  | spawnFunctionIsolate2SendPort = msg; | 
|  | receive2.close(); | 
|  |  | 
|  | // Now spawn an isolate using spawnUri and send these send | 
|  | // ports over to it. This isolate will send one of the | 
|  | // sendports over to the other. | 
|  | Isolate.spawnUri(Uri.parse('issue_21398_child_isolate1.dart'), [], | 
|  | [spawnFunctionIsolate1SendPort, spawnFunctionIsolate2SendPort]); | 
|  | }, onError: (e) => print('$e')); | 
|  | }); | 
|  | } else if (msg == "done") { | 
|  | receive1.close(); | 
|  | asyncEnd(); | 
|  | } else { | 
|  | Expect.fail("Invalid message received: $msg"); | 
|  | } | 
|  | }, onError: (e) => print('$e')); | 
|  | }); | 
|  | } | 
|  |  | 
|  | uriChild(args) { | 
|  | var receivePort = new ReceivePort(); | 
|  | var sendPort = args[0]; | 
|  | sendPort.send(receivePort.sendPort); | 
|  | receivePort.listen((msg) { | 
|  | Expect.isTrue(msg is String); | 
|  | Expect.equals("Invalid Argument(s).", msg); | 
|  | receivePort.close(); | 
|  | sendPort.send("done"); | 
|  | }, onError: (e) => print('$e')); | 
|  | } | 
|  |  | 
|  | spawnUriTest() { | 
|  | var receive1 = new ReceivePort(); | 
|  | var receive2 = new ReceivePort(); | 
|  |  | 
|  | var spawnFunctionIsolateSendPort; | 
|  | var spawnUriIsolateSendPort; | 
|  |  | 
|  | // First spawn the first isolate using spawnFunction, this isolate will | 
|  | // create a receivePort and send it's sendPort back and then it will just | 
|  | // sit there listening for a message from the second isolate spawned | 
|  | // using spawnFunction. | 
|  | asyncStart(); | 
|  | Isolate.spawn(uriChild, [receive1.sendPort]).then((isolate) { | 
|  | receive1.listen((msg) { | 
|  | if (msg is SendPort) { | 
|  | spawnFunctionIsolateSendPort = msg; | 
|  |  | 
|  | // Now spawn the second isolate using spawnUri, this isolate | 
|  | // will create a receivePort and send it's sendPort back and then | 
|  | // wait for the third isolate spawned using spawnUri to send it | 
|  | // a sendPort to which it will try and send a non "literal-like" | 
|  | // object. | 
|  | Isolate.spawnUri(Uri.parse('issue_21398_child_isolate11.dart'), [], | 
|  | receive2.sendPort) | 
|  | .then((isolate) { | 
|  | receive2.listen((msg) { | 
|  | spawnUriIsolateSendPort = msg; | 
|  | receive2.close(); | 
|  |  | 
|  | // Now spawn an isolate using spawnUri and send these send | 
|  | // ports over to it. This isolate will send one of the | 
|  | // sendports over to the other. | 
|  | Isolate.spawnUri(Uri.parse('issue_21398_child_isolate1.dart'), [], | 
|  | [spawnFunctionIsolateSendPort, spawnUriIsolateSendPort]); | 
|  | }, onError: (e) => print('$e')); | 
|  | }); | 
|  | } else if (msg == "done") { | 
|  | receive1.close(); | 
|  | asyncEnd(); | 
|  | } else { | 
|  | Expect.fail("Invalid message received: $msg"); | 
|  | } | 
|  | }, onError: (e) => print('$e')); | 
|  | }); | 
|  | } | 
|  |  | 
|  | main() { | 
|  | spawnFuncTest(); | 
|  | spawnUriTest(); | 
|  | } |