blob: 8a4959883b564a2b32c572fa2a4adcf00e0261bc [file] [log] [blame]
// Copyright (c) 2021, 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.
//
// Checks that Kill message (generated for example by Isolate.exit) prevents
// any more dart code being executed - in particular when dart code with
// Isolate.exit() is invoked from native code, which in turns is invoked
// from dart code(hence "sandwich"-test).
import 'dart:async';
import 'dart:ffi';
import 'dart:io';
import 'dart:isolate';
import "package:expect/expect.dart";
import '../../../../tests/ffi/dylib_utils.dart';
final ffiTestFunctions = dlopenPlatformSpecific('ffi_test_functions');
final lookupAndCallWorkerThatCallsIsolateExit =
ffiTestFunctions.lookupFunction<Void Function(Int64), void Function(int)>(
'IsolateExitTest_LookupAndCallIsolateExit');
@pragma('vm:entry-point')
void recurseLookupAndCallWorker(int i) {
lookupAndCallWorkerThatCallsIsolateExit(i);
print(
'coming back after $i invocation of lookupAndCallWorkerThatCallsIsolateExit');
assert(false);
}
// This method is looked up and called by ffi method that ignores unwinding
// error raised by 'Isolate.exit'.
@pragma('vm:entry-point')
Never callIsolateExit() {
Isolate.exit();
}
main(List<String> args) async {
if (args.length > 0) {
lookupAndCallWorkerThatCallsIsolateExit(4);
print('got back');
return;
}
ProcessResult result = await Process.run(
Platform.executable, <String>[Platform.script.toString(), 'worker']);
Expect.isTrue(result.exitCode != 0);
// The child process should be terminated before it had a chance
// to print "got back".
Expect.isFalse(result.stdout.contains('got back'));
}