| // Copyright 2024 The Flutter Authors. 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:async'; |
| import 'dart:ffi'; |
| import 'dart:isolate'; |
| import 'dart:ui'; |
| |
| import 'package:litetest/litetest.dart'; |
| |
| void main() { |
| test('PlatformIsolate runOnPlatformThread, cancels pending jobs if shutdown', () async { |
| final Future<int> slowTask = runOnPlatformThread(() async { |
| await Future<void>.delayed(const Duration(seconds: 10)); |
| return 123; |
| }); |
| |
| await runOnPlatformThread(() { |
| _forceShutdownIsolate(); |
| Future<void>(() => Isolate.exit()); |
| }); |
| |
| bool throws = false; |
| try { |
| await slowTask; |
| } catch (error) { |
| expect(error.toString(), contains('PlatformIsolate shutdown unexpectedly')); |
| throws = true; |
| } |
| expect(throws, true); |
| |
| // Platform isolate automatically restarts. |
| final int result = await runOnPlatformThread(() => 123); |
| expect(result, 123); |
| }); |
| } |
| |
| @Native<Void Function()>(symbol: 'ForceShutdownIsolate') |
| external void _forceShutdownIsolate(); |