mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 01:21:07 +00:00
5c723e996e
Bug: https://github.com/dart-lang/sdk/issues/49083 Change-Id: I9643fe54e46042021146a19e6ec1c1d967cd6496 Fixes: https://github.com/dart-lang/sdk/issues/49083 CoreLibraryReviewExempt: The isolate and FFI packages are VM-only TEST=raw_port_test.dart and async_void_function_callbacks_test.dart Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/314360 Commit-Queue: Liam Appelbe <liama@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com>
122 lines
3.1 KiB
Dart
122 lines
3.1 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.
|
|
|
|
// Test RawReceivePort.
|
|
|
|
library raw_port_test;
|
|
|
|
import 'dart:async';
|
|
import 'dart:isolate';
|
|
import 'package:async_helper/async_helper.dart';
|
|
import 'package:expect/expect.dart';
|
|
|
|
void remote(SendPort port) {
|
|
port.send("reply");
|
|
}
|
|
|
|
void remote2(SendPort port) {
|
|
port.send("reply 1");
|
|
port.send("reply 2");
|
|
}
|
|
|
|
main([args, port]) async {
|
|
// Raw receive
|
|
asyncTest(() {
|
|
final completer = Completer<void>();
|
|
RawReceivePort port = new RawReceivePort();
|
|
Isolate.spawn(remote, port.sendPort);
|
|
port.handler = (v) {
|
|
Expect.equals(v, "reply");
|
|
port.close();
|
|
completer.complete();
|
|
};
|
|
return completer.future;
|
|
});
|
|
|
|
// Raw receive hashCode
|
|
{
|
|
RawReceivePort port = new RawReceivePort();
|
|
Expect.isTrue(port.hashCode is int);
|
|
port.close();
|
|
}
|
|
|
|
// Raw receive twice - change handler
|
|
asyncTest(() {
|
|
final completer = Completer<void>();
|
|
RawReceivePort port = new RawReceivePort();
|
|
Isolate.spawn(remote2, port.sendPort);
|
|
port.handler = (v) {
|
|
Expect.equals(v, "reply 1");
|
|
port.handler = (v) {
|
|
Expect.equals(v, "reply 2");
|
|
port.close();
|
|
completer.complete();
|
|
};
|
|
};
|
|
return completer.future;
|
|
});
|
|
|
|
// From raw port
|
|
asyncTest(() {
|
|
final completer = Completer<void>();
|
|
RawReceivePort rawPort = new RawReceivePort();
|
|
Isolate.spawn(remote, rawPort.sendPort);
|
|
rawPort.handler = (v) {
|
|
Expect.equals(v, "reply");
|
|
ReceivePort port = new ReceivePort.fromRawReceivePort(rawPort);
|
|
Isolate.spawn(remote, rawPort.sendPort);
|
|
Isolate.spawn(remote, port.sendPort);
|
|
int ctr = 2;
|
|
port.listen(
|
|
(v) {
|
|
Expect.equals(v, "reply");
|
|
ctr--;
|
|
if (ctr == 0) port.close();
|
|
},
|
|
onDone: () => completer.complete(),
|
|
);
|
|
};
|
|
return completer.future;
|
|
});
|
|
|
|
// keepIsolateAlive = false
|
|
asyncTest(() async {
|
|
final parentPort = ReceivePort();
|
|
final onExit = ReceivePort();
|
|
|
|
final parentSendPort = parentPort.sendPort;
|
|
await Isolate.spawn((_) async {
|
|
final weakPort = RawReceivePort();
|
|
parentSendPort.send(weakPort.sendPort);
|
|
weakPort.handler = (message) {
|
|
weakPort.keepIsolateAlive = false;
|
|
parentSendPort.send(1000 + message);
|
|
};
|
|
}, null, onExit: onExit.sendPort);
|
|
|
|
final si = StreamIterator(parentPort);
|
|
|
|
Expect.isTrue(await si.moveNext());
|
|
final childPort = si.current as SendPort;
|
|
childPort.send(234);
|
|
|
|
Expect.isTrue(await si.moveNext());
|
|
Expect.equals(si.current, 1234);
|
|
|
|
await si.cancel();
|
|
await onExit.first;
|
|
});
|
|
|
|
// keepIsolateAlive getter
|
|
asyncTest(() async {
|
|
final port = RawReceivePort();
|
|
Expect.isTrue(port.keepIsolateAlive);
|
|
port.keepIsolateAlive = false;
|
|
Expect.isFalse(port.keepIsolateAlive);
|
|
port.keepIsolateAlive = true;
|
|
Expect.isTrue(port.keepIsolateAlive);
|
|
port.close();
|
|
});
|
|
}
|