blob: 107200030ff41d2f70e63d51001fb898f5aab2b3 [file] [log] [blame]
// 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();