| // 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(); |
| } |