blob: 78583c663280847af5b165492d00a98d566ef1f4 [file] [log] [blame]
// Copyright (c) 2023, 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.
//
import 'dart:isolate';
import 'package:expect/async_helper.dart';
import 'package:expect/expect.dart';
@pragma('vm:isolate-unsendable')
class Locked {}
class ExtendsLocked extends Locked {}
class ImplementsLocked implements Locked {}
main() async {
asyncStart();
final rpExit = ReceivePort();
final rpError = RawReceivePort((e) {
Expect.fail('Spawned isolated failed with $e');
});
final rp = RawReceivePort((e) {
Expect.fail('Received unexpected $e, no objects should have arrived');
});
await Isolate.spawn((sendPort) {
for (final pairFunctionName in [
[Locked.new, "Locked"],
[ExtendsLocked.new, "ExtendsLocked"],
[ImplementsLocked.new, "ImplementsLocked"]
]) {
Expect.throws(() {
Isolate.exit(sendPort, (pairFunctionName[0] as Function)());
}, (e) {
return e is ArgumentError &&
e
.toString()
.contains(RegExp("unsendable object .+${pairFunctionName[1]}"));
});
}
}, rp.sendPort, onError: rpError.sendPort, onExit: rpExit.sendPort);
await rpExit.first;
rpError.close();
rp.close();
asyncEnd();
}