| // 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:async'; |
| import 'dart:isolate'; |
| import 'package:unittest/unittest.dart'; |
| import "remote_unittest_helper.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(init) { |
| ReceivePort port = initIsolate(init); |
| // TODO(sigmund): use expectAsync when it is OK to use it within an isolate |
| // (issue #6856) |
| port.first.then((msg) => msg[1] |
| .send(['${msg[0]}\nBeth says: Tim are you coming? And Bob?', msg[2]])); |
| } |
| |
| timIsolate(init) { |
| ReceivePort port = initIsolate(init); |
| spawnFunction(bobIsolate).then((bob) { |
| port.first.then((msg) => bob.send([ |
| '${msg[0]}\nTim says: Can you tell "main" that we are all coming?', |
| msg[1] |
| ])); |
| }); |
| } |
| |
| bobIsolate(init) { |
| ReceivePort port = initIsolate(init); |
| port.first |
| .then((msg) => msg[1].send('${msg[0]}\nBob says: we are all coming!')); |
| } |
| |
| Future spawnFunction(function) { |
| ReceivePort init = new ReceivePort(); |
| Isolate.spawn(function, init.sendPort); |
| return init.first; |
| } |
| |
| ReceivePort initIsolate(SendPort starter) { |
| ReceivePort port = new ReceivePort(); |
| starter.send(port.sendPort); |
| return port; |
| } |
| |
| baseTest({bool failForNegativeTest: false}) { |
| test('Message chain with unresolved ports', () { |
| ReceivePort port = new ReceivePort(); |
| port.listen(expectAsync((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(); |
| })); |
| |
| spawnFunction(timIsolate).then((tim) { |
| spawnFunction(bethIsolate).then((beth) { |
| beth.send([ |
| 'main says: Beth, find out if Tim is coming.', |
| tim, |
| port.sendPort |
| ]); |
| }); |
| }); |
| }); |
| } |
| |
| void main([args, port]) { |
| if (testRemote(main, port)) return; |
| baseTest(); |
| } |