| // 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. |
| |
| // spawns multiple isolates and sends unresolved ports between them. |
| library unresolved_ports; |
| import 'dart:isolate'; |
| import '../../pkg/unittest/lib/unittest.dart'; |
| |
| // This test does the following: |
| // - main spawns two isolates: 'tim' and 'beth' |
| // - 'tim' spawns an isolate: 'bob' |
| // - main starts a message chain: |
| // main -> beth -> tim -> bob -> main |
| // by giving 'beth' a send-port to 'tim'. |
| |
| bethIsolate() { |
| // TODO(sigmund): use expectAsync2 when it is OK to use it within an isolate |
| // (issue #6856) |
| port.receive((msg, reply) => msg[1].send( |
| '${msg[0]}\nBeth says: Tim are you coming? And Bob?', reply)); |
| } |
| |
| timIsolate() { |
| SendPort bob = spawnFunction(bobIsolate); |
| port.receive((msg, reply) => bob.send( |
| '$msg\nTim says: Can you tell "main" that we are all coming?', reply)); |
| } |
| |
| bobIsolate() { |
| port.receive((msg, reply) => reply.send( |
| '$msg\nBob says: we are all coming!')); |
| } |
| |
| baseTest({bool failForNegativeTest: false}) { |
| test('Message chain with unresolved ports', () { |
| ReceivePort port = new ReceivePort(); |
| port.receive(expectAsync2((msg, _) { |
| expect(msg, equals('main says: Beth, find out if Tim is coming.' |
| '\nBeth says: Tim are you coming? And Bob?' |
| '\nTim says: Can you tell "main" that we are all coming?' |
| '\nBob says: we are all coming!')); |
| expect(failForNegativeTest, isFalse); |
| port.close(); |
| })); |
| |
| SendPort tim = spawnFunction(timIsolate); |
| SendPort beth = spawnFunction(bethIsolate); |
| |
| beth.send( |
| // because tim is created asynchronously, here we are sending an |
| // unresolved port: |
| ['main says: Beth, find out if Tim is coming.', tim], |
| port.toSendPort()); |
| }); |
| } |
| |
| main() => baseTest(); |