blob: b8c6a5fe0ca245eec26a2d9732a3e5b94f369d31 [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();
}