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