// Copyright (c) 2020, 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.

// @dart = 2.9
import 'dart:io';

import 'package:expect/expect.dart';
import 'package:path/path.dart' as path;

final _execSuffix = Platform.isWindows ? '.exe' : '';
final _batchSuffix = Platform.isWindows ? '.bat' : '';

main() {
  final buildDir = path.dirname(Platform.executable);
  final sdkDir = path.dirname(path.dirname(buildDir));
  final platformDill = path.join(buildDir, 'vm_platform_strong.dill');
  final genKernel =
      path.join(sdkDir, 'pkg', 'vm', 'tool', 'gen_kernel$_batchSuffix');
  Expect.isTrue(File(genKernel).existsSync(),
      "Can't locate gen_kernel$_batchSuffix on this platform");
  // Currently gen_snapshot is only in buildDir/clang_x64 on Mac ARM64.
  final genSnapshot = Platform.isMacOS && buildDir.endsWith('XARM64')
      ? path.join(buildDir, 'clang_x64', 'gen_snapshot$_execSuffix')
      : path.join(buildDir, 'gen_snapshot$_execSuffix');
  Expect.isTrue(File(genSnapshot).existsSync(),
      "Can't locate gen_snapshot$_execSuffix on this platform");

  final exePath = path.join(buildDir, 'dart$_execSuffix');
  Expect.isTrue(File(exePath).existsSync(),
      "Can't locate dart$_execSuffix on this platform");
  final powTest = path.join(sdkDir, 'tests', 'standalone_2', 'pow_test.dart');
  Expect.isTrue(File(powTest).existsSync(),
      "Can't locate dart$_execSuffix on this platform");
  final d = Directory.systemTemp.createTempSync('aot_tmp');
  final kernelOutput = d.uri.resolve('pow_test.dill').path;
  final aotOutput = d.uri.resolve('pow_test.aot').path;

  final genKernelResult = runAndPrintOutput(
    genKernel,
    [
      '--aot',
      '--platform=$platformDill',
      '-o',
      kernelOutput,
      powTest,
    ],
  );
  Expect.equals(genKernelResult.exitCode, 0);
  print("Ran successfully.\n");

  final genAotResult = runAndPrintOutput(
    genSnapshot,
    [
      '--snapshot_kind=app-aot-elf',
      '--elf=$aotOutput',
      kernelOutput,
    ],
  );
  Expect.equals(genAotResult.exitCode, 0);
  print("Ran successfully.\n");

  final runAotDirectlyResult = runAndPrintOutput(
    exePath,
    [
      aotOutput,
    ],
  );
  Expect.equals(runAotDirectlyResult.exitCode, 255);
  Expect.contains(
      "pow_test.aot is an AOT snapshot and should be run with 'dartaotruntime'",
      runAotDirectlyResult.stderr);
  print('Got expected error result.');

  final runAotUsingCommandResult = runAndPrintOutput(
    exePath,
    [
      'run',
      aotOutput,
    ],
  );
  Expect.equals(runAotUsingCommandResult.exitCode, 255);
  Expect.containsOneOf(<String>[
    "pow_test.aot is an AOT snapshot and should be run with 'dartaotruntime'",
    // If dartdev itself failed, can happen on SIMARM as not enough is built
    // to run it.
    "Failed to start the Dart CLI isolate",
  ], runAotUsingCommandResult.stderr);
  print('Got expected error result.');
}

ProcessResult runAndPrintOutput(String command, List<String> args) {
  print('Running $command ${args.join(' ')}...');
  final result = Process.runSync(command, args);
  if (result.stdout.isNotEmpty) {
    print("stdout: ");
    print(result.stdout);
  }
  if (result.stderr.isNotEmpty) {
    print("stderr: ");
    print(result.stderr);
  }
  return result;
}
