blob: b7f2669d42930d8e0c031de5dfd8cef2780a5df2 [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.
// This test compiles itself with gen_kernel and invokes the compiled kernel
// file with `Process.run(dart, <...>)` and `Isolate.spawn` and
// `Isolate.spawnUri`.
//
// This tests test including a native asset mapping that looks up its symbols
// in the executable.
// OtherResources=asset_executable_test.dart
// OtherResources=helpers.dart
// ignore_for_file: deprecated_member_use
import 'dart:async';
import 'dart:ffi';
import 'dart:io';
import 'dart:isolate';
import 'package:expect/expect.dart';
import 'helpers.dart';
const runTestsArg = 'run-tests';
main(List<String> args, Object? message) async {
return await selfInvokingTest(
doOnOuterInvocation: selfInvokes,
doOnProcessInvocation: () async {
await runTests();
await testIsolateSpawn(runTests);
await testIsolateSpawnUri(spawnUri: Platform.script, arguments: args);
},
doOnSpawnUriInvocation: () async {
await runTests();
await testIsolateSpawn(runTests);
},
)(args, message);
}
Future<void> selfInvokes() async {
final selfSourceUri = Platform.script.resolve('asset_executable_test.dart');
final nativeAssetsYaml = createNativeAssetYaml(
asset: selfSourceUri.toString(), assetMapping: ['executable']);
await invokeSelf(
selfSourceUri: selfSourceUri,
runtime: Runtime.jit,
arguments: [runTestsArg],
nativeAssetsYaml: nativeAssetsYaml,
);
await invokeSelf(
selfSourceUri: selfSourceUri,
runtime: Runtime.aot,
arguments: [runTestsArg],
nativeAssetsYaml: nativeAssetsYaml,
);
}
Future<void> runTests() async {
await testExecutable();
testNonExistingFunction();
}
typedef _PostInteger = Bool Function(Int64 port, Int64 message);
@Native<_PostInteger>()
external bool Dart_PostInteger(int port, int message);
Future<void> testExecutable() async {
await _testWith(Dart_PostInteger);
final viaAddressOf =
Native.addressOf<NativeFunction<_PostInteger>>(Dart_PostInteger);
await _testWith(viaAddressOf.asFunction());
}
Future<void> _testWith(bool Function(int, int) postInteger) async {
const int message = 1337 * 42;
final completer = Completer();
final receivePort = ReceivePort()
..listen((receivedMessage) => completer.complete(receivedMessage));
final bool success = postInteger(receivePort.sendPort.nativePort, message);
Expect.isTrue(success);
final postedMessage = await completer.future;
Expect.equals(message, postedMessage);
receivePort.close();
}