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