6b3abe0a98
Issue b/177800357. TEST=existing test suite Change-Id: Id6b113932ab7014b8fa6c105845c5c490b60f5e8 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/181320 Commit-Queue: Alexander Aprelev <aam@google.com> Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
84 lines
2.4 KiB
Dart
84 lines
2.4 KiB
Dart
// 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.
|
|
|
|
// VMOptions=--enable-isolate-groups --experimental-enable-isolate-groups-jit
|
|
// VMOptions=--no-enable-isolate-groups
|
|
|
|
// spawns multiple isolates and sends unresolved ports between them.
|
|
library unresolved_ports;
|
|
|
|
import 'dart:async';
|
|
import 'dart:isolate';
|
|
import 'package:async_helper/async_helper.dart';
|
|
import 'package:expect/expect.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}) {
|
|
// Message chain with unresolved ports
|
|
ReceivePort port = new ReceivePort();
|
|
asyncStart();
|
|
port.listen((msg) {
|
|
Expect.equals(
|
|
msg,
|
|
'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.isFalse(failForNegativeTest);
|
|
port.close();
|
|
asyncEnd();
|
|
});
|
|
|
|
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]) => baseTest();
|